Hi! I don't know if that has been brought up before (I couldn't find anything). libev reaps all child processess synchronously in the default event loop. This behaviour can result in child reaping race conditions, generally if waitpid() and in particular if system() (declared in stdlib.h) is also used in the program. In single-threaded programs, this shouldn't cause any problem because of the synchronous reaping. Even if children would be reaped asynchronously, system() would block (mask out) SIGCHLD temporarily. However in multi-threaded environments, system() cannot mask out SIGCHLD for every thread. I'm currently investigating whether this is ok or a bug in itself. At least it happens with both uClibc and glibc which use a similar system() implementation (which call sigprocmask() for masking out SIGCHLD...). Of course it would be possible to reset the signal handler after default loop initialization, but what if you still want to use events for child reaping purposes? It would still be possible to reap only the children you're actually interested in or synchronize the waitpid() and system() calls with a mutex. Unfortunately it doesn't seem to be possible to use an ev_signal for SIGCHLDs, maybe because libev uses an ev_signal for child reaping internally!? So the only way to not break the system() (and waitpid()) calls in a multi-threaded environment seems to be using an async watcher. In pseudo-code:
ev_default_init(0); ev_async_init(&async, async_cb); ev_async_start(EV_DEFAULT_UC_ &async); signal(SIGCHLD, chld_hnd); ... void chld_hnd(int s) { ev_async_send(EV_DEFAULT_UC_ &async); } ... void async_cb(EV_P_ ev_async *w, int revents) { // do whatever we would have done in an ev_signal handler } That doesn't seem to be pretty much straight-forward. IMHO, I could live without the ev_child watcher at all but I would be happy with a clean way to use ev_signal to process SIGCHLDs. cheers, Robin -- -- ------------------ managed broadband access ------------------ Travelping GmbH phone: +49-391-8190990 Roentgenstr. 13 fax: +49-391-819099299 D-39108 Magdeburg email: i...@travelping.com GERMANY web: http://www.travelping.com Company Registration: Amtsgericht Stendal Reg No.: HRB 10578 Geschaeftsfuehrer: Holger Winkelmann | VAT ID No.: DE236673780 -------------------------------------------------------------- _______________________________________________ libev mailing list libev@lists.schmorp.de http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev