Сигналы


Сигналы

Существует интерфейс, который предоставляет операционная система: можно послать процессу сигнал, из-за чего этот процесс переключится на выполнение обработчика сигнала.

Несколько важных сигналов (см. список в 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, в ответ на что просто обращаемся к удалённому компьютеру, загружаем из него нужные нам данные и продолжаем как ни в чём ни бывало!