Когда в процесс поступает несколько сигналов, каков порядок между процессами, обрабатывающими сигналы? - PullRequest
0 голосов
/ 01 июня 2018

Когда в процесс поступает несколько сигналов, каков порядок между процессами, обрабатывающими сигналы?

Какая структура данных используется для хранения сигналов, которые поступили в процесс, но еще не были доставлены?

Например, из APUE

Со времени процессагруппа становится сиротой, когда родитель определяет, POSIX.1 требует, чтобы каждому процессу во вновь потерянной группе процессов, который остановлен (как наш ребенок), был послан сигнал зависания (SIGHUP) , за которым следует сигнал продолжения(SIGCONT)

Это приводит к продолжению ребенка, после обработки сигнала зависания.Действие по умолчанию для сигнала зависания - завершить процесс, поэтому мы должны предоставить обработчик сигнала для перехвата сигнала.Поэтому мы ожидаем, что printf в функции sig_hup появится перед printf в функции pr_ids.

Как https://stackoverflow.com/a/17769300/156458 говорит

SIGHUP не может быть доставленопока казнь ребенка не возобновится.Когда процесс останавливается, вся доставка сигнала приостанавливается, за исключением SIGCONT и SIGKILL.

Итак, SIGHUP действительно приходит first , но не может быть обработан до SIGCONT пробуждает выполнение процесса.

SIGHUP приходит перед SIGCONT при остановленном процессе.SIGHUP не может быть доставлен, в то время как SIGCONT может быть.

Обрабатывается ли SIGCONT до или после SIGHUP?Первая цитата, кажется, говорит «после», в то время как вторая цитата, кажется, говорит «до», до «до».

Если «до»:

  • Как SIGCONT может быть организован так, чтобы он опережал SIGHUP для доставки?

  • Как SIGHUP не может быть отброшен, когда SIGCONF переходит до того, как будет получен результат?

Реализовано ли это выше на основе некоторых структур данных, таких какОчередь FIFO или стек FILO?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Добавить к ответу mcdowella:

1) Особенности "обработки сигналов" могут варьироваться от платформы к платформе

2) В конкретном случае Linux:

http://man7.org/linux/man-pages/man7/signal.7.html

Linux поддерживает как надежные сигналы POSIX (в дальнейшем «стандартные сигналы»), так и сигналы реального времени POSIX.

3) См. Также:

0 голосов
/ 04 июня 2018

SIGCONT имеет особую семантику.

Независимо от того, пойман ли SIGCONT, проигнорирован или имеет расположение по умолчанию , его генерация очистит все ожидающие сигналы остановки и возобновит выполнение остановленного процесса.,[ IEEE Std 1003.1-2017 ] Опять же, это возобновление происходит до любых других сигналов и даже до вызова обработчика SIGCONT (если есть).

(Эта специальная «лишенная» семантика имеет смысл. Чтобы процесс выполнял обработчик сигнала, сам процесс должен выполняться.)

POSIX здесь более понятен, чем APUE, говоря, что "[t]Действие по умолчанию для SIGCONT - возобновить выполнение в том месте, где процесс был остановлен, после первой обработки любых ожидающих разблокированных сигналов. "

Как уже упоминалось, фактический порядок доставки ожидающих сигналовзависит от реализации.Linux, по крайней мере, доставляет базовые сигналы UNIX в порядке возрастания чисел.

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

#define _POSIX_SOURCE
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

static int signals[] = { SIGSTOP, SIGURG, SIGUSR1, SIGHUP, SIGCONT, 0 };

static void
handler(int signo) {
  // XXX not async-signal-safe
  printf("<signal %d>\n", signo);
}

int
main(int argc, char **argv) {
  int *sig = signals;
  struct sigaction sa = { .sa_flags = 0, .sa_handler = handler };

  sigfillset(&sa.sa_mask);

  sig++; // can't catch SIGSTOP
  while (*sig) {
    sigaction(*sig, &sa, NULL); // XXX error check
    sig++;
  }

  if (fork() == 0) { // XXX error check
    sleep(2);        // faux synchronization - let parent pause()

    sig = signals;
    while (*sig) {
      printf("sending signal %d\n", *sig);
      kill(getppid(), *sig);
      sig++;
    }
    exit(0);
  }

  pause();

  return 0;
}

Для меня это выводит

sending signal 19
sending signal 23
sending signal 10
sending signal 1
sending signal 18
<signal 1>
<signal 10>
<signal 18>
<signal 23>
0 голосов
/ 01 июня 2018

Ситуация, вероятно, запутана различными реализациями и введением сигналов реального времени POSIX.http://man7.org/linux/man-pages/man7/signal.7.html говорит, что сигналы реального времени отличаются от сигналов старого стиля

Сигналы реального времени доставляются в гарантированном порядке.Несколько сигналов реального времени одного типа доставляются в том порядке, в котором они были отправлены.Если различные сигналы реального времени отправляются процессу, они доставляются, начиная с сигнала с наименьшим номером.(То есть сигналы с низким номером имеют наивысший приоритет.) В отличие от этого, если несколько стандартных сигналов ожидают обработки, порядок их доставки не определен.

Что касается сигналов старого стиля, описанных в "Проектирование операционной системы Unix »Баха (до введения сигналов реального времени POSIX).

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

Вы можете увидеть некоторые текущие данные Linuxструктуры на https://github.com/torvalds/linux/blob/master/include/linux/sched.h. Глядя на это, я подозреваю, что растровое изображение старого стиля исчезло, и комбинация растрового изображения и связанного списка используется для обработки сигналов как старого стиля, так и сигналов POSIX в реальном времени, но я не прошел достаточнокода, чтобы быть уверенным в этом.

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