SIGCHLD not received

Marc Lehmann schmorp at
Tue May 29 17:12:22 CEST 2012

On Tue, May 29, 2012 at 04:31:05PM +0400, Denis Bilenko <denis.bilenko at> wrote:
> I have a weird test case (attached) where SIGCHLD is not being
> received by libev. I don't quite understand if it's a

Well, thanks for a simple-to-try test program :)

> 1) bug in how I use libev

This one - your test program forks after initialising the default loop,
without calling ev_default_fork.

I added an ev_loop_destroy (EV_DEFAULT) at the end of test_main, and got a
lot longer output, until:

(libev) error creating signal/async pipe: Too many open files

Which is probably a different bug in the test program.

Note that this only works because the fork isn't done while the default
loop exists at the time - if you would fork while the dfeault loop
existed, you'd have to work with ev_default_fork and probably stop all
watchers you inherited form the parent.

Now, the fork business is very unfortunate, but both epoll/kqueue and
pthreads have diminished fork into a state where using an event loop in
both parent ands child has become extreely hard (actually, doing anything
in the child is hard with pthreads).

If you plan to design a new application, it would probably be much easier in
the long run if you either:

a) only use libev in your "worker" processes.
b) fork+exec worker processes, and use libev freely in both (avoiding
   epoll if you fork often in the parent).

                The choice of a       Deliantra, the free code+content MORPG
      -----==-     _GNU_    
      ----==-- _       generation
      ---==---(_)__  __ ____  __      Marc Lehmann
      --==---/ / _ \/ // /\ \/ /      schmorp at
      -=====/_/_//_/\_,_/ /_/\_\

More information about the libev mailing list