Matt Fichman Matt Fichman - 4 months ago 18
C Question

SIGCHLD Replacement for Windows

I would like to have SIGCHLD functionality on Windows (i.e., notify the parent process when a child dies). I am aware that there is no equivalent to SIGCHLD in the Windows API, but I'd like to know what the common method is for implementing this with Windows. I'm sure that this is a problem that Windows developers encounter fairly often.

The only solution I can think of now involves polling the children to see if they are still alive.

Note: My application is single-threaded, and I would like to keep it that way if possible. The application has a non-blocking event loop (using select()).

Answer

I don't know if this is the best way, but it's certainly a way.

I assume you're creating the process with CreateProcess. This returns a PROCESS_INFORMATION structure that contains member hProcess. This is a handle to the child process you've created.

From here, you can wait on this handle with WaitOnSingleObject, which will block until the given handle is signalled (although it does take a timeout if you'd prefer to do this non-blocking - it's the closest equivalent to select you'll get).

If you do go the multi-thread route, then you can wait on a separate thread then when WaitOnSingleObject passes, you can notify a worker thread within the parent process accordingly.

In single-threaded style, you'll just be polling the handle in a loop if you use select-style semantics.

If you have several child objects to wait on (given you're already using select), you might want to consider WaitForMultipleObjects - if that's a pertinent model for your code.