Hi,

I have a weird test case (attached) where SIGCHLD is not being
received by libev. I don't quite understand if it's a

1) bug in how I use libev
2) bug in libev itself
3) bug in the OS

The work around I found that makes this test pass is to patch libev to
start a timer (active only when there are active child watchers) which
calls childcb periodically.

I tested it against the latest libev from CVS.

uname -a: Linux denis-laptop 3.2.0-23-generic-pae #36-Ubuntu SMP Tue
Apr 10 22:19:09 UTC 2012 i686 athlon i386 GNU/Linux

Cheers,
Denis.
/* gcc -DEV_STANDALONE=1 testsigchld.c -o testsigchld 
 *
 * Expected output: infinite sequence of *.*.*.......
 *
 * Actual output:
 *   denis@denis-laptop:~/work/libev-cvs$ ./testsigchld 
 *   *.*.*.Alarm clock
 *
 *   (number of iterations is different each time)
 *
 * */
#include "ev.c"


struct ev_child child;

void stop_child(struct ev_loop* loop, ev_child *w, int revents) {
    ev_child_stop(loop, w);
}

void stop_io(struct ev_loop* loop, ev_io *w, int revents) {
    ev_io_stop(loop, w);
}


void subprocess(void) {
    int pid;
    ev_default_loop(0);
    if (pid = fork()) {
        ev_child_init(&child, stop_child, pid, 0);
        ev_child_start(ev_default_loop(0), &child);
        ev_run(ev_default_loop(0), 0);
        fprintf(stderr, "*");
    }
    else {
        _exit(0);
    }
}


void test_main(void) {
    int pipefd[2];

    while (pipe(pipefd)) perror("pipe");

    int pid = fork();
    if (!pid) {
        close(pipefd[0]);
        subprocess();
        write(pipefd[1], "k", 1);
        _exit(0);
    }

    close(pipefd[1]);
    alarm(5);
    
    struct ev_io io;
    ev_io_init(&io, stop_io, pipefd[0], 1);
    ev_io_start(ev_default_loop(0), &io);
    ev_run(ev_default_loop(0), 0);

    alarm(0);
}

int main(int argc, char** argv) {
    while (1) {
        test_main();
        fprintf(stderr, ".");
    }
}
_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to