我在Linux的主应用程序中使用boost::process
v.1.6.5.1创建了少量boost::process::child
个对象,并管理通过boost::process::std_in
和boost::process::std_out
交换的数据,即管道。
当我的主应用程序收到控制台发送的CTRL-C时,我看到孩子也收到了CTRL-C信号。
为了终止我的孩子,我宁愿通过管道发送清除命令,但是当我这样做时,信号已经传播了。实际上有些孩子看到其他的命令并没有看到信号。
答案 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();
}
考虑其他信号也是个好主意(HUP
,TERM
)。