wait4 не блокировать родительский поток
У меня есть два следующих исходных файла
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 приостановить, но на самом деле это не так. Когда я казнил ps
программа loop
работает и run
не (это не в ps
и терминал, кажется, заканчивает свою работу, давая вывод).
Я что-то пропустил?
PS
Я использовал компилятор gnu g++, если это имеет значение.
1 ответ
Я полагаю, проблема здесь
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");