Ответ 1
Интересный вопрос... Я прочитал текущий POSIX и не нашел конкретного ответа, т.е. никакой спецификации о параллельных вызовах. Поэтому я объясню, почему я считаю, что стандарт означает, что все проснется.
Соответствующая часть текст для select
/pselect
:
После успешного завершения функция pselect() или select() должна изменить объекты на которые указывают аргументы readfds, writefds и errorfds, чтобы указать, какой файл дескрипторы готовы к чтению, готовы к записи или к ожиданию ошибки, соответственно, [...]
и позже
Дескриптор считается считанным готовым для чтения, когда вызов функции ввода с Очистка O_NONBLOCK не блокирует, будет ли функция передавать данные успешно. (Функция может возвращать данные, индикацию конца файла или ошибку кроме одного, указывающего, что он заблокирован, и в каждом из этих случаев дескриптор считаются готовыми к чтению.)
Короче (только для чтения), мы можем понять это как:
select
не блокирует это означает, что следующий вызов функции ввода с помощью O_NONBLOCK
не возвратит ошибку с errno==EWOULDBLOCK
. [Обратите внимание, что "следующая" - это моя интерпретация вышеизложенного.]
Если кто-то допускает эту интерпретацию, то два одновременных вызова select
могут возвращать тот же FD, что и читаемый. На самом деле, даже если они не являются параллельными, но первый поток вызывает select
с некоторым читаемым FD, а позже, например, read
, второй поток, вызывающий select
между ними, может возвращать FD как читаемый для второго потока,
Теперь соответствующая часть для "пробуждения" части вопроса такова:
Если ни один из выбранных дескрипторов не готов к запрошенной операции, pselect() или select() блокируется до тех пор, пока, по меньшей мере, одна из запрошенных операций не станет до тех пор, пока не произойдет тайм-аут, или пока он не будет прерван сигналом.
Здесь ясно, что приведенная выше интерпретация предполагает, что все ожидающие вызовы возвратятся.