Я жду селектом инпут из пайпа:
mkfifo /tmp/test_pipe
#include <sys/select.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <assert.h>
int main(int argc, char **argv) {
int fd = open("/tmp/test_pipe", O_RDONLY);
char buf[1024];
fd_set rset;
FD_ZERO(&rset);
FD_SET(fd, &rset);
int rv = select(fd+1, &rset, NULL, NULL, NULL);
if (rv > 0) {
if(FD_ISSET(fd, &rset)) {
int len = read(fd, buf, 1023);
printf("rv=%d, read %d bytes\n", rv, len);
buf[len] = '\0';
printf("%s", buf);
}
} else {
perror("select");
}
FD_ZERO(&rset);
FD_SET(fd, &rset);
rv = select(fd+1, &rset, NULL, NULL, NULL);
if (rv > 0) {
if(FD_ISSET(fd, &rset)) {
int len = read(fd, buf, 1023);
assert(len);
printf("rv=%d, read %d bytes\n", rv, len);
buf[len] = '\0';
printf("%s", buf);
}
} else {
perror("select");
}
return 0;
}
в пайп пишу строку:
echo lalala > /tmp/test_pipe
Программа выводит
rv=1, read 7 bytes
lalala
a.out: test.c:42: main: Assertion `len' failed.
Aborted
Вопросы: почему второй селект возвращает 1? Почему он вообще возвращается?