Вчера я обнаружил select
, очень полезный инструмент, но я не могу заставить его работать. Это часть моего общего кода:
/* Code here */
FD_ZERO(&fifo_set);
printf("%d\n", num_proc);
for(i = 0; i < num_proc; ++i)
FD_SET(proc[i].fifowfd, &fifo_set);
/* More code here */
while(1)
{
if(select(FD_SETSIZE, &fifo_set, NULL, NULL, NULL) < 0)
{
log_event(5, "Could not block.");
exit(1);
}
printf("FD_SETSIZE: %d\n", FD_SETSIZE);
for(i = 0; i < FD_SETSIZE; ++i)
printf("ISSET %d: %d\n", i, FD_ISSET(i,&fifo_set));
log_event(1, "Actions to be done.");
/* More code */
Массив proc представляет собой массив процессов с заданным PID и FIFO для чтения и записи. Дескрипторы файлов в FIFO проверены и действительны. Проблема в том, что есть 3 процесса (num_proc) со значениями fifowfd 5, 7 и 9. Но когда я печатаю все FD_ISSET, кажется, что только 5 зарегистрированы и имеют данные, но все три имеют данные. FD_SETSIZE имеет значение 1024.
Как указал @mux, эти FIFO называются «FIFO для записи». Дело в том, что у меня есть куча "name.r.fifo" и "name.w.fifo", которые представляют собой "FIFO для чтения/записи" со стороны процесса. Код, который я показываю, — это код контроллера, который читает в «.w.fifo» и записывает в «.r.fifo».
Я что-то упускаю?