Я использую boost::process v. 1.65.1 в главном приложении для Linux, чтобы создать несколько объектов boost::process::child и управлять данными, которыми обмениваются через boost::process::std_in и boost::process::std_out, то есть каналы.
Когда мое главное приложение получает CTRL-C, отправленный консолью, я вижу, что дочерний элемент также получает сигнал CTRL-C.
Чтобы завершить работу моего ребенка, я бы предпочел отправить команду clear через канал, но когда я это сделаю, сигнал уже будет распространен. На самом деле один ребенок видит команду, другой нет и видит сигнал.





Is this signal propagation the normal behavior?
Это не распространение как таковое, это то, что когда вы набираете Ctrl + C в терминале POSIX, сигнал SIGINT транслируется на все процессы терминала группа процессов переднего плана. Группы процессов управляются оболочкой, и по умолчанию обработанные ответвления остаются в родительской группе (источник).
What I can do to prevent this to happen so that I can issue my command via pipe without interference?
Перехватите 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).
Спасибо за ваш ответ. На самом деле у меня 2 вопроса. Во-первых, это. Я хочу, чтобы мое приложение завершало работу по команде, полученной через канал, поэтому, вероятно, в этом обработчике сигнала я не должен вызывать std :: exit. Второй, более крупный, - это тот, который я использую для чтения с консоли в linux. Если мне нравится, как вы говорите, «опрос», который должен читать команду STOP, возвращается по сигналу и не выполняет чтение. Что я могу сделать в этом случае? Как вы думаете, можно ли использовать маскировку сигнала? Я никогда ими не пользовался, но понял, что это мешает полностью игнорировать сигнал.