2009-10-18 134 views
1

我做平常叉+ 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 

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

+0

为什么不使用信号在另一个线程上指出(http://stackoverflow.com/questions/1584956/how-to-handle-execvp-errors-after-fork/1584994#1584994)? – 2009-10-18 21:41:18

+0

因为如果孩子不会死的话,我不会得到SIGCHLD,但是在阅读时停止。 (或者我会吗?) – 2009-10-18 22:08:36

回答

0

这里有一个suggestsion:

打开pipe,子进程可以发送消息沿管路告诉父母,这是关于阅读()的标准输入。如果你正确地做到这一点,并且孩子死亡,我想,父母会被通知管道已经坏了。

+0

孩子打算调用任意命令。我无法控制其来源。 – 2009-10-18 22:09:49

+0

我不知道是否有任何简单的解决方案,然后。你可以用'strace'或类似的东西运行这个孩子,看看它使用的系统调用... – Artelius 2009-10-18 22:53:24

1

checkout waitpid

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

#include <sys/wait.h> 
+0

它有什么用? – 2009-10-18 22:30:10

+0

它可以帮助你找出它何时崩溃,但是检测它何时等待输入更加棘手。 – 2009-10-19 05:38:37

1

可以使用ptrace的(2)系统调用办(1)做什么strace的。在子进程中,在执行之前,您需要调用PTRACE_TRACEME,并且将父进程作为调试器附加到它。父母将不得不用PTRACE_SYSCALL继续执行,并且它将在每个系统调用中停止。父级应该使用wait(2)等到子级在系统调用中跳转,然后使用带有PTRACE_PEEK *的ptrace来检查系统调用的参数。重复该操作,直到调用您正在等待的系统调用(读取),然后使用PTRACE_DETACH从子进程中分离。查看strace的来源,了解如何识别系统调用的细节。如果进程崩溃,那么等待系统调用会告诉你进程得到了SIGSEGV。不要忘记在这种情况下也要分手。