<<
>>

Возникновение сигнала SIGPIPE при попытке записи в pipe или FIFO, который никто не собирается читать

В материалах семинара 5 (раздел «Особенности поведения вызовов read() и write() для pip’a») при обсуждении работы с pip'aMH и FIFO мы говорили, что для них системные вызовы read () и write () имеют определенные особенности поведения.
Одной из таких особенностей является получение сигнала SIGPIPE процессом, который пытается записывать информацию в pipe или в FIFO в том случае, когда читать ее уже некому (нет ни одного процесса, который держит соответствующий pipe или FI FO открытым для чтения). Реакция по умолчанию на этот сигнал — прекратить работу процесса. Теперь мы уже можем написать корректную обработку этого сигнала пользователем, например, для элегантного прекращения работы пишущего процесса. Однако для полноты картины необходимо познакомиться с особенностями поведения некоторых системных вызовов при получении процессом сигналов во время их выполнения.

По ходу нашего курса мы представили читателям ряд системных вызовов, которые могут во время выполнения блокировать процесс. К их числу относятся системный вызов open () при открытии FIFO, системные вызовы read() и write () при работе с pip'aMH и FIFO, системные вызовы msgsnd () и msgrcv () при работе с очередями сообщений, системный вызов semop () при работе с семафорами и т. д. Что произойдет с процессом, если он, выполняя один из этих системных вызовов, получит какой-либо сигнал? Дальнейшее поведение процесса зависит от установленной для него реакции на этот сигнал:

• Если реакция на полученный сигнал была «игнорировать сигнал» (независимо оттого, установлена она по умолчанию или пользователем с помощью системного вызова signal ()), то поведение процесса не изменится.

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

• Если реакция процесса на сигнал заключается в выполнении пользовательской функции, то процесс выполнит эту функцию (если он находился в состоянии ожидание, он попадет в состояние готовность и затем в состояние исполнение) и вернется из системного вызова с констатацией ошибочной ситуации (некоторые системные вызовы позволяют операционной системе после выполнения обработки сигнала вновь вернуть процесс в состояние ожидания). Отличить такой возврат от действительно ошибочной ситуации можно с помощью значения системной переменной errno, которая в этом случае примет значение EINTR (для вызова write и сигнала SIGPIPE соответствующее значение в порядке исключения будет EPIPE).

После этого краткого обсуждения становится до конца ясно, как корректно обработать ситуацию «никто не хотел прочитать» для системного вызова write (). Чтобы пришедший сигнал SIGPIPE не завершил работу нашего процесса по умолчанию, мы должны его обработать самостоятельно (функция-обработчик при этом может быть и пустой!). Но этого мало. Поскольку нормальный ход выполнения системного вызова был нарушен сигналом, мы вернемся из него с отрицательным значением, которое свидетельствует об ошибке. Проанализировав значение системной переменной errno на предмет совпадения со значением EPIPE, мы можем отличить возникновение сигнала SIGPIPE от других ошибочных ситуаций (неправильные значения параметров и т. д.) и грациозно продолжить работу программы.

<< | >>
Источник: В.Е. Карпов К.А. Коньков. Основы операционных систем. 2005 {original}

Еще по теме Возникновение сигнала SIGPIPE при попытке записи в pipe или FIFO, который никто не собирается читать:

  1. Библия, которую можно читать детям
  2. Статья 377. Право на земельный участок при приобретении жилого дома, здания или сооружения, которые размещенные на нем
  3. ПРЕКРАСНЫЕ ВПЕЧАТЛЕНИЯ, О КОТОРЫХ ВАМ НИКТО НЕ ГОВОРИЛ
  4. Статья 388. Незаконные действия в отношении имущества, на которое наложен арест или которое описано или подлежит конфискации
  5. Глава 1. Метаязык, или Как читать между строк.
  6. Правило слежения за признаками поведения лиц, собирающихся совершить или совершивших преступление.
  7. Статья 400. Обязанность недобросовестного владельца немедленно возвратить имущество лицу, которое имеет на него право собственности или другое право или которое является добросовестным владельцем
  8. Мы в Телосе так уважаем себя, что никто из нас никогда не снизойдёт до таких отношений, которые удовлетворительны на всех уровнях менее, чем на сто процентов.
  9. СИГНАЛ
  10. Статья 65. Опека или попечительство над физическим лицом, относительно которого не назначен опекун или попечитель