Bug 6846 – std.concurrency and fork/execv

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2011-10-23T14:22:00Z
Last change time
2016-05-09T22:57:49Z
Assigned to
nobody
Creator
jonathansternberg
See also
https://issues.dlang.org/show_bug.cgi?id=14205

Attachments

IDFilenameSummaryContent-TypeSize
1042test.dexample code from descriptiontext/x-dsrc1015

Comments

Comment #0 by jonathansternberg — 2011-10-23T14:22:30Z
Created attachment 1042 example code from description Attached is a sample program that I believe should work, but doesn't. The program is a simple command runner. It runs a maximum of 4 processes at once and each process is just "echo <number>". The command runner uses "spawn" to create a new thread. This thread then immediately forks and calls execv in the child. The parent then waits on the newly created process. When it finishes, it sends it's tid and the exit status of the command. When run, sometimes a thread will seem to stall on the execv call. It seems that the fork happened successfully, but a quick check with "ps" will reveal that two processes named "test" exist (the forked one should have been replaced). The program then has no way to continue by itself. The only way to make it continue is to call "kill" on the newly created processes.
Comment #1 by dfj1esp02 — 2015-02-20T08:12:28Z
You allocate in a forked process. Try to use spawnProcess instead, it tries to avoid complex operations after fork.
Comment #2 by dlang-bugzilla — 2016-05-09T22:57:49Z
You are mixing threads with forking. This is a bad idea in any language. What happens is that a thread from the main process forks, but it doesn't take along with it the other threads. One of those threads is running the GC, which holds a lock. As the GC thread is not duplicated during the fork, the lock will never be freed, thus the forked process will deadlock.