Сначала отвечу на ваш второй вопрос: SIGSTOP
и SIGKILL
не может быть пойман приложением, но любой другой сигнал может, даже SIGSEGV
. Это свойство полезно для отладки - например, при правильной поддержке библиотеки вы можете прослушать SIGSEGV
и сгенерировать обратную трассировку стека, чтобы показать, где именно произошла ошибка.
Официальное слово (в любом случае для Linux) о том, что делает каждый сигнал, можно получить, набрав man 7 signal
в командной строке Linux. http://linux.die.net/man/7/signal содержит ту же информацию, но таблицы труднее читать.
Однако, без некоторого опыта с сигналами, из коротких описаний трудно понять, что они делают на практике, поэтому вот моя интерпретация:
Срабатывает от клавиатуры
SIGINT
происходит , когда вы попали CTRL+C
.
SIGQUIT
запускается CTRL+\
и сбрасывает ядро.
SIGTSTP
приостанавливает вашу программу, когда вы нажимаете CTRL+Z
. В отличие от этого SIGSTOP
, его можно отловить, что дает программам vi
возможность перевести терминал в безопасное состояние перед тем, как приостановить работу.
Терминальные взаимодействия
SIGHUP
(«Зависание») - это то, что происходит, когда вы закрываете свой xterm (или иным образом отключаете терминал) во время работы вашей программы.
SIGTTIN
и SIGTTOU
приостановить вашу программу, если она пытается читать или записывать в терминал, пока он работает в фоновом режиме. Чтобы SIGTTOU
это произошло, я думаю, что программа должна писать /dev/tty
, а не просто стандартный вывод.
Вызывается исключением процессора
Это означает, что ваша программа пыталась сделать что-то не так.
SIGILL
означает незаконную или неизвестную инструкцию процессора. Это может произойти, например, если вы попытались получить прямой доступ к портам ввода-вывода процессора.
SIGFPE
означает, что произошла аппаратная математическая ошибка; скорее всего программа пыталась делить на ноль.
SIGSEGV
означает, что ваша программа пыталась получить доступ к не отображенной области памяти.
SIGBUS
означает, что программа неправильно обращалась к памяти каким-либо другим способом; Я не буду вдаваться в подробности для этого резюме.
Процесс взаимодействия
SIGPIPE
произойдет, если вы попытаетесь записать в канал после того, как читатель канала закроет их конец. См man 7 pipe
.
SIGCHLD
происходит, когда созданный вами дочерний процесс либо завершается, либо приостанавливается ( SIGSTOP
или аналогичным образом).
Полезно для самосигнализации
SIGABRT
обычно вызывается программой, вызывающей abort()
функцию, и по умолчанию вызывает дамп ядра. Вроде "кнопка паники".
SIGALRM
вызвано alarm()
системным вызовом, который заставит ядро доставить SIGALRM
программу через указанное количество секунд. Смотрите man 2 alarm
и man 2 sleep
.
SIGUSR1
и SIGUSR2
используются, однако программа любит. Они могут быть полезны для сигнализации между процессами.
Отправлено администратором
Эти сигналы обычно отправляются из командной строки, с помощью kill
команды или fg
или bg
в случае SIGCONT
.
SIGKILL
и SIGSTOP
являются неблокируемыми сигналами. Первый всегда завершает процесс немедленно; вторая приостанавливает процесс.
SIGCONT
возобновляет приостановленный процесс.
SIGTERM
это ловимая версия SIGKILL
.