简介:有大量的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();
我知道通过
存在标准的方法但我不应该使用长期活动线程,我的应用程序作为几个多线程子项的实例工作,并且有一些操作系统sheduler问题,实际上,我应该节省cpu线程。所以我为块子STDOUT寻找一些优雅的OS设施。
我该怎么办?
答案 0 :(得分:2)
这不是直接可能的:如果您fork()
,子项的文件描述符指向与父项相同的文件描述。从操作系统的角度来看,访问文件描述符的父级和访问它的子级没有区别。有办法解决这个问题(例如,通过将调试器附加到孩子身上),但它们确实非常复杂。
最简单的方法可能是暂停孩子和简历:
kill(child, SIGSTOP);
printf("important message");
/* huge piece of code */
printf("important message");
kill(child, SIGCONT);
孩子无法通过设计忽略SIGSTOP
。当第一个kill()
调用成功时,您可以安全地假设孩子已经停止。 SIGCONT
电话会继续。请注意,根据设计,其他流程可以在您想要之前继续您的孩子,但您无法做任何事情。
请注意,如果您停止孩子,可能会收到SIGCHLD
,具体取决于您配置信号处理程序的方式。确保正确配置了所有内容并阅读相应的文档。