C 如何保留子进程';s在父级关闭后访问终端
我试图编写一个程序,创建一个子进程,然后关闭自己。然后,我需要孩子保持与终端的连接 子进程按预期工作(等待终端输入,然后打印出来),直到父进程关闭。当父进程终止时,子进程不再等待输入,“fgets错误”消息将在终端中无限期打印出来 这很奇怪,因为似乎在父端终止stdin之后,子端的stdout仍然连接到终端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
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