Что заставляет различные сигналы быть отправленными?

автоматическая pushd функция zsh:

setopt autopushd

и вместе с этим:

alias dirs='dirs -v'

Так, чтобы в любое время, я мог ввести dirs и я получаю историю того, где я был:

0   /var/log
1   /tmp
2   /usr/local/bin
3   ~

и затем я могу cd назад в, например. /usr/local/bin путем ввода:

cd ~2
29
08.01.2018, 18:22
2 ответа

В дополнение к вызову процессов kill(2), некоторые сигналы отправляются ядром (или иногда самим процессом) при различных обстоятельствах:

  • Терминальные драйверы отправляют сигналы, соответствующие различным событиям:
    • Уведомления о нажатии клавиши: SIGINT (вернитесь к основному циклу) на Ctrl+C, SIGQUIT (выход сразу) на Ctrl + \, SIGTSTP (приостановите) на Ctrl+Z. Ключи могут быть изменены с stty команда.
    • SIGTTIN и SIGTTOU отправляются, когда фоновый процесс пытается читать или записать в его терминал управления.
    • SIGWINCH отправляется, чтобы сигнализировать, что размер окна терминала изменился.
    • SIGHUP отправляется, чтобы сигнализировать, что терминал исчез (исторически, потому что Ваш модем завис, в наше время обычно, потому что Вы закрыли окно эмулятора терминала).
  • Некоторые прерывания процессора могут сгенерировать сигнал. Детали являются архитектурой и системно-зависимый; вот типичные примеры:
    • SIGBUS для невыровненной памяти доступа;
    • SIGSEGV для доступа к неотображенной странице;
    • SIGILL для запрещенной команды (плохой код операции);
    • SIGFPE для инструкции с плавающей точкой с неверными аргументами (например. sqrt(-1)).
  • Много сигналов уведомляют целевой процесс, что некоторое системное событие произошло:
    • SIGALRM уведомляет, что истек таймер, установленный процессом. Таймеры могут быть установлены с alarm, setitimer и другие.
    • SIGCHLD уведомляет процесс, что один из его детей умер.
    • SIGPIPE сгенерирован, когда процесс пытается записать в канал, когда конец чтения был закрыт (идея - это, если Вы работаете foo | bar и bar выходы, foo уничтожается a SIGPIPE).
    • SIGPOLL (также названный SIGIO) уведомляет процесс, что произошло pollable событие. POSIX указывает pollable события, зарегистрированные через I_SETSIG ioctl. Много систем позволяют pollable события на любом дескрипторе файла, устанавливают через O_ASYNC fcntl флаг. Связанный сигнал SIGURG, который уведомляет относительно срочных данных по устройству (зарегистрированный через I_SETSIG ioctl) или сокет.
    • В некоторых системах, SIGPWR отправляется во все процессы, когда UPS сигнализирует, что сбой питания неизбежен.

Эти списки не являются исчерпывающими. Стандартные сигналы определяются в signal.h.

Большинство сигналов может быть поймано и обработано (или проигнорировано) приложением. Только два портативных сигнала, которые не могут быть пойманы, SIGKILL (просто умрите), и STOP (остановите выполнение).

SIGSEGV (отказ сегментации) и его кузен SIGBUS (ошибка шины) может быть поймана, но это - плохая идея, если Вы действительно не знаете то, что Вы делаете. Распространенное приложение для ловли их печатает отслеживание стека или другую отладочную информацию. Больше усовершенствованного приложения должно реализовать некоторое незавершенное управление памятью, или захватывать плохие инструкции в механизмах виртуальной машины.

Наконец, позвольте мне упомянуть что-то, что не является сигналом. Когда Вы нажимаете Ctrl+D в начале строки в программе, это читает вход из терминала, это говорит программе, что конец входного файла достигнут. Это не сигнал: это передается через ввод/вывод API. Как Ctrl+C и друзья, ключ может быть настроен с stty.

43
27.01.2020, 19:38
  • 1
    И SIGHUP, Ваш модем завис. :-) –  Keith 24.01.2011, 09:10
  • 2
    Другая вещь отметить: SIGFPE, несколько неинтуитивно, также сообщен на целочисленном делении на нуль, и иногда на переполнении целого числа со знаком. –  ephemient 24.01.2011, 21:53

Отвечать на Ваш второй вопрос сначала: SIGSTOP и SIGKILL не может быть пойман приложением, но любой сигнал может, даже SIGSEGV. Это свойство полезно для отладки - например, с правильной поддержкой библиотеки, Вы могли прислушаться SIGSEGV и генерируйте след стека для показа, где это segfault произошло.

Официальное слово (для Linux, так или иначе) на том, что делает каждый сигнал, доступно путем ввода man 7 signal из командной строки Linux. http://linux.die.net/man/7/signal имеет ту же информацию, но таблицы более трудно считать.

Однако без некоторого опыта с сигналами, трудно знать из кратких описаний, что они делают на практике, таким образом, вот моя интерпретация:

Инициированный с клавиатуры

  • SIGINT происходит, когда Вы совершаете нападки CTRL+C.
  • SIGQUIT инициирован CTRL+\, и ядро дампов.
  • SIGTSTP приостанавливает Вашу программу, когда Вы совершаете нападки CTRL+Z. В отличие от этого, SIGSTOP, это catchable, который дает программы как vi шанс сбросить терминал к безопасному состоянию прежде, чем временно отстранить себя.

Терминальные взаимодействия

  • SIGHUP ("зависание") - то, что происходит, когда Вы закрываете свой xterm (или иначе разъединяете терминал), в то время как Ваша программа работает.
  • SIGTTIN и SIGTTOU приостановите свою программу, если она пытается читать из или записать в терминал, в то время как она работает в фоновом режиме. Для SIGTTOU для случая я думаю потребности программы записать в /dev/tty, не просто значение по умолчанию stdout.

Инициированный исключением ЦП

Они означают, что Ваша программа пыталась сделать что-то не так.

  • SIGILL означает недопустимую или неизвестную инструкцию по процессору. Это могло бы произойти, если бы Вы пытались получить доступ к портам процессора I/O непосредственно, например.
  • 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 unblockable сигналы. Первое всегда сразу завершает процесс; второе приостанавливает процесс.
  • SIGCONT возобновляет приостановленный процесс.
  • SIGTERM catchable версия SIGKILL.
19
27.01.2020, 19:38
  • 1
    Какой сигнал отправляется когда shutdown команда используется? –  Nathan Osman 24.01.2011, 02:51
  • 2
    Это зависит от сценариев завершения работы. Как правило, SIGTERM отправляется сначала, сопровождается задержкой, сопровождаемой SIGKILL. В принципе, для трудного, непосредственного завершения работы, ядро не должно отправлять сигнал вообще; это могло просто прекратить выполнять процесс. –  Jander 24.01.2011, 08:28

Теги

Похожие вопросы