Я создаю один исполняемый файл с именем «readmsg». Его исходный код приведен ниже. select()
работает, если я выполняю только readmsg
в оболочке (я вижу вывод timeout
).
Но если я создам файл FIFO с помощью команды: mknod /tmp/message p
и выполню readmsg < /tmp/message
в оболочке. В результате select()
не может вернуться, если я что-то не напишу в /tmp/message
. Мой вопрос: почему я не могу получить вывод timeout
?
исходный код "readmsg":
#define STDIN 0
fd_set fds;
struct timeval tv;
while (1) {
FD_ZERO(&fds);
FD_SET(STDIN, &fds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select(STDIN + 1, &fds, NULL, NULL, &tv);
if (ret > 0) {
printf("works\n");
if (FD_ISSET(STDIN, &fds)) {
// read ...
}
} else if (ret == 0) {
printf("timeout!!\n");
} else {
printf("interrupt\n");
}
}
errno
, например. замените последнийprintf
наprintf("failed - %s\n", strerror(errno));
; и вы должны предпочестьpoll
вместоselect
(например, потому чтоselect
ограничивает максимальное количество файловых дескрипторов до размераfd_set
; Google для C10K проблема для получения дополнительной информации). - person Basile Starynkevitch   schedule 13.01.2013strace
и свою программу, и программы, записывающие в FIFO.... - person Basile Starynkevitch   schedule 13.01.2013O_NONBLOCK
open()
будет блокироваться, если никто не открыл fifo для записи. - person Martin R   schedule 13.01.2013