gpt4 book ai didi

c - wait4 不阻塞父线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:19 30 4
gpt4 key购买 nike

我有以下两个源文件

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 中,终端似乎通过提供输出来完成它的工作)。

我错过了什么吗?

附言

如果重要的话,我使用了 gnu g++ 编译器。

最佳答案

我想问题出在这里

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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com