![](/img/trans.png)
[英]Simple multiple child exec'd fork segfaulting when trying to read from stdout of child
[英]fork/exec: child exits when trying to redirect stdin/stdout
我正在嘗試使用fork / exec從我的程序中控制類似shell的進程,使用管道將命令寫入該進程並讀取其輸出。 如果我創建該進程而沒有任何重定向,則它會按預期運行而不會退出-我可以在ps輸出中看到父級和子級。 但是,一旦我添加了重定向代碼,該子級似乎立即退出(在ps中顯示為“ defunct”)。 我不確定如何確定子進程為何退出(我看不到該進程的任何輸出),所以我在努力診斷問題。
我的代碼如下所示:
int in[2], out[2];
FILE *in_fp, *out_fp;
pipe(in);
pipe(out);
if (fork()) {
close(in[0]);
close(out[1]);
in_fp = fdopen(in[1], "w");
out_fp = fdopen(out[0], "r");
// Here I'll use in_fp and out_fp to communicate with the child.
} else {
dup2(in[0], STDIN_FILENO);
dup2(out[1], STDOUT_FILENO);
close(in[0]);
close(in[1]);
close(out[0]);
close(out[1]);
execlp("child_process", NULL);
}
有誰知道為什么這可能行不通,或者建議我如何獲得有關子進程為何退出的更多信息?
編輯:因此strace揭示了子進程正在使用SIGSEGV崩潰,並且看起來像在Py_SetProgramName中-盡管尚不能弄清原因(無法訪問子代的符號)。
問題可能出在對execlp()
的調用中。
盡管從技術上講,參數列表可能為空,但通常的做法是始終至少添加一個參數,該參數在main()
為argv[0]
,其實際名稱用於調用程序。 可能是python程序使用此arg0
作為Py_SetProgramName()
參數,而不檢查NULL
。
所以寫:
execlp("child_process", "child_process", (char*)NULL);
另請注意,引用自man execlp
:
參數列表必須以空指針終止,並且由於它們是可變參數函數,因此必須將該指針強制轉換為
(char *)NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.