在运行时从父终端临时禁用子进程

Temporary disabling child processes from parent terminal at runtime

简介: 有很多子进程的巨大 Linux 应用程序,我需要这样的东西:

/* parent process, far from fork*/
suppress_child_output_to_parent_tty();

printf("important message");
/* huge piece of code */
printf("important message");

restore_child_output_to_parent_tty();

我知道

有一种标准方法可以做到这一点

但我不应该为此使用长线程,我的应用程序作为具有许多多线程子项的多个实例工作,并且存在一些 OS 调度程序问题,真的,我应该节省 cpu 线程。因此,我为块子 STDOUT 寻找一些优雅的 OS 工具。

我能做什么?

这不是直接可能的:如果您 fork(),child 的文件描述符指向与 [=] 相同的 文件描述 35=]的。从操作系统的point-of-view来看,parent访问文件描述符和child访问文件描述符没有区别。有很多方法可以解决这个问题(例如,通过将调试器附加到 child),但它们确实很复杂。

最简单的方法可能是暂停 child 并恢复它:

kill(child, SIGSTOP);

printf("important message");
/* huge piece of code */
printf("important message");

kill(child, SIGCONT);

child 无法通过设计忽略 SIGSTOP。当第一个 kill() 调用成功时,您可以放心地假设 child 已停止。它由 SIGCONT 调用继续。请注意,根据设计,另一个进程可以在您想要之前继续您的 child,但您对此无能为力。

请注意,如果您停止 child,您可能会收到 SIGCHLD,具体取决于您配置信号处理程序的方式。确保您正确配置了所有内容并阅读了相应的文档。