如何等待处理孩子?

时间:2009-10-18 21:03:34

标签: linux posix exec fork wait

我做通常的fork + exec组合:

int sockets [2];
socketpair (AF_LOCAL, SOCK_STREAM, 0, sockets);
int pid = fork ();

if (pid == 0) {
  // child
  dup2 (sockets[0], STDIN_FILENO);
  dup2 (sockets[0], STDOUT_FILENO);
  execvp (argv[0], argv);
  _exit (123);
}
// parent

close (sockets[0]);
// TODO wait and see if child crashes

是否有可能等到孩子崩溃或开始等待阅读(...)?

3 个答案:

答案 0 :(得分:1)

checkout waitpid

 pid_t waitpid(pid_t pid, int *stat_loc, int options);

来自

#include <sys/wait.h>

答案 1 :(得分:1)

您可以使用ptrace(2)系统调用执行strace(1)操作。在子进程中,在执行之前,您需要调用PTRACE_TRACEME,并将父进程作为调试器附加到它。然后,父母必须使用PTRACE_SYSCALL恢复执行,并且它将在每个系统调用处停止。父进程应使用wait(2)等待子进程在系统调用时跳转,然后使用ptrace和PTRACE_PEEK *来检查系统调用的参数。重复此操作,直到调用您正在等待(读取)的系统调用,然后使用PTRACE_DETACH从子进程中分离。查看strace的来源,了解如何识别感兴趣的系统调用的详细信息。如果进程崩溃,则wait syscall将告诉您该进程获得了SIGSEGV。在这种情况下也不要忘记分离。

答案 2 :(得分:0)

这是一个建议:

打开pipe,子进程可以向管道发送消息,告诉父进程它将要在stdin上读取()。如果你这样做并且孩子死了,我认为父母将被告知管道已经坏了。