我有两个以下的源文件
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 ++编译器。
答案 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");