Re: [Haskell-cafe] How to terminate the process group of a process created with createProcess?

From: Brandon Allbery
On Wed, Jan 11, 2012 at 16:26, Andr? Scholz
wrote: (on unix) creating a process A which spawns itself a subprocess B and terminating process A before it finishes leaves process B as a process on its own. This is because "terminateProcess" sends the sigterm signal to the process only and not to its process group.
terminateProcess passes on the semantics of kill(2); on SVID-compliant (and I think POSIX.1-compliant) systems, the negative of the process group leader's process ID is used to signal the process group. Note that you may need to arrange for your initial child process to invoke setpgrp() to insure that the parent program is not part of the process group.
System.Process.terminateProcess takes a ProcessHandle as input, which is an opaque type which essentially can only be created via System.Process.createProcess or similar; it's not possible to pass arbitrary pid's to it. However, on Posix systems it is currently possible (ghc-7.2.1) to import System.Process.Internals, which would allow you to either create a new ProcessHandle from an arbitrary pid or retrieve the pid from a ProcessHandle. My answer on SO now shows how to do so. Of course this approach won't be portable, and it may change depending on your compiler version. (link to SO: http://stackoverflow.com/questions/8820903/haskell-how-to-timeout-a-function... ) John L.
participants (1)
-
John Lato