Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何保留子进程';s在父级关闭后访问终端_C_Linux_Unix - Fatal编程技术网

C 如何保留子进程';s在父级关闭后访问终端

C 如何保留子进程';s在父级关闭后访问终端,c,linux,unix,C,Linux,Unix,我试图编写一个程序,创建一个子进程,然后关闭自己。然后,我需要孩子保持与终端的连接 子进程按预期工作(等待终端输入,然后打印出来),直到父进程关闭。当父进程终止时,子进程不再等待输入,“fgets错误”消息将在终端中无限期打印出来 这很奇怪,因为似乎在父端终止stdin之后,子端的stdout仍然连接到终端 int main(){ int pid1; pid1=fork(); if (pid1==-1){ perror("fork"); exit(EXIT_FAILURE); } i

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

子进程按预期工作(等待终端输入,然后打印出来),直到父进程关闭。当父进程终止时,子进程不再等待输入,“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
),一种可能的解决方法可能是:


现在,shell将等待
cat
完成,但在键入EOF(
^D
)或写入
stdout
失败之前,
cat
不会完成。但是,即使父进程完成,子进程中的复制fd也将继续消耗CATT数据。

我认为您得到的场景与中相同。现代作业控制shell使用的调用是问题的一部分。我不清楚是否有办法解决这个问题——AFAICT,当控制进程拒绝子进程访问终端时,这种拒绝是不可撤销和无可争辩的。我开始尝试,但要获得正确的设置是很困难的。您正在使用未初始化的指针调用
fgets()
。这会引起问题,但可能不是你所描述的。@JonathanLeffler:如果孩子不承认控制终端,并试图将其用作非控制终端,这是可能的,但随后它将与外壳争夺输入。OP要求的设置在逻辑上没有意义。
$ cat | ./test