Что такое сигнал в Unix? - PullRequest
13 голосов
/ 18 января 2009

Этот комментарий смущает меня: "kill -l обычно перечисляет все сигналы". Я думал, что сигнал означает квантованное количество энергии.

[Добавлено] Пожалуйста, уточните (вычислительный) сигнал в Unix и физический сигнал. Это совершенно разные понятия?

[Добавлено] Существуют ли существенные различия между парадигмами? Одинаково ли значение в таких языках, как C, Python и Haskell? Сигнал, кажется, является общим термином.

Ответы [ 11 ]

15 голосов
/ 18 января 2009

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

Некоторые серверы Unix используют сигналы, поэтому администратор может использовать kill для отправки им сигнала, заставляя их перечитывать файл конфигурации, не требуя их перезапуска.

Для некоторых сигналов выполняются действия по умолчанию, а другие просто игнорируются. Например, при получении SIGSEGV программа завершает работу, в то время как получение SIGCHLD, означающее, что дочерний процесс умер, по умолчанию ничего не даст.

Существует стандартная функция ANSI C, устанавливающая обработчик сигнала, которая может выполнять некоторый код при получении сигнала, которая называется signal (читается в man signal). В разных версиях Unix эта функция ведет себя по-разному, поэтому ее использование не рекомендуется. Его man-страница ссылается на функцию sigaction (читай man sigaction), которая ведет себя согласованно, а также является более мощной.

13 голосов
/ 28 августа 2009

Я не могу поверить, что люди не сравнивают такие вещи, как аппаратное и программное обеспечение или в некоторых случаях подчеркивают ОС .

Сравнение сигнала и прерывания :

Разница в том, что пока прерывания отправляются в операционную система аппаратно , сигналы отправлено процессу операционной система или другими процессами. Примечание что сигналы не имеют ничего общего с программные прерывания, которые все еще отправлено аппаратным обеспечением (сам процессор, в этом случае). (источник)

Определения

  1. процесс = программа в исполнении, согласно книге ниже

Дополнительная литература

  1. сравнить сигнал с прерываниями и исключениями

  2. Книга Таненбаума "Современные операционные системы"

10 голосов
/ 19 января 2009

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

Сигналы Unix могли называться сообщениями, событиями, уведомлениями или даже выдуманным термином, таким как «лягушки». Дизайнеры просто выбрали название «сигнал», и оно застряло.

5 голосов
/ 18 января 2009

Сигнал - это сообщение либо целевому процессу, либо операционной системе о целевом процессе. Он является частью unix API (и определяется в различных стандартах POSIX).

Чтение man kill, man signal и man sigaction.

Другие вопросы SO, которые могут быть полезны:

4 голосов
/ 18 января 2009

Некоторые из моих заметок:

Позволяет асинхронную связь

  • Между процессами, принадлежащими тот же пользователь
  • Из системы в любой процесс
  • От системного менеджера к любому процессу
  • Вся связанная информация находится в самом сигнале
  • Много разных сигналов

SIGINT

  • Из системы ко всем процессам связанный с терминалом
  • Триггер: ^ C нажата
  • Обычный способ остановить запущенный процесс

SIGFPE

  • От ядра к одному процессу
  • Триггер: ошибка в операции с плавающей запятой

SIGKILL

  • Для одного процесса
  • Останавливает выполнение процесса назначения

SIGALRM

  • От ядра к одному процессу
  • Триггер: истечение таймера

SIGTERM

  • Для одного процесса
  • Рекомендует завершить процесс изящно

SIGUSR1, SIGUSR2

  • Из любого процесса в любой другой
  • Без предопределенной семантики
  • Свободно используется программистами

Отправка сигнала другому процессу

  • int kill (pid, signal_ID)

Программист может решить, что делать, когда сигнал получено

  • Использовать поведение по умолчанию
  • Игнорировать
  • Выполнить пользовательскую функцию

Обнаружение прерванной записи

if (write(fd, buff, SIZE)<0) {
  switch (errno) {
   case EINTR:
    warning(“Interrupted write\n”);
    break;
  }
}…
3 голосов
/ 18 января 2009

Сигнал - это сообщение, которое можно отправить запущенному процессу.

Например, чтобы указать Internet Daemon (inetd) перечитать файл конфигурации, ему должен быть отправлен сигнал SIGHUP.

Например, если текущий идентификатор процесса (PID) inetd равен 1234, введите: убить -SIGHUP 1234

2 голосов
/ 18 января 2009

Сигнал - это «событие, сообщение или структура данных, передаваемая между вычислительными процессами» (из Википедия ).

1 голос
/ 18 января 2009

В этом случае сигнал означает «сообщение». Таким образом, он отправляет сообщение процессу, который может сказать процессу делать разные вещи.

0 голосов
/ 04 апреля 2018
  1. Сигнал - это прерывание, которое используется для информирования процесса о том, что произошло конкретное событие.

  2. Сигнал может быть отправлен ядром запущенному процессу или одним процессом другому процессу.

  3. В командах bash kill и killall используется для отправки сигнала.

0 голосов
/ 26 марта 2017

Сигнал - это, в основном, прерывание, которое сообщает процессу, что произошло определенное событие.

Сигнал обычно отправляется ядром, в то время как процесс также может отправлять сигнал другому процессу (зависит от разрешения и всех) с помощью команд kill и killall, а процесс может отправлять сигнал самому себе с помощью повышения.

Основное использование сигнала:

  1. Для обработки прерывания.

  2. Синхронизация процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...