簡體   English   中英

使用stdout / stderr以外的管道與子進程進行通信

[英]Communicate with a subprocess using pipes on other than stdout/stderr

這是我派生/執行子流程並與之通信(偽代碼)的方式:

int cout_pipe[2];
pipe(cout_pipe);
fork();
if (child)
{
  dup2(cout_pipe[1],STDOUT_FILENO);
  execv();
}
if (parent)
{
  File* cout_file = fdopen(cout_pipe[0], "r");
}

我的問題是:

我真的不想讀取我的子進程的stdout,我希望子進程在stdout之外的文件描述符上寫。 而且,我希望以上代碼從該文件描述符中讀取。

子進程是用python編寫的,python是C ++的主進程。

我想我可以從以下位置更改該行:

dup2(cout_pipe[1],STDOUT_FILENO);

dup2(cout_pipe[1],MY_OWN_RANDOM_FD_NUMBER);

並以我寫入MY_OWN_RANDOM_FD_NUMBER而不是stdout的方式對子流程進行編碼。

這是一個好的解決方案嗎? 可行嗎? 我如何找出一個好的MY_OWN_RANDOM_FD_NUMBER? 有更好的選擇嗎?

在您描述的情況下,無需復制文件描述符。 對pipe()的調用已經在cout_pipe數組中創建了所需的文件描述符。

通常,子進程只是在執行之前關閉管道的讀取側,而父進程則關閉管道的寫入側。 子級將所需的任何內容寫入寫側,而父級則讀取或監視管道的讀取側。

如果您的問題是“子進程在執行完后如何知道fd號,那么當您在子進程中調用execv()時,我會說將它作為執行參數傳遞。”

就像是:

int   child_pipe[2];
FILE *child_file;

void forkchild(void)
{
    int  ret;
    char child_pipe_fd_str[16];

    pipe(child_pipe);  /* TODO: check return value! */

    if (0 == (ret = fork())) /* child */
    {
        close(child_pipe[0]);
        sprintf(child_pipe_fd_str, "%d", child_pipe[1]);
        execv(my_python_script, child_pipe_fd_str, NULL);
    }
    else if (-1 != ret)  /* parent */
    {
        close(cout_pipe[1]);
        child_file = fdopen(cout_pipe[0], "r");
    }
    else
    {
        perror("Fork failed!");
        abort();
    }
}

除非您想要特定的fd(如標准輸出),否則dup2毫無意義。 只需將cout_pipe[1]轉換為字符串,然后將其作為命令行參數傳遞給子項(在exec )。 在Python方面,從sys.argv獲取參數,將其轉換回int ,然后使用os.fdopen為其獲取file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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