распространение сигнала от boost :: process до boost :: child

Я использую boost::process v. 1.65.1 в главном приложении для Linux для создания нескольких boost::process::child объектов и управления данными, которыми обмениваются через boost::process::std_in и boost::process::std_out, то есть каналы.

Когда мое главное приложение получает CTRL-C, отправленный консолью, я вижу, что дочерний элемент также получает сигнал CTRL-C.

Чтобы завершить работу моего ребенка, я бы предпочел отправить команду очистки через канал, но когда я это сделаю, сигнал уже будет распространен. На самом деле Некоторые дети видят команду, другие нет и видят сигнал.

  1. Это распространение сигнала нормальное поведение?
  2. Что я могу сделать, чтобы этого не произошло, чтобы я мог беспрепятственно отдавать свою команду по каналу?

person Abruzzo Forte e Gentile    schedule 11.04.2018    source источник


Ответы (1)


Это распространение сигнала нормальное поведение?

Это не распространение как таковое, это когда вы набираете Ctrl + C в терминале POSIX, сигнал 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();
}

Вероятно, неплохо подумать и о других сигналах (HUP, TERM).

person rustyx    schedule 11.04.2018
comment
Спасибо за ваш ответ. На самом деле у меня 2 вопроса. Во-первых, это. Я хочу, чтобы мое приложение завершало работу по команде, полученной через канал, поэтому, вероятно, в этом обработчике сигнала я не должен вызывать std :: exit. Второй, более крупный, я использую для чтения с консоли в linux. Если мне нравится, как вы говорите, «опрос», который должен читать команду STOP, возвращается по сигналу и не выполняет чтение. Что я могу сделать в этом случае? Как вы думаете, можно ли использовать маскировку сигнала? Я никогда ими не пользовался, но понял, что это мешает полностью игнорировать сигнал. - person Abruzzo Forte e Gentile; 12.04.2018