Я открыл процесс (GNUplot) из C ++ с помощью функции popen (). Когда я Ctrl + C, чтобы завершить процесс, GNUplot также получает сигнал SIGINT. Я хочу предотвратить это, поскольку это отрицательно сказывается на том, что я делаю. (Я предпочитаю обрабатывать сигнал с помощью собственной функции обработчика сигнала). Как я могу это сделать?
Я строю сюжет, используя plot '-'
команда и перебрать все значения, которые я хочу построить. Если gnuplot получает SIGINT в середине, он может перестать строить в середине, не завершив весь график. Я хочу завершить весь сюжет. Это неблагоприятный эффект, который я имею.
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
сообщение для синхронизации. Читайте также этот.
У меня была такая же проблема, как и у вас. Я использую команду tc с параметром -batch, и мне нужно поддерживать ее, пока она не выйдет после достижения лимита и не закроется. Моя проблема заключалась в том, что я запускал два асинхронных всплывающих процесса и после создания исключения второй процесс был остановлен. Много дампов памяти и т. Д. После нахождения этой проблемы и ее исправления я могу теперь обрабатывать SIGINT, SIGTERM, ctrl + c без tc process, ничего не зная об этом. Не нужно ловушек или чего-то подобного.