URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 993
[ Назад ]

Исходное сообщение
"Семантика EINTR"

Отправлено vnp , 24-Сен-02 08:41 

(man select)     EINTR   A non blocked signal was caught.
(man 2 read)     EINTR   The call was interrupted by a  signal before                                                                     any data was read.

Внимание, вопрос: почему это сформулировано по разному?

Если кто-нибудь видел rationale на эту тему, киньте ссылку,
пожалуйста.


Содержание

Сообщения в этом обсуждении
"RE: Семантика EINTR"
Отправлено Soldier , 24-Сен-02 10:03 
>
>(man select)     EINTR   A non blocked
>signal was caught.
>(man 2 read)     EINTR   The call
>was interrupted by a  signal before    
>          
>          
>          
>          
>          
>         any data
>was read.
>
>Внимание, вопрос: почему это сформулировано по разному?
>
>Если кто-нибудь видел rationale на эту тему, киньте ссылку,
>пожалуйста.


Семантика (как вы выражаетесь) EINTR везде одна - Interrupted function call.
А здесь по разному сформулировано не "это", а причина возникновения "этого"


"RE: Семантика EINTR"
Отправлено vnp , 24-Сен-02 21:11 
>>
>>(man select)     EINTR   A non blocked
>>signal was caught.
>>(man 2 read)     EINTR   The call
>>was interrupted by a  signal before    
>>          
>>          
>>          
>>          
>>          
>>         any data
>>was read.
>>
>>Внимание, вопрос: почему это сформулировано по разному?
>>
>>Если кто-нибудь видел rationale на эту тему, киньте ссылку,
>>пожалуйста.
>
>
>Семантика (как вы выражаетесь) EINTR везде одна - Interrupted function
>call.
>А здесь по разному сформулировано не "это", а причина возникновения
>"этого"

Об чем и речь. Дело в том, что select завершается с EINTR по *любому*
(непойманному) сигналу, в то время как read -- только по SIGINT'у.

Поэтому главный вопрос остается в силе: кто-нибудь видел формальное
обоснование такой дискриминации?



"RE: Семантика EINTR"
Отправлено Soldier , 25-Сен-02 08:44 
>Об чем и речь. Дело в том, что select завершается с EINTR
>по *любому*
>(непойманному) сигналу, в то время как read -- только по SIGINT'у.
>
>Поэтому главный вопрос остается в силе: кто-нибудь видел формальное
>обоснование такой дискриминации?

Я не видел формального "обоснование такой дискриминации" :-), но просто давайте взглянем на факты:

select - просто проверяет доступность дескрипторов на чтение или запись
read   - непосредственно читает из дескриптора, которой может быть и каким-нибудь
         устройством

По моему (я могу и ошибаться) no comments.


"RE: Семантика EINTR"
Отправлено vnp , 25-Сен-02 12:09 
>>Об чем и речь. Дело в том, что select завершается с EINTR
>>по *любому*
>>(непойманному) сигналу, в то время как read -- только по SIGINT'у.
>>
>>Поэтому главный вопрос остается в силе: кто-нибудь видел формальное
>>обоснование такой дискриминации?
>
>Я не видел формального "обоснование такой дискриминации" :-),

"Дискриминация", в данном случае, просто афро-американизм. Не обижайтесь.

>но просто давайте взглянем
>на факты:
>select - просто проверяет доступность дескрипторов на чтение или запись
>read   - непосредственно читает из дескриптора, которой может быть и
>каким-нибудь устройством
>По моему (я могу и ошибаться) no comments.

Вы не ошибаетесь. Все cool. Глядим на факты. Как было замечено выше Вами,
EINTR генерируется при interrupted system call. Как было замечено выше мною, разные system calls are interrupted по разному. Это ли не
дискриминация?

Об одном и том же ли мы говорим?

Почему проверка "доступности дескрипторов на чтение и запись" прерывается
по таймеру, по завершении дочернего процесса... по чьему-то дурацкому
желанию послать мне SIGUSR, наконец; в то время, как "непосредственное
чтение из дескриптора, которой может быть и каким-нибудь устройством", чихало на все, кроме Ctrl-C и иже с ним?

PS Это чистое любопытство. Оно обошлось мне в 9-10 часов отладки. Поэтому
меня больше всего интересует posix rationale, а также любые доказательства
правильности такого дизайна.


"RE: Семантика EINTR"
Отправлено romanSA , 25-Сен-02 14:10 
>Об чем и речь. Дело в том, что select завершается с EINTR
>по *любому*
>(непойманному) сигналу, в то время как read -- только по SIGINT'у.
>
>Поэтому главный вопрос остается в силе: кто-нибудь видел формальное
>обоснование такой дискриминации?

Во-первых, что происходит по "*любому* непойманому сигналу" можно увидеть в man 7 signal: за редким исключением - это прекращение процесса. Причём вне зависимости read() это или select().
non blocked - это именно незаблокированный, а не непойманный сигнал.
Сигналы блокируются/разблокируются через sigprocmask() и "родственные" вызовы. Блокированные сигналы read()-ом тоже не обрабатываются (насчёт именно SIGINT не помню, см. man sigprocmask).

Формальное обоснование:
read() работает только с одним дескриптором и если на нём есть данные и нет ошибок, то должен их читать.

select() работает с несколькими дескрипторами, причём некоторые могут работать в асинхронном режиме, может проверяться чтение, запись и возникновение особых ситуаций для заданных дескрипторов.
Изменение состояния дескрипторов могут сопровождаться сигналами (напр. при асинхр. операциях).
select() используется как таймер.
select() используется для ожидания одного или нескольких TCP соединения (сначала select() и только потом accept() ).
Всё это многообразие использования (список можно расширить) и привело к такой форме обработки сигналов в select().

Кстати простой пример, где нужно такое поведение select():
1)Есть сервер, ожидающий TCP соединения на N портах.
2)Нужна возможность динамического изменения числа портов.