簡體   English   中英

fork / exec:嘗試重定向stdin / stdout時子退出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM