1

我做通常的 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

是否可以等到孩子崩溃或开始等待读取(...)?

4

3 回答 3

1

结帐等待PID

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

#include <sys/wait.h>
于 2009-10-18T22:22:41.950 回答
1

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

于 2009-11-05T23:44:35.883 回答
0

这里有一个建议:

打开一个管道,子进程可以通过管道向父进程发送一条消息,告诉父进程它即将在标准输入上读取()。我认为,如果您正确执行此操作并且孩子死了,则会通知父母管道已损坏。

于 2009-10-18T21:34:32.923 回答