Ключевые слова:pipe, signal, error, (найти похожие документы)
Date: Tue, 25 Mar 2003 16:11:12 +0500
From: Igor Sysoev <is at rambler-co.ru>
Newsgroups: ftn.ru.unix.prog
Subject: Отлов записи в уже закрытый сокет (SIGPIPE)
> к удалённому серверу открывается сокет, однако иногда случается, что удалённая
> машина закрывает его раньше, нежели моя посылает по нему данные. В итоге прога
> завершается по SIGPIPE. Как правильно проверять, закрыт ли сокет удалённым
> компом перед записью - отлавливать самому сигнал SIGPIPE или же использовать
> getsockopt непосредственно перед записью для проверки ошибки сокета ?
Для SIGPIPE нужно сказать SIG_IGN. После этого любая операция с сокетом,
которая вызывает SIGPIPE, будет возвращать ошибку EPIPE.
From: Volodymyr Tarasenko <tvn@upc.kiev.ua>
> MZ> машина закрывает его раньше, нежели моя посылает
> MZ> по нему данные. В итоге прога
> MZ> завершается по SIGPIPE.
>
> сделать
> signal(SIGPIPE, SIG_IGN);
> чтобы программа не завершалась.
>
Только не signal, а sigaction, поскольку после прихода первого SIGPIPE,
обработчик сбросится на дефолтный ...
From: Valentin Nechayev <netch@segfault.kiev.ua>
>> сделать
>> signal(SIGPIPE, SIG_IGN);
>> чтобы программа не завершалась.
VT> Только не signal, а sigaction, поскольку после прихода первого SIGPIPE,
VT> обработчик сбросится на дефолтный ...
По-моему, не сбросится.
1. signal() в разных системах работает по-разному. BSD - не сбросит
независимо от того, что в handler'е.
2. SIG_IGN не сбрасывается, IMO. Потому что сбрасывается "when deliver",
а SIG_IGN приводит к тому, что сигнал оказывается не delivered, а ignored.
Это по терминологиии BSD мана. По Posix, есть "disposition" сигнала,
но оно тоже, AFAIS, не происходит при SIG_IGN.
Если кто-то читает Posix иначе, или знает систему, что сбрасывает SIG_IGN
в SIG_DFL - расскажите.