LINUX.ORG.RU

Проблема с alarm


0

0

Представим себе ситуацию, когда есть библиотечная функция, в которой
подряд идут несколько блокирующих системных вызовов (например read).

void foo()
{
  ...
  read(...); // First call
  ...
  read(...); // Second call  
  ...
}

Для меня критично, чтобы вызов этой функции уложился в 3 секунды:
alarm(3);
foo();
alarm(0);

Обработчик сигнала ALRM определён пустым.

Проблема в том, что сигнал ALRM прервёт 1-й read (вызов вернёт ошибку
и errno станет равно EINTR).
Но если функция не обрабатывает эту ситуацию, то она _навсегда_
зависнет во втором вызове read!

Т.к. речь идёт о произвольной библиотечной функции, то нельзя делать
предположений о количестве блокирующих системных функций в ней.

Как решать подобную проблему (т.е. гарантированно прервать вызов 
произвольной функции)?

Ответ на: комментарий от MKuznetsov

> man siginterrupt

это по всей видимости не поможет. если есть пачка read() которые не воспринимают EINTR как фатальную ошибку и пытаются читать файл дальше, то прервать такую функцию снаружи без jump будет весьма муторно.

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.