У меня недавно возникла проблема с сигналами. Я хотел бы написать программу на C, которая будет печатать что-либо после отправки сигнала процессу. Например: если я отправлю SIGTERM в мой процесс (который является просто запущенной программой), я хочу, чтобы программа печатала, например, «убивая процесс отказа», вместо того, чтобы убивать процесс. Итак, как это сделать? Как заставить процесс поймать и изменить значение такого сигнала. Также у меня есть вопрос, есть ли возможность убить процесс init (я знаю, что это какой-то глупый вопрос, но мне было интересно, как linux имеет дело с таким сигналом и как он будет выглядеть технически, если я наберу: sudo kill -9 1
.Как изменить значение программы SIGTERM в C
ответ
не используйте обработчик сигнала для печати. Вы можете установить переменную типа 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.
Недостаточно «volatile». Либо мы '_Atomic()' переменные, либо 'sig_atomic_t'. – Olaf
@Olaf, Спасибо, добавил sig_atomic_t. – user2394284
Учитывая, что это для 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), например. –
- 1. Ловля SIGTERM в C
- 2. Как изменить тему программы
- 3. C# WPF изменить значок программы
- 4. PHP SIGTERM в CLI
- 5. haskells bracket on SIGTERM
- 6. Как поднять SIGTERM в Windows
- 7. Как обрабатывать SIGTERM
- 8. манипулятор sigterm в OSx
- 9. C# Изменить местоположение файла для следующей программы:
- 10. Как изменить личное значение bool C++
- 11. Как изменить название программы UAC?
- 12. Изменить значение ссылки в C#
- 13. «Проблема SIGTERM»
- 14. C Изменить значение в Союзе
- 15. Включить SIGTERM в SecurityManager
- 16. Изменить строковое значение. C#
- 17. Как изменить значение указателя в C
- 18. Как изменить значение в C# ConcurrentQueue
- 19. Как изменить значение в классе? (C++)
- 20. Как изменить значение progressbar в C#?
- 21. Как изменить значение элемента xml в C#?
- 22. CATCH SIGTERM IN ERLANG
- 23. Изменить цвет фона другой программы из C++-программы
- 24. варианта в C++ программы
- 25. C++: изменить шрифт простой выходной программы
- 26. Как передать значение из основной программы в класс в C#
- 27. Как изменить значение элемента управления из другой программы (процесса)
- 28. Как остановить SIGTERM и SIGKILL?
- 29. изменить стек на лету программы c
- 30. Юлия 0.4.7: Как поймать SIGTERM
checkout 'sigaction' для перехвата SIGTERM или SIGINT или других сигналов. –
Вы не можете изменить значение SIGTERM как таковое; все, что вы можете сделать, это изменить реакцию вашей программы на получение сигнала. Есть некоторые сигналы (SIGKILL и SIGSTOP), которые ваш процесс (программа) ничего не может сделать - процесс не может изменить реакцию по умолчанию на эти сигналы. –