我有两个源文件
可执行文件名为loop的loop.c

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

并运行可执行文件名为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程序。为什么终止?我读过wait4suspend,但事实上没有。当我执行ps时,程序loop正在运行,而run不在运行(它不在ps中,终端似乎通过输出来完成它的工作)。
我遗漏了什么吗?
聚苯乙烯
如果重要的话,我使用gnu g++编译器。

最佳答案

我想问题出在这里

ptrace(PTRACE_TRACEME, 0, NULL, NULL);

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

wait4(顺便说一句,已弃用)在进程状态更改时返回控件。
ptrace(ptrace_traceme在某些情况下强制子级发送到父级sigtracp
每次wait4、waitpid和类似的函数返回控制时,
您需要使用WiFEXIT来区分子进程的退出和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");

关于c - wait4不阻塞父线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17689125/

10-10 02:47