C select () writefds - PullRequest
       25

C select () writefds

0 голосов
/ 19 декабря 2009

У меня проблемы с пониманием, что значит добавить дескриптор для writefds, установленного для select () в linux. Я написал некоторый простой код, который добавляет дескриптор stdout в набор writefds и использует время ожидания NULL. Теперь мой код просто бесконечные циклы, проверяющие, установлен ли этот дескриптор, и если он это делает, он печатает «ЗАПИСЬ». Когда я запускаю свой код, он просто продолжает печатать «ПИСЬМО» до бесконечности. То же самое происходит, когда я делаю это для стандартного ввода. Опять же, в цикле нет другого кода. Всегда ли stdin / stdout готов к записи?

Ответы [ 3 ]

3 голосов
/ 19 декабря 2009

Это означает, что вы можете вызвать write для этого fd, и ядро ​​обещает не блокировать и использовать как минимум 1 байт.

Подробнее. Если ваш сокет не находится в неблокирующем режиме и буферы ядра, связанные с сокетом, заполнены, ядро ​​переведет ваш поток в спящий режим до тех пор, пока он не сможет очистить часть буфера и использовать часть вашей записи.

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

2 голосов
/ 19 декабря 2009

Ответ на вопрос «Всегда ли stdout готов к записи» - «Это зависит».

stdout может быть подключен ко всему, что может быть открыто как дескриптор файла - например, к файлу диска, сетевому сокету или каналу. Обычный случай - это то, что он подключен к терминальному устройству.

Большинство этих типов файловых дескрипторов могут блокироваться при записи (что означает, что они не могут быть помечены как доступные для записи после возврата select()), но обычно только в том случае, если вы просто записали в них очень большой объем данных (и залил какой-то буфер). «Большое количество» зависит от типа устройства - если ваш стандартный вывод - это 9600 бод последовательное устройство, то вы можете довольно легко заполнить буфер записи; Xterm, не так много.

Некоторое устройство никогда не блокирует , как файлы на диске, или /dev/null, например. (write() для файла на диске может завершиться не сразу, но это не считается «блокировкой» - это «ожидание диска»).

1 голос
/ 19 декабря 2009

Да, верный возврат от FD_ISSET(fd, &writefds) означает, что fd доступен для записи. Если вы вызываете select() с этим FD, установленным в writefds, после получения EWOULDBLOCK или EAGAIN (по крайней мере, в Linux), он блокируется до тех пор, пока FD снова не станет доступным для записи.

Это больше, чем это. Например, FD также считается доступным для записи, если вы сделали для него неблокирующую connect(), получили EAGAIN и позвоните select(), чтобы дождаться установления соединения. Это учреждение сообщается в writefds.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...