我有两个源文件
可执行文件名为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/