简介:有许多子进程的大型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 sheduler问题,实际上,我应该节省cpu线程。因此,我为块子STDOUT寻找一些优雅的OS功能。
我能做什么?
这是不可能直接实现的:如果您使用fork()
,则子级文件的描述符指向与父级文件相同的文件描述。从操作系统的角度来看,父级访问文件描述符与子级访问文件描述符没有区别。有多种方法可以解决此问题(例如,通过将调试器附加到子级),但是它们确实很复杂。
最简单的方法可能是挂起孩子并恢复它:
kill(child, SIGSTOP);
printf("important message");
/* huge piece of code */
printf("important message");
kill(child, SIGCONT);
孩子不可能无视SIGSTOP
设计。当第一个kill()
呼叫成功时,您可以放心地认为孩子已停止。SIGCONT
通话继续进行。请注意,通过设计,其他过程可以让您的孩子继续之前的工作,但是您对此无能为力。
请注意,SIGCHLD
如果停止您的孩子,则可能会收到一个信号,具体取决于您配置信号处理程序的方式。确保正确配置了所有内容,并阅读了相应的文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句