我正在尝试编写一个创建子进程然后自行关闭的程序。然后我需要孩子保持与终端的连接。
子进程正在按预期工作(等待终端输入,然后将其打印出来),直到父进程关闭。当父进程终止时,子进程不再等待输入,并且无限期地在终端中打印出“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在父进程终止后从/到终端? 任何帮助/解释将不胜感激。
答案 0 :(得分:0)
正如@ Jonathan-Leffler提出的另一个答案所指出的那样,这是由于shell在父进程完成时取得stdin
的所有权。问题是,虽然stdout
可以由您想要的多个流程共享(输出只是混合),但stdin
无法轻松共享。
可能的解决方法,无需修改您的程序(让它为./test
)可能是:
$ cat | ./test
现在,shell将等待cat
完成,但在您键入EOF(cat
)或写入^D
失败之前,stdout
将无法完成。但即使您的父进程完成,子进程中的重复fd也将继续使用 catted 数据。