Отправить поведение на сломанной трубе - PullRequest
3 голосов
/ 06 июля 2010

Когда я писал простое приложение сервер-клиент, у меня возник этот вопрос. Когда кто-то пытается записать в сломанный канал, генерируется SIGPIPE. Допустим, я обработал сигнал в своем коде.

Теперь, какую ошибку возвращает вызов записи - EPIPE или EINTR (так как он был прерван сигналом). Я попробовал с программой-образцом, и я, кажется, получаю EPIPE всегда. Это гарантированное поведение или это может быть любое из двух значений ошибки?

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

POSIX говорит, что EPIPE должен быть возвращен, а SIGPIPE отправлен:

  • Для write () s или pwrite () s для каналов или FIFO, не открытых для чтения каким-либо процессом, или только с одним концомopen.
  • Для write () s к сокетам, которые больше не подключены или не отключены для записи.

Вы можете посмотреть стандарт POSIX здесь

1 голос
/ 06 июля 2010

Вызов write(2) возвращает -1 при ошибке, поэтому, я полагаю, вы спрашиваете о значении errno(3).

Вы получите EPIPE, если вы обработаете , блокируете или проигнорируете сигнал. В противном случае процесс прекращается по умолчанию, см. signal(7).

0 голосов
/ 06 июля 2010

Как правило, «прерывается сигналом» (EINTR) относится к крайне нелепой обработке сигналов Unix System V, в результате чего системный вызов ANY может завершиться ошибкой, если ваш процесс получил (и обработал) сигнал во времясистемный вызов.Это требовало переноса каждого системного вызова на do ... while (ret==-1 && errno==EINTR); или подобное.В то время как POSIX по-прежнему допускает либо это, либо хорошее («BSD») поведение, нормальные системы, такие как GNU / Linux, имеют поведение BSD по умолчанию.Вы всегда можете получить поведение BSD, вызвав sigaction с правильными аргументами, или даже сделать для этого функцию-обертку.

Таким образом, EINTR не связан с SIGPIPE, вызванным ошибками записи.

...