Как предотвратить процесс, открытый с помощью popen () в C ++, от получения сигнала SIGINT?

Я открыл процесс (GNUplot) из C ++ с помощью функции popen (). Когда я Ctrl + C, чтобы завершить процесс, GNUplot также получает сигнал SIGINT. Я хочу предотвратить это, поскольку это отрицательно сказывается на том, что я делаю. (Я предпочитаю обрабатывать сигнал с помощью собственной функции обработчика сигнала). Как я могу это сделать?

Я строю сюжет, используя plot '-' команда и перебрать все значения, которые я хочу построить. Если gnuplot получает SIGINT в середине, он может перестать строить в середине, не завершив весь график. Я хочу завершить весь сюжет. Это неблагоприятный эффект, который я имею.

0

Решение

POPEN (3) работает новая оболочка /bin/sh -c в командной строке.

trap встроенная из оболочки идет обработка сигналов; с пустым первым аргументом он игнорирует его. Так что вы могли бы сделать

 FILE* f = popen("trap '' TERM INT; gnuplot", "w");

КСТАТИ, POSIX trap требует, чтобы сигналы были названы без SIG префикс.

Но это не сработает, так как gnuplot сам по себе эксплицитно обработка сигналов. Нет способа избежать этого вне gnuplot, Но воспользуйтесь бесплатно программное обеспечение природа gnuplotЗагрузите его исходный код, изучите его и исправьте его в соответствии со своими странными потребностями. FWIW, SIGINT а также signal появляются в нескольких местах в исходном коде gnuplot-5.0.5,

Тем не менее, вы должны рассмотреть (вместо использования popen) явно вызывать системные вызовы низкого уровня (fork, execve, pipe, dup2, waitpid, signal …). Читать Расширенное программирование в Linux для деталей.


Я сильно подозреваю, что ваш вопрос XY проблема. Вы не объясняете, какого «неблагоприятного эффекта» вы действительно хотите избежать, и я предполагаю, что вы могли бы избежать этого в противном случае.

Я строю сюжет, используя plot '-' команда и перебрать все значения, которые я хочу построить. Если gnuplot получает SIGINT в середине, он может перестать строить в середине, не завершив весь график. Я хочу завершить весь сюжет.

На самом деле вы можете настроить два или три канала (один для ввода, один для вывода, возможно, один для stderr, как видно на gnuplot сторона) для gnuplot, Вам необходимо выполнить системные вызовы низкого уровня (явные вызовы трубы (2), вилка (2) и тд и тп …). Ваша программа должна иметь некоторые цикл событий (вероятно, основано на Опрос (2)…). И вы бы отправили print "DONE" команда Гнуплот после каждого plot '-' (не забудьте инициализировать с соответствующим set print '-' или есть другая труба для STDERR из gnuplot). Ваш цикл событий затем поймает это DONE сообщение для синхронизации. Читайте также этот.

0

Другие решения

У меня была такая же проблема, как и у вас. Я использую команду tc с параметром -batch, и мне нужно поддерживать ее, пока она не выйдет после достижения лимита и не закроется. Моя проблема заключалась в том, что я запускал два асинхронных всплывающих процесса и после создания исключения второй процесс был остановлен. Много дампов памяти и т. Д. После нахождения этой проблемы и ее исправления я могу теперь обрабатывать SIGINT, SIGTERM, ctrl + c без tc process, ничего не зная об этом. Не нужно ловушек или чего-то подобного.

0

По вопросам рекламы [email protected]