2009-10-18 219 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。不要忘記在這種情況下也要分手。