LINUX.ORG.RU

История изменений

Исправление beastie, (текущая версия) :

wait4 там есть: https://github.com/majek/systrace/blob/master/systrace.c#L457, но сигнал-хандлер там с ошибками — сильно не вчитывался — первое, что в глаза бросилось, но данный кусок кода должен выглядеть примерно так:

static void
child_handler(int sig)
{
        int s = errno, status;

        /* и так ясно, что sig == SIGCHLD */
        close(trfd);
        while (wait4(-1, &status, WNOHANG, NULL) > 0)
                ;

        /* что дальше со status делать? */

        errno = s;
}
и именно тут status похоже и теряется.
signal(SIGCHLD, child_handler)
должен быть в main().

UPD: хотя… были там какие-то заковырки с SIGCHLD, не помню уже, поэтому всё, что я написал выше — ложь и IMHO ☺

Исправление beastie, :

wait4 там есть: https://github.com/majek/systrace/blob/master/systrace.c#L457, но сигнал-хандлер там с ошибками — сильно не вчитывался — первое, что в глаза бросилось, но данный кусок кода должен выглядеть примерно так:

static void
child_handler(int sig)
{
        int s = errno, status;

        /* и так ясно, что sig == SIGCHLD */
        close(trfd);
        while (wait4(-1, &status, WNOHANG, NULL) > 0)
                ;

        /* что дальше со status делать? */

        errno = s;
}
и именно тут status похоже и теряется.
signal(SIGCHLD, child_handler)
должен быть в main().

UPD: хотя… были там какие-то заковарки с SIGCHLD, не помню уже, поэтому всё, что я написал выше — ложь и IMHO ☺

Исправление beastie, :

wait4 там есть: https://github.com/majek/systrace/blob/master/systrace.c#L457, но сигнал-хандлер там с ошибками — сильно не вчитывался — первое, что в глаза бросилось, но данный кусок кода должен выглядеть примерно так:

static void
child_handler(int sig)
{
        int s = errno, status;

        /* и так ясно, что sig == SIGCHLD */
        close(trfd);
        while (wait4(-1, &status, WNOHANG, NULL) > 0)
                ;

        /* что дальше со status делать? */

        errno = s;
}
и именно тут status похоже и теряется.
signal(SIGCHLD, child_handler)
должен быть в main().

Исходная версия beastie, :

wait4 там есть: https://github.com/majek/systrace/blob/master/systrace.c#L457, но сигнал-хандлер там с ошибками — сильно не вчитывался — первое, что в глаза бросилось, но данный кусок кода должен выглядеть примерно так:

static void
child_handler(int sig)
{
        int s = errno, status;

        if (sig == SIGCHLD)
                close(trfd);

        while (wait4(-1, &status, WNOHANG, NULL) > 0)
                ;

        /* что дальше со status делать? */

        errno = s;
}
и именно тут status похоже и теряется.
signal(SIGCHLD, child_handler)
должен быть в main().