wait4不阻止父线程

时间:2013-07-17 00:23:07

标签: c linux multithreading pthreads

我有两个以下的源文件

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 suspend,但实际上并没有。当我执行ps计划loop正在投放且run没有投放时(它不在ps中,而且终端似乎已经完成了它{&1;}通过提供输出来工作。

我错过了什么吗?

PS

如果它很重要,我使用gnu g ++编译器。

1 个答案:

答案 0 :(得分:2)

我想问题就在这里

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");