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

时间:2016-03-14 10:38:49

标签: c linux multithreading fork tty

简介:有大量的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重定向到该管道,
  • 在不同线程的某个循环中选择& read to parent stdout to parent stdout,
  • 在需要时手动暂停此循环

但我不应该使用长期活动线程,我的应用程序作为几个多线程子项的实例工作,并且有一些操作系统sheduler问题,实际上,我应该节省cpu线程。所以我为块子STDOUT寻找一些优雅的OS设施。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

这不是直接可能的:如果您fork(),子项的文件描述符指向与父项相同的文件描述。从操作系统的角度来看,访问文件描述符的父级和访问它的子级没有区别。有办法解决这个问题(例如,通过将调试器附加到孩子身上),但它们确实非常复杂。

最简单的方法可能是暂停孩子和简历:

kill(child, SIGSTOP);

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

kill(child, SIGCONT);

孩子无法通过设计忽略SIGSTOP。当第一个kill()调用成功时,您可以安全地假设孩子已经停止。 SIGCONT电话会继续。请注意,根据设计,其他流程可以在您想要之前继续您的孩子,但您无法做任何事情。

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