SIGCHLD not received

Denis Bilenko denis.bilenko at gmail.com
Tue Jul 24 10:06:34 CEST 2012


On Mon, Jul 23, 2012 at 1:24 PM, Marc Lehmann <schmorp at schmorp.de> wrote:
> Hmm, it's been a long time - what exactly is the behaviour I am supposed to
> see from the program without the sleep, and what behaviour do you get?

Here's the program with sleep removed (no further changes necessary),
just tested it against libev in CVS: https://gist.github.com/3168594

Actual output:

denis at ubuntu:~/work/libev-cvs$ ./testsigchld5
*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.Alarm clock

Expected output:

*. goes on infinitely

>> The source of the issue is a race condition between ev_feed_signal and
>> loop_fork(). If I block signals at the beginning of loop_fork() and
>> unblock them at the end I have it fixed.

> Can you explain the mechanism or nature of that race condition?

in loop_fork() you call

  ev_io_stop (EV_A_ &pipe_w);
  // signal delivered right here

in ev_feed_signal() you check

  if (!ev_active (&pipe_w))
    return;

thus ev_feed_signal() handler becomes noop.

>> Do you acknowledge this to be a bug in libev?
>
> If it is a bug, I will of course acknowledge it - that's a weird question
> to ask(?).

It's a very real question, depending on the answer I either can
continue to use stock libev or have to maintain my own slightly
modified branch, which is a nuisance.

>
>> Do you need help with fixing it?
>
> I need help understanding it, to see if it's really a bug - keep in mind
> that you made a lot of invalid reports, and it takes time to sift through
> all and find out if there really is an issue.

Just use the last test program (in this email).



More information about the libev mailing list