Вам нужно инициализировать наборы файловых дескрипторов перед вызовом select()
. С вашим текущим кодом select
заканчивается EBADF
.
Что-то вроде этого должно сделать это:
FD_ZERO (&writefds);
for(;;)
{
FD_ZERO (&readfds);
FD_SET(fd_1, &readfds);
FD_SET(fd_2, &readfds);
retval = select(FD_SETSIZE, &readfds, &writefds, NULL, &tv);
if (retval < 0) {
perror("select");
exit(EXIT_FAILURE);
}
for(int i=0; i<FD_SETSIZE; i++)
{
if (FD_ISSET(i, &readfds))
{
// read call happens here //
printf("reading from file: %d\n", i);
nbytes = sizeof(buf);
bytes_read = read(i, buf, nbytes);
printf("read %ld bytes\n", bytes_read);
}
}
}
А также вы можете проверить, что for(;;)
l oop и выход только по ошибке. Как только ваш select
будет вести себя правильно, вы можете приступить к отладке внутри вашего второго for
l oop. Кажется, вы не используете writefds
здесь, поэтому вы также можете просто установить его на NULL
в select
.
Еще одно замечание: поскольку у вас есть только два файла в наборе для чтения, вы можете просто отметьте FD_ISSET(fd_1)
/ FD_ISSET(fd_2)
вместо перебора всех записей FD_SETSIZE
.