Date: Thu, 31 Oct 2002 10:46:00 +0500
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: ftn.ru.unix.prog
Subject: Указание таймаута при вызове select()
as> p.s. каким образом можно в однотредовой программе избавиться от 100% загрузки
as> процессора в бесконечном цикле кроме usleep и подобных? в цикле, к примеру,
as> неблокирующее чтение из сокета и ввод с клавиатуры, тоже неблокирующий. то есть
as> можно селекты с таймаутами делать и так далее.
Да.
as> но вот не нравится необходимость
as> указывать некоторый фиксированный таймаут. возникает вопрос -- почему именно
as> такой, а не другой?
Фиксированный он только на момент, когда ты входишь в select(). А по какому
принципу ты его подсчитаешь перед этим - твое дело.
Можешь делать вечный сон и выходить из него по сигналу, если какое-то таймерное
событие наступило. Можешь определять первое следующее событие и ставить в
select() нужный таймаут. Можешь смешанно делать. Всё тут полностью up to you ;)
Фиксированный таймаут обычно делается, когда надо в цикле делать поллинг
какого-то внешнего фактора, о наступлении которого не сообщат.
Hапример, нет доступных везде средств нотификации изменения каталога и файла
по их имени, поэтому cron делает поллинг раз в минуту, проверяя /etc/crontab
и /var/cron/tabs (/var/spool/cron, etc.) на изменение.
Впрочем, там таймаут тоже не фиксированный по длительности, а фиксированный
по сути - до начала следующей минуты.