信号从boost :: process传播到boost :: child

时间:2018-04-11 10:59:30

标签: c++ linux signals boost-process

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  

此信号传播是否正常?

它本身不是传播,当你在POSIX终端输入 Ctrl + C 时,SIGINT信号被广播到终端的前台进程组所有进程。进程组由shell管理,默认情况下,forked处理保留在父组(source)中。

  

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

拦截孩子的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)。