我正在嘗試從父進程的子進程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[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;
}
child.c
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:
,但是當我嘗試輸入內容時,即使按下回車鍵也不會顯示任何內容。
你知道我該如何使它工作?
謝謝你的幫助。
在家長中,不要等到孩子讀完管道之前完成。它可能在這種情況下工作,因爲你可能沒有足夠的寫入來填充管道緩衝區,但是如果它被填充,那麼作者將會阻塞,並且你有一個死鎖。 –
另外,你有什麼版本的'gets'函數需要緩衝區大小?你在使用'gets_s'的一些變體嗎? –
您的父母計劃還存在其他一些問題。例如,它不應該乾淨地編譯。 –