![](/img/trans.png)
[英]How can the child process read stdout from the pipe and the parent process write stdin to the pipe?
[英]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 。
此外,在父進程中,您嘗試從管道的寫端讀取 。
最后,只要子進程想要讀取用戶輸入,您的程序將永遠無法運行,因為所有用戶輸入都將進入父進程。
為了使其全部正常工作,您需要重新考慮設計,並使父進程成為從用戶讀取輸入並寫入管道的進程。 並且子進程應從管道讀取並打印到(非管道)標准輸出。 或者關閉父級中的(普通,非管道)標准輸入,然后在子級中寫入管道(作為標准輸出)。
您的代碼有幾個問題:
pipe
獲得的描述符的順序 這是一個固定版本(我通過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.