выберите вызов получает тайм-аут на HPUX ia64 - PullRequest
0 голосов
/ 23 ноября 2011

Я использовал select call в моей проге, и она работает на большинстве разновидностей Unix. Однако он работает на одной коробке HPUX ia64, а на другой - сразу же.

После нескольких перестроек я понял, что установил tv_sec, но не установил tv_usec временной структуры. После установки элемента tv_usec временной структуры в 0 он начинает работать на всех платформах.

Но я не понял причину, по которой программа работала по-разному для одной и той же ОС? и как проблема решается только путем урегулирования tm.tv_usec = 0?

1 Ответ

2 голосов
/ 23 ноября 2011

tv_sec и tv_usec являются знаковыми int значениями, поэтому они могут быть отрицательными числами.

Если ваша структура является локальной переменной, она будет содержать все, что происходит в стеке.

В select доля времени в секундах рассчитывается следующим образом (взято из исходного кода Linux ):

  tv.tv_sec + (tv.tv_usec / USEC_PER_SEC)

Как видите, проверка не выполняетсясделал так, чтобы числа были положительными, поэтому, если неинициализированная переменная должна содержать большое отрицательное число, select немедленно вернется.

Редактировать:

Использованиенеинициализированной переменной приводит к неопределенному поведению.То, что select немедленно возвращается на одном компьютере, а не на другом, соответствует спецификации C.

...