c语言 - 在 Linux 中父母终止后,如何保持孩子的标准输出打开?



我正在尝试从 Ubuntu 中的父应用程序运行子进程。两者都是 C 程序。父级使用 fork(( 和后续的 execl((,然后等待 ~1 秒并终止。这个想法是让父级以常规方式终止,并保持孩子在同一个控制台中存活和运行。因此,孩子开始以 300 毫秒的间隔打印一些输出,我可以在父母活着的时候看到它。然后父级终止,控制台中看不到进一步的子输出。

从我读到的到现在,似乎由于孩子共享所有句柄,在父母退出时,父子都会关闭标准输出。所以,我想孩子必须以某种方式保持绑定到它开始时绑定到的同一控制台。请告知如何实现这一目标。

如果您希望子进程继续运行并写入终端,即使在父进程停止之后,也不必执行任何特殊操作。尝试下面的程序。顺便说一句,这非常烦人,因为子进程会破坏您当前的终端会话。

这是有效的,因为:

  • 子进程获取父进程打开文件描述符的副本,包括stdout。这与dup()所做的相同。
  • 要实际关闭文件,必须关闭所有关联的文件描述符。

有关详细信息,请参见手册页fork()dup()

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
int wstatus;
switch (pid)
{
case -1:
fprintf(stderr, "fork() failedn");
exit(EXIT_FAILURE);
case 0:
while (1)
{
printf("child working...n");
sleep(1);
}
break;
default:
printf("Press ENTER to exit parent...n");
getchar();
}
return EXIT_SUCCESS;
}

很抱歉打扰你们,谢谢大家的评论!作为一个以窗户为背景的人,我只是不确定在这种情况下应该是什么正常行为。

在构建和尝试示例时,我想我理解了这种行为的原因。问题是我在显示面板的 mc 中运行它。现在,我尝试在不同的条件下运行它,并得到以下图片:如果我从裸控制台运行它,它可以正常工作;如果我从隐藏面板的 mc 运行它,它也可以正常运行。在父级关闭后它停止显示输出的唯一情况是当我在显示面板的情况下运行它时。现在对我来说很明显,在这种情况下,mc 打印"按任意键继续..."消息在父级终止时立即停止显示子项的任何进一步输出。

最新更新