LINUX.ORG.RU

Select глючит?


0

0

Пытаюсь вызвать select для 200 дескрипторов....
возвращает ошибку "Select: Bad file descriptor"
На 170 дескрипторах работает нормально
вот примерный код. Дескрипторы созданы через пайп.
Ненужные концы закрыты... Ограничения на количество файлов 32000
while(1){
    FD_ZERO(&set);
    hi = 0;
    for(i = 0; i < opt.process_number; i++){
            FD_SET(p_table[i].fd_out[0], &set);
            if(hi<p_table[i].fd_out[0]) {
                    hi = p_table[i].fd_out[0];
            }
    }
    if(select(hi+1, &set, NULL, NULL, 0) <= 0) {
            perror("Select");
            continue;
    }
    for(i = 0; i < opt.process_number; i++) {
            if(FD_ISSET(p_table[i].fd_out[0], &set)){
                    read(p_table[i].fd_out[0], &cmd, sizeof(cmd));
                    sprintf(buf,"Receive command %d data %d\n",cmd.command, cmd.data);
                    write_log(buf);
                    command_hook(&cmd, i);
            }
    }
}

★★★★

Может быть, массив p_table иницыализируешь не верно?

anonymous
()

На размер набора дескрипторов в select есть какое-то ограничение, что-то из POSIX констант, для разных OS оно разное, что-то об этом пишет у.Стивенс в "Разработка сетевых приложений", см. здесь: http://qnx.org.ru/forum/viewtopic.php?topic=1350&forum=12&10

anonymous
()

Книга наверное хорошая.
Однако искать ее в Минске нет времени.
Кстати select заработал если не закрывать лишние концы.
Думал что действительно где-то закрыл что-то лишнее, но если прогнать по всему списку дескрипторов close , то ни одной ошибки закрытия файла нету, то есть дескрипторы нормальные.

И еще прикол...
есть трэд созданный тем же процессом что и в листинге первого поста.
Этот трэд также висит на select'e и слушает другие пайпы, на предмет сообщений от чилдов.
То есть приблизительно схема такая.
создаются пайпы
форкаются чилды
создается трэд
переходим в выше описанный бесконечный цикл.

Трэд тоже висит на селекте и ждет мессаг из других пайпов.

Так вот селект в трэде сробатывает с огромной задержкой...
иногда доходит до минуты после записи чилдом данных в пайп. А это не допустимо для моей задачи.

Есть какие-нить идеи?







Dead ★★★★
() автор топика

может poll попробовать?

anonymous
()
Ответ на: комментарий от Dead

Идей нет. Есть такая информация: POSIX предупреждает, что select - не thread-safe функция. На это напарывался и я и другие коллеги. Выследить это - очень трудно, т.к. ловится ситуация совпадений внешних событий ... и т.д. должно быть понятно ... 1 случай на 1-10 млн. прогонов (это наша реальная цифра была).

Идея может быть только такая: нельзя использовать select в multithread... по крайней мере select-ы в разных потоках.

anonymous
()

Сделал что-бы чилды писали в один пайп, а не в несколько, правда пришлось доступ к нему через семафоры разрулить. Все прекрасно заработало и без задержек. Тут вот еще какая странность, этот баг с селектом проявлялся на РХ 8.0, на SuSE 8.0 он не замечен. Возможно там отличаются версии libpthread.
Спасибо последнему анониму.

Dead ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.