The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"перезапустить заблокированый open()  с приходом сигнала"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"перезапустить заблокированый open()  с приходом сигнала"  
Сообщение от RSG (??) on 22-Сен-06, 12:13 
Есть perl скрипт, в котором в некторый момент происходит fork(). Далее родитель блокируется в open() т.к. открывается FIFO. Потомок выполняет некоторые действия после чего завершается, отправляя SIGCHLD родителю. В родителе установлен обработчик сигнала waitpid().
Проблема заключается в том, что с приходом сигнала, open() не перезапускается, т.е. open() завершается с ошибкой. Вопрос собственно, как заставить open() перезапускаться.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "перезапустить заблокированый open()  с приходом сигнала"  
Сообщение от chip email(ok) on 22-Сен-06, 17:53 
>Есть perl скрипт, в котором в некторый момент происходит fork(). Далее родитель
>блокируется в open() т.к. открывается FIFO. Потомок выполняет некоторые действия после
>чего завершается, отправляя SIGCHLD родителю. В родителе установлен обработчик сигнала waitpid().
>
>Проблема заключается в том, что с приходом сигнала, open() не перезапускается, т.е.
>open() завершается с ошибкой. Вопрос собственно, как заставить open() перезапускаться.

Если правильно реализовано приложение, т.е. в обработчике SIGCHLD устанавливается некий флаг и уже в основном цикле происходит "подметание мусора за потомком", то проблем с "перезапуском" open() проблем не должно возникнуть (всё дело будет в логике).

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "перезапустить заблокированый open()  с приходом сигнала"  
Сообщение от RSG (??) on 23-Сен-06, 09:58 
>Если правильно реализовано приложение, т.е. в обработчике SIGCHLD устанавливается некий флаг и
>уже в основном цикле происходит "подметание мусора за потомком", то проблем
>с "перезапуском" open() проблем не должно возникнуть (всё дело будет в
>логике).

Вопрос собственно в том: как перезапустить?
Сейчас перезапускаю руками по ошибке EINTR (прерывание системного вызова сигналом).

while(1){
            if (open(fh,"<$fifofile")){
                last; # read data from fifo. exit from while.
            }
            if($!{EINTR}){
                next;   # interrupted by signal. restart open().
            }else{
                    die("fifo\n");
            }

}

На сколько я понял по умолчанию open() не относиться к перезапускаемым системным вызовам. Если верить man sigaction(2) то можно перезапустить флагом SA_RESTART и open(), но есть одно НО! Перезапустиь можно только на "communications
channel or a slow device (such as a terminal, but not a regular file) and during a wait(2) or ioctl(2)".

Собственно установка set_sig_handler( 'CHLD' ,'mysubname' ,{ flags => SA_RESTART } );
перезапуска не дает.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "перезапустить заблокированый open()  с приходом сигнала"  
Сообщение от chip email(ok) on 02-Окт-06, 13:08 
>>Если правильно реализовано приложение, т.е. в обработчике SIGCHLD устанавливается некий флаг и
>>уже в основном цикле происходит "подметание мусора за потомком", то проблем
>>с "перезапуском" open() проблем не должно возникнуть (всё дело будет в
>>логике).
>
>Вопрос собственно в том: как перезапустить?
>Сейчас перезапускаю руками по ошибке EINTR (прерывание системного вызова сигналом).

А чем не устраивает данное решение? Ведь оно вполне корректно:
if ((open(...) < 0) && (errno == EINTR)) { /* restart open() */ }

И находится в рамках POSIX: http://www.opengroup.org/onlinepubs/009695399/

>
> while(1){
>            
>if (open(fh,"<$fifofile")){
>            
>    last; # read data from fifo. exit
>from while.
>            
>}
>            
>if($!{EINTR}){
>            
>    next;   # interrupted by signal.
>restart open().
>            
>}else{
>            
>        die("fifo\n");
>            
>}
>
> }
>
>На сколько я понял по умолчанию open() не относиться к перезапускаемым системным
>вызовам. Если верить man sigaction(2) то можно перезапустить флагом SA_RESTART и
>open(), но есть одно НО! Перезапустиь можно только на "communications
>channel or a slow device (such as a terminal, but not a
>regular file) and during a wait(2) or ioctl(2)".
>
>Собственно установка set_sig_handler( 'CHLD' ,'mysubname' ,{ flags => SA_RESTART } );
>перезапуска не дает.


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру