У меня есть программа, над которой я работаю, и я использую select для выбора из каналов для чтения.
Проблема в том, что я использую if(FD_ISSET(pfd[i][0], &read_set))
, и она не проходит проверку, потому чтоFD_ISSET возвращает 0, но если я попытаюсь прочитать, используя read(pfd[i][0],&c,sizeof(c))
, он будет работать нормально, и содержимое из pipe pfd [0] будет отличаться от pfd [1], как я хочу.
Я хочу знать, чтоад продолжается, потому что FD_ISSET возвращает 0, но я могу фактически прочитать содержимое из него
РЕДАКТИРОВАТЬ
Глобальная переменная CORES будет контролировать, сколько процессов я создаю Следующий кодсоздаст каналы и использует FD_SET для установки битов
for(i=0; i<CORES; i++)
{
if(pipe(pfd[i])==-1)
perror("Ocorreu um erro a criar um pipe");
FD_SET(pfd[i][0], &read_set);
}
read_set определяется сразу после запуска main ().Я использую for () сразу после вышеприведенного кода для создания x процессов, используя fork () (x = CORES)
, затем эта часть выполняется в родительском процессе:
while (x<CORES){
int selec = select(pfd[CORES-1][0]+1, &read_set, NULL, NULL, NULL);
if(selec>0)
{
if(FD_ISSET(pfd[x][0], &read_set))
{
close(pfd[x][1]);
if(read(pfd[x][0],&c,sizeof(c))==-1)
perror("Ocorreu um erro a ler do pipe");
printf("c= %f \n",c);
c_final+=c;
x++;
}
else
printf("\nFile descriptor pfd[%d][0] is not set\n",x);
}
else if(selec == -1)
perror("Ocorreu um erro no select");
}
проблема с этимявляется то, что FD_ISSET(pfd[x][0], &read_set)
не пройдет, потому что он не установлен для pfd [0], но это может быть для pfd [1] или наоборот (потому что я не знаю, будет ли сбой для 0 или 1)
EDIT2:
select () возвращает int для числа дескрипторов файлов в read_set.У меня CORES установлен на 2, поэтому он создает 2 процесса и 2 канала и устанавливает 2 бита в read_set.Мой метод select () возвращает int 1. Должен ли он также возвращать значения int 2 или 0 (то есть 0 и 1 = 2)?