首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时从父终端临时禁用子进程

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

Stack Overflow用户
提问于 2016-03-14 10:38:49
回答 1查看 236关注 0票数 1

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

代码语言:javascript
复制
/* 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();

我知道这是一种标准的方法

  • 做烟斗,
  • 叉子,把STDOUT转到那个管子上,
  • 选择并读取管道/write到不同线程的某个循环的父标准输出,
  • 需要时手动暂停此循环

但是我不应该为此使用长时间线程,我的应用程序作为多个实例与许多多线程子程序一起工作,并且存在一些OS sheduler问题,真的,我应该节约cpu线程。因此,我寻找一些优雅的操作系统设施块子STDOUT。

我能做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 10:50:50

这是不可能的:如果您的fork(),子文件描述符指向与父文件描述相同的文件描述。从操作系统的角度来看,父文件描述符和子文件描述符访问文件描述符没有区别。有一些方法可以解决这个问题(例如,将调试器附加到子程序上),但它们确实很复杂。

最简单的方法可能是挂起孩子并恢复它:

代码语言:javascript
复制
kill(child, SIGSTOP);

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

kill(child, SIGCONT);

通过设计,孩子不可能忽略SIGSTOP。当第一个kill()调用成功时,您可以安全地假设子调用已经停止。它由SIGCONT调用继续进行。请注意,通过设计,在您想要继续您的孩子之前,另一个进程是可能的,但是您没有什么可以做的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35985261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档