【问题标题】:Temporary disabling child processes from parent terminal at runtime在运行时从父终端临时禁用子进程
【发布时间】:2016-06-29 08:33:59
【问题描述】:

简介:有很多子进程的大型 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 重定向到该管道,
  • 在不同线程的某个循环中选择和读取管道/写入父标准输出,
  • 需要时手动暂停此循环

但是我不应该为此使用长寿命线程,我的应用程序作为具有许多多线程子节点的多个实例工作,并且存在一些操作系统调度程序问题,真的,我应该节省 cpu 线程。因此,我为块子 STDOUT 寻找一些优雅的操作系统工具。

我能做什么?

【问题讨论】:

  • 您想在“大量代码”运行时保持子进程运行,还是暂时暂停它是一种可接受的解决方案?
  • 是的,暂停子进程是可以接受的。

标签: c linux multithreading fork tty


【解决方案1】:

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

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

kill(child, SIGSTOP);

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

kill(child, SIGCONT);

在设计上,孩子不可能忽略SIGSTOP。当第一个kill() 调用成功时,您可以放心地假设孩子已经停止。通过SIGCONT 呼叫继续。请注意,根据设计,您可以先让另一个进程继续您的孩子,但您对此无能为力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多