簡體   English   中英

如何通過管道將stdin從孩子傳給父母?

[英]How to pipe stdin from child to parent?

我正在嘗試從父進程exec()子進程。 在這個子流程中,我要求用戶輸入一條消息,以便可以由父流程將其打印出來,但是我找不到解決方法...

到目前為止,我的代碼是:

父母

int main(int argc, char **argv) {
    int fd[2];
    char line[80];

    pipe(fd);

    pid_t pid = (pid_t)fork();

    if(pid > 0) {
        waitpid(pid, NULL, 0);
        close(fd[0]);
        int size = read(fd[1], line, 79);
        close(fd[1]);
        line[size] = '\0';
        printf("[parent] Received \"%s\", size = %d\n", line, size);
    }
    else {
        close(fd[1]);
        close(stdin);
        dup2(fd[0], stdin);
        close(fd[0]);
        exec("./child", 0, NULL);
    }

    return 0;
}

小孩

int main(int argc, char **argv) {
    char line[80];

    printf("[child] Enter message: ");
    gets(line, 80);
    printf("[child] line = %s\n", line);

    return 0;
}

當我啟動父進程時,它顯示[child] Enter message:但是,當我嘗試鍵入某些內容時,即使按了回車鍵,也沒有任何顯示。

你知道我該怎么做嗎?

謝謝您的幫助。

除了我的評論中提到的問題之外,您遇到的問題還很僵局 之所以會這樣,是因為父進程等待子進程退出。 但是子進程正在等待永遠不會到達的輸入。

這是因為在子進程中,您說輸入應來自pipe

此外,在父進程中,您嘗試從管道的寫端讀取

最后,只要子進程想要讀取用戶輸入,您的程序將永遠無法運行,因為所有用戶輸入都將進入進程。

為了使其全部正常工作,您需要重新考慮設計,並使進程成為從用戶讀取輸入並寫入管道的進程。 並且子進程應從管道讀取並打印到(非管道)標准輸出。 或者關閉父級中的(普通,非管道)標准輸入,然后在子級中寫入管道(作為標准輸出)。

您的代碼有幾個問題:

  • 您混合使用整數(低級)文件描述符和(高級)FILE *常量。
  • 您反轉stdin和stdout以及通過pipe獲得的描述符的順序
  • 您打算在重定向時在stdout上寫一條消息(應使用stderr)

這是一個固定版本(我通過fgets更改了gets,並使用execl更改了您的exec以使所有內容都可以編譯):

parent.c:

int main(int argc, char **argv) {
    int fd[2];
    char line[80];

    pipe(fd);

    pid_t pid = (pid_t)fork();

    if(pid > 0) {
        waitpid(pid, NULL, 0);
        close(fd[1]);
        int size = read(fd[0], line, 79);
        close(fd[0]);
        line[size] = '\0';
        printf("[parent] Received \"%s\", size = %d\n", line, size);
    }
    else {
        close(fd[0]);
        close(1);
        dup2(fd[1], 1);
        close(fd[1]);
        execl("./child", NULL);
    }

    return 0;
}

小孩

int main(int argc, char **argv) {
    char line[80];

    fprintf(stderr, "[child] Enter message: ");
    fgets(line, 80, stdin);
    printf("[child] line = %s\n", line);

    return 0;
}

我找到了一種解決方法。 我的實際目標是在父母與孩子之間傳遞信息。 我的錯誤是在stdin上的dup2 這樣,程序詢問時我什么也輸入不了。 因此,我在argv傳遞了文件描述符的值,問題就解決了。

再次感謝你的幫助 !

暫無
暫無

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

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