2016-11-19 2 views
-2

У меня недавно возникла проблема с сигналами. Я хотел бы написать программу на C, которая будет печатать что-либо после отправки сигнала процессу. Например: если я отправлю SIGTERM в мой процесс (который является просто запущенной программой), я хочу, чтобы программа печатала, например, «убивая процесс отказа», вместо того, чтобы убивать процесс. Итак, как это сделать? Как заставить процесс поймать и изменить значение такого сигнала. Также у меня есть вопрос, есть ли возможность убить процесс init (я знаю, что это какой-то глупый вопрос, но мне было интересно, как linux имеет дело с таким сигналом и как он будет выглядеть технически, если я наберу: sudo kill -9 1.Как изменить значение программы SIGTERM в C

+2

checkout 'sigaction' для перехвата SIGTERM или SIGINT или других сигналов. –

+2

Вы не можете изменить значение SIGTERM как таковое; все, что вы можете сделать, это изменить реакцию вашей программы на получение сигнала. Есть некоторые сигналы (SIGKILL и SIGSTOP), которые ваш процесс (программа) ничего не может сделать - процесс не может изменить реакцию по умолчанию на эти сигналы. –

ответ

0

не используйте обработчик сигнала для печати. ​​Вы можете установить переменную типа volatile sig_atomic_t вместо этого, и ваш основной поток проверить это (см this пример).

Когда основной поток не имеет ничего делать не надо (который должен быть в большинстве случаев), пусть он блокирует вызов функции блокировки (например, sleep()), который сразу проснется, когда принимается сигнал (и установите errno на номер EINTR).


C++ Гоча: В отличие от функции C sleep(), std::this_thread::sleep_for() (в последних версиях Glibc) делает не просыпаются при получении сигнала.


Что касается, если это возможно, чтобы убить PID 1 см this question. Ответ, кажется, нет, но я помню, что Linux очень сердито, как только я загрузился с init =/bin/bash и позже вышел из этой оболочки, пришлось перезагрузиться.

Если вы ищете проблемы, лучше kill pid -1.

+0

Недостаточно «volatile». Либо мы '_Atomic()' переменные, либо 'sig_atomic_t'. – Olaf

+0

@Olaf, Спасибо, добавил sig_atomic_t. – user2394284

+0

Учитывая, что это для Linux, а не для стандартного C, в обработчике сигналов может быть сделано гораздо больше вещей, чем разрешено в стандартном C. Список системных вызовов, которые можно использовать в [Как избежать использования 'printf() 'в обработчике сигналов] (http://stackoverflow.com/questions/16891019/), например. Список эклектичен; 'write()' разрешен, но 'strlen()' не является официально. В стандарте POSIX есть более подробная информация - в [Концепции сигналов] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04), например. –

Смежные вопросы