2

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

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

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

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

1 回答 1

1

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

它本身不是传播,而是当您在 POSIX 终端中键入Ctrl+时,信号会广播到终端前台进程组的所有进程。进程组由 shell 管理,默认情况下,分叉处理的保留在父组(source)中。CSIGINT

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

拦截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();
}

考虑其他信号可能是个好主意(HUP, TERM)。

于 2018-04-11T12:42:27.690 回答