Щоб відповісти на ваше друге запитання першим: 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
, а не лише типовим stdout.
Запускається виключенням із процесора
Це означає, що ваша програма намагалася зробити щось не так.
SIGILL
означає незаконну чи невідому інструкцію процесора. Це може статися, якщо ви, наприклад, спробували отримати доступ до портів вводу / виводу процесора безпосередньо.
SIGFPE
означає, що сталася помилка з апаратної математики; швидше за все, програма намагалася розділити на нуль.
SIGSEGV
означає, що ваша програма намагалася отримати доступ до незробленої області пам'яті.
SIGBUS
означає, що програма якось іншим чином отримала доступ до пам'яті; Я не буду вникати в деталі цього резюме.
Процес взаємодії
SIGPIPE
трапляється, якщо ви спробуєте записати в трубку після того, як зчитувач труб закрив їх кінець. Див man 7 pipe
.
SIGCHLD
трапляється, коли дочірній процес, який ви створили, або припиняється, або призупиняється ( SIGSTOP
або схожим).
Корисно для самосигналізації
SIGABRT
зазвичай викликається програмою, яка викликає abort()
функцію, і за замовчуванням викликає дамп ядра. Сортування "кнопки паніки".
SIGALRM
викликається alarm()
системним викликом, який призведе до того, що ядро доставить a SIGALRM
програмі через задану кількість секунд. Дивіться man 2 alarm
і man 2 sleep
.
SIGUSR1
і SIGUSR2
використовуються, проте програма подобається. Вони можуть бути корисні для сигналізації між процесами.
Надіслано адміністратором
Ці сигнали зазвичай надсилаються з командного рядка, через kill
команду, fg
або bg
у випадку з SIGCONT
.
SIGKILL
і SIGSTOP
є розблокованими сигналами. Перший завжди припиняє процес негайно; другий призупиняє процес.
SIGCONT
відновлює призупинений процес.
SIGTERM
це придатна версія SIGKILL
.