在运行时从父终端临时禁用子进程
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();
我知道
有一种标准方法可以做到这一点
- 制作管道,
- fork,将 STDOUT 重定向到该管道,
- select&read pipe /write to parent stdout at the some loop at different thread,
- 需要时手动暂停此循环
但我不应该为此使用长线程,我的应用程序作为具有许多多线程子项的多个实例工作,并且存在一些 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
,具体取决于您配置信号处理程序的方式。确保您正确配置了所有内容并阅读了相应的文档。
简介: 有很多子进程的巨大 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();
我知道
有一种标准方法可以做到这一点- 制作管道,
- fork,将 STDOUT 重定向到该管道,
- select&read pipe /write to parent stdout at the some loop at different thread,
- 需要时手动暂停此循环
但我不应该为此使用长线程,我的应用程序作为具有许多多线程子项的多个实例工作,并且存在一些 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
,具体取决于您配置信号处理程序的方式。确保您正确配置了所有内容并阅读了相应的文档。