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

Несколько важных сигналов (см. список в signal(7)):

  • SIGSTOP: приостановить процесс;
  • SIGCONT: возобновить работу приостановленного процесса;
  • SIGHUP: завершить процесс, потому что терминал, в котором он был запущен, отключился;
  • SIGTERM: завершить работу процесса, дав ему шанс сделать что-то ещё (например, убрать за собой созданные временные файлы);
  • SIGSEGV: сообщить процессу, что он попытался получить доступ к памяти, на которую не имеет прав (segmentation fault);
  • SIGKILL: убить процесс, не дав ему шанс сделать ещё что-либо.

Некоторые сигналы процесс может обработать (SIGTERM, SIGSEGV), некоторые не может (SIGKILL).

Сигналы может послать сама ОС (как, например, SIGSEGV) либо же другой процесс, например, kill(1).

Послать послать SIGTERM процессу pid_жертвы

kill pid_жертвы

убить насмерть процесс pid_жертвы

kill -kill pid_жертвы 

Например, если устали ждать от dd пока что-нибудь произойдёт и хочется узнать, как идут дела, то можно послать SIGUSR1, чтобы dd вывел текущий прогресс:

kill -usr1 $(pgrep '^dd$')

Здесь pgrep возвращает список всех PID процессов, чьё имя является dd.

То, что SIGSEGV можно обработать, означает, что в ваших программах на C++ можно, например, игнорировать segmentation fault! Эта техника может использоваться, например, в программах, которые используют ресурсы, распределённые между разными компьютерами: пытаемся залезть в память, где что-то должно лежать, и, если оно там не лежит, ОС сообщит о segmentation fault, в ответ на что просто обращаемся к удалённому компьютеру, загружаем из него нужные нам данные и продолжаем как ни в чём ни бывало!