wait4 не блокировать родительский поток

У меня есть два следующих исходных файла

loop.c, имя исполняемого файла loop

int main() {
    while(true);
    return 0;
}

и run.c, имя исполняемого файла которого run

int main() {
    pid_t child_pid = fork();

    int status;
    struct rusage info;

    if (child_pid == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        execl("loop", "loop", NULL);
        exit(0);
    }

    wait4(child_pid, &status, 0, &info);

    puts("Child exited");
    printf("%ld\n", info.ru_utime.tv_usec);

    return 0;
}

Я собрал оба, и я побежал run программа. Почему это прекратилось? Я читал, что wait4 приостановить, но на самом деле это не так. Когда я казнил ps программа loop работает и run не (это не в ps и терминал, кажется, заканчивает свою работу, давая вывод).

Я что-то пропустил?

PS

Я использовал компилятор gnu g++, если это имеет значение.

1 ответ

Решение

Я полагаю, проблема здесь

ptrace(PTRACE_TRACEME, 0, NULL, NULL);

и здесь

wait4(child_pid, &status, 0, &info);

wait4 (устарел кстати) возвращает управление, если состояние процесса изменилось.

ptrace (PTRACE_TRACEME заставляет дочернюю отправку родительскому SIGTRAP, если возникает какое-либо условие, и каждый раз, когда wait4, waitpid и подобные функции возвращают вам управление, вам нужно использовать WIFEXITED, чтобы различать выход дочернего процесса и условие sigtrap.

Вы можете проверить мое заявление, заменив wait4 на:

    if (wait4(child_pid, &status, 0, &info) < 0) {
        perror("wait4 failed");
    } else if (WIFEXITED(status)) {
        printf("process exit\n");
    } else
        printf("child just send signal\n");
Другие вопросы по тегам