Both this (with Posix.Process open):
case fork() of NONE => (exece(proc,proc::args,env') handle _ => die ("Exece of "^proc^" failed")) | SOME cpid => let val (_, result) = waitpid(W_CHILD cpid, []) in result end
and this:
case fork() of NONE => let val () = dup2 {old = outoutfd, new = Posix.FileSys.stdout} val () = dup2 {old = erroutfd, new = Posix.FileSys.stderr} val () = dup2 {old = ininfd, new = Posix.FileSys.stdin} val () = List.app close [errinfd, erroutfd, outinfd, outoutfd, ininfd, inoutfd] in exece(executable,nm_args,env) end | SOME pid => let val out = mkTIO_instream outinfd val err = mkTIO_instream errinfd val () = List.app close [outoutfd, erroutfd, ininfd, inoutfd] in ? end
seem to be causing us grief, particularly on a recent Linux, PolyML 5.7 and under conditions of some memory load.
The Linux is:
Linux gemma 4.9.1-gnu-1 #1 SMP PREEMPT Sun Jan 8 16:17:57 UYT 2017 x86_64 GNU/Linux
When strace-d, we get a lot of futex calls and interruptions from SIGCHLD.
This is with --gcthreads=1, but pages like
http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-usin...
make me a bit nervous about how we might be falling prey to horrible problems.
Is there a better idiom we might use?
Thanks, Michael