Использование сна и выбор с помощью сигналов

Я хочу использовать функцию select() чтобы ждать 1 секунду, так как моя программа использует сигналы для управления вещами, поэтому sleep() вернется преждевременно. Странно то, что при использовании select() он также возвращается преждевременно.

Я вызываю select как это

 struct timeval timeout; timeout.tv_sec = 10; timeout.tv_usec = 1000000; select (0 ,NULL, NULL, NULL, &timeout); 

но всякий раз, когда поступает сигнал, он возвращается (я использую nano второй таймер для сигнала)

Кто-нибудь знает почему?

Попробуйте что-то вроде этого:

 struct timespec timeout; timeout.tv_sec = 10; timeout.tv_nsec = 0; while (nanosleep(&timeout, &timeout) && errno == EINTR); 

Указатель «оставшееся время» на nanosleep позаботится о том, чтобы вы перезапустили hibernate с необходимым количеством оставшегося времени, если он будет прерван.

man 7 signal говорит:

Прерывание системных вызовов и функций библиотеки с помощью обработчиков сигналов

Если обработчик сигнала вызывается во время блокировки вызова системного вызова или библиотеки, то либо:

  * the call is automatically restarted after the signal handler returns; or * the call fails with the error EINTR. 

Какое из этих двух видов поведения зависит от интерфейса и определяется ли обработчик сигнала с помощью флага SA_RESTART (см. Sigaction (2)). Информация зависит от систем UNIX; ниже, подробности для Linux.

Если заблокированный вызов одного из следующих интерфейсов прерывается обработчиком сигнала, тогда вызов будет автоматически перезапущен после того, как обработчик сигнала вернется, если использовался флаг SA_RESTART; в противном случае вызов завершится с ошибкой EINTR

Как правило, проверяя, есть ли возвращаемое значение -1 и errno == EINTR, а затем повторное вызов функции – это правильный способ исправить это.