[英]How to retain child process's access to the terminal after the parent closes
我正在嘗試編寫一個程序,該程序創建一個子進程,然后關閉自身。 然后,我需要孩子保持與終端的連接。
子進程按預期工作(等待終端輸入,然后將其打印出來),直到父進程關閉。 當父進程終止時,子進程不再等待輸入,並且“ fgets錯誤”消息無限期地顯示在終端中。
這很奇怪,因為在父級終止stdin之后,似乎關閉了,但孩子的stdout仍然連接到終端。
int main(){
int pid1;
pid1=fork();
if (pid1==-1){
perror("fork");
exit(EXIT_FAILURE);
}
if (pid1==0){
while(1){
char *data;
char *result;
result=fgets(data,100,stdin);
if (result!=NULL){
printf("%s\n",data);
}
else{
printf("fgets error\n");
sleep(1);
}
}
}
else
{
//The sleep below is for debugging purposes
sleep(5);
exit(EXIT_SUCCESS);
}
}
有沒有辦法在子進程的父進程終止后保留從/指向終端的子進程的stdin / stdout? 任何幫助/解釋將不勝感激。
正如@ Jonathan-Leffler的另一個答案所指出的,這是由父進程完成時shell擁有stdin
所有權引起的。 問題在於,盡管stdout
可以由您想要的任意多個進程共享(輸出只是混合),但是stdin
卻不容易共享。
一個可能的解決方法,而無需修改您的程序(將其設置為./test
)可能是:
$ cat | ./test
現在,shell將等待cat
完成,但是cat
直到您鍵入EOF( ^D
)或向stdout
寫入失敗后才會完成。 但是,即使您的父進程完成了,子進程中重復的fd仍會繼續使用接收到的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.