>Если правильно реализовано приложение, т.е. в обработчике 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 } );
перезапуска не дает.