Распространение сигнала от 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.

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

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

Ответы 1

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, возвращается по сигналу и не выполняет чтение. Что я могу сделать в этом случае? Как вы думаете, можно ли использовать маскировку сигнала? Я никогда ими не пользовался, но понял, что это мешает полностью игнорировать сигнал.

Abruzzo Forte e Gentile 12.04.2018 13:30

Другие вопросы по теме