从升压::p罗塞斯到升压::子级的信号传播

signal propagation from boost::process to boost::child

本文关键字:信号 传播 罗塞斯      更新时间:2023-10-16

我在 Linux 的主应用程序中使用 boost::process v. 1.65.1 来创建很少的boost::process::child对象并管理通过boost::process::std_inboost::process::std_out(即管道(交换的数据。

当我的主应用程序收到控制台发送的 CTRL-C 时,我看到子应用程序也收到了 CTRL-C 信号。

要终止我的孩子,我宁愿通过管道发送一个明确的命令,但是当我这样做时,信号已经传播了。实际上,有些孩子看到命令,其他孩子看不到并看到信号。

  1. 这种信号传播是正常行为吗?
  2. 我可以
  3. 做些什么来防止这种情况发生,以便我可以在不受干扰的情况下通过管道发出命令?

这种信号传播是正常行为吗?

这不是传播本身,而是当您在 POSIX 终端中键入 Ctrl+C 时,SIGINT信号将广播到终端前台进程的所有进程。进程组由命令行管理程序管理,默认情况下,分叉处理保留在父(源(的组中。

我可以

做些什么来防止这种情况发生,以便我可以在不受干扰的情况下通过管道发出命令?

拦截子项中的SIGINT并执行必要的清理:

#include <boost/asio/signal_set.hpp>
#include <iostream>
void exit_handler(const boost::system::error_code&, int signal_number)
{
  std::cerr << "Signal " << signal_number << "!n";
  exit(1);
}
int main()
{
  boost::asio::io_service io_service;
  boost::asio::signal_set signals(io_service, SIGINT);
  signals.async_wait( exit_handler );
  io_service.run();
}

考虑其他信号可能也是一个好主意(HUPTERM(。