Представим себе ситуацию, когда есть библиотечная функция, в которой
подряд идут несколько блокирующих системных вызовов (например read).
void foo()
{
...
read(...); // First call
...
read(...); // Second call
...
}
Для меня критично, чтобы вызов этой функции уложился в 3 секунды:
alarm(3);
foo();
alarm(0);
Обработчик сигнала ALRM определён пустым.
Проблема в том, что сигнал ALRM прервёт 1-й read (вызов вернёт ошибку
и errno станет равно EINTR).
Но если функция не обрабатывает эту ситуацию, то она _навсегда_
зависнет во втором вызове read!
Т.к. речь идёт о произвольной библиотечной функции, то нельзя делать
предположений о количестве блокирующих системных функций в ней.
Как решать подобную проблему (т.е. гарантированно прервать вызов
произвольной функции)?
Ответ на:
комментарий
от MKuznetsov

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Запись в один сокет из нескольких потоков (2008)
- Форум Висит ли процесс на выполнении системного вызова? (2009)
- Форум blocking / non-blocking calls (2018)
- Форум Как правильно «будить» процесс, если он залочен блокирующей функцией? (2024)
- Форум alarm() (2001)
- Форум cron alarm (2004)
- Форум Alarm clock (2003)
- Новости В Linux 5.15 добавлен системный вызов для быстрого освобождения памяти умирающего процесса (2021)
- Форум Подвисает система Linux (2013)
- Форум alarm не алармит (2011)