Сигналы
Сигналы
Существует интерфейс, который предоставляет операционная система: можно послать процессу сигнал, из-за чего этот процесс переключится на выполнение обработчика сигнала.
Несколько важных сигналов (см. список в signal(7)
):
- SIGSTOP: приостановить процесс;
- SIGCONT: возобновить работу приостановленного процесса;
- SIGHUP: завершить процесс, потому что терминал, в котором он был запущен, отключился;
- SIGTERM: завершить работу процесса, дав ему шанс сделать что-то ещё (например, убрать за собой созданные временные файлы);
- SIGSEGV: сообщить процессу, что он попытался получить доступ к памяти, на которую не имеет прав (segmentation fault);
- SIGKILL: убить процесс, не дав ему шанс сделать ещё что-либо.
Некоторые сигналы процесс может обработать (SIGTERM, SIGSEGV), некоторые не может (SIGKILL).
Сигналы может послать сама ОС (как, например, SIGSEGV) либо же другой процесс, например, kill(1)
.
kill
Послать послать SIGTERM процессу pid_жертвы
kill pid_жертвы
убить насмерть процесс pid_жертвы
kill -kill pid_жертвы
Например, если устали ждать от dd пока что-нибудь произойдёт и хочется узнать, как идут дела, то можно послать SIGUSR1, чтобы dd вывел текущий прогресс:
kill -usr1 $(pgrep '^dd$')
Здесь pgrep
возвращает список всех PID процессов, чьё имя является dd.
Обработка SIGSEGV
Зачем иметь возможность обрабатывать SIGSEGV
?
То, что SIGSEGV можно обработать, означает, что в ваших программах на C++ можно, например, игнорировать segmentation fault!
Эта техника может использоваться, например, в программах, которые используют ресурсы, распределённые между разными компьютерами: пытаемся залезть в память, где что-то должно лежать, и, если оно там не лежит, ОС сообщит о segmentation fault, в ответ на что просто обращаемся к удалённому компьютеру, загружаем из него нужные нам данные и продолжаем как ни в чём ни бывало!