簡體   English   中英

父級關閉后如何保留子級進程對終端的訪問

[英]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.

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