父母关闭后如何保留子进程对终端的访问

时间:2015-09-16 23:14:43

标签: c linux unix

我正在尝试编写一个创建子进程然后自行关闭的程序。然后我需要孩子保持与终端的连接。

子进程正在按预期工作(等待终端输入,然后将其打印出来),直到父进程关闭。当父进程终止时,子进程不再等待输入,并且无限期地在终端中打印出“fgets error”消息。

这很奇怪,因为看起来在父母终止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在父进程终止后从/到终端? 任何帮助/解释将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如@ Jonathan-Leffler提出的另一个答案所指出的那样,这是由于shell在父进程完成时取得stdin的所有权。问题是,虽然stdout可以由您想要的多个流程共享(输出只是混合),但stdin无法轻松共享。

可能的解决方法,无需修改您的程序(让它为./test)可能是:

$ cat | ./test

现在,shell将等待cat完成,但在您键入EOF(cat)或写入^D失败之前,stdout将无法完成。但即使您的父进程完成,子进程中的重复fd也将继续使用 catted 数据。