Почему FD_SET / FD_ZERO для select () внутри цикла?

Я использую функцию select для связи между моими сокетами. У меня есть цикл while, и я использую -

    while(!done) {

    FD_ZERO(&read_flags);
    FD_ZERO(&write_flags);
    FD_SET(comm_fd1, &read_flags);
    FD_SET(comm_fd2, &read_flags);
    FD_SET(STDIN_FILENO, &read_flags);
    FD_SET(comm_fd1, &write_flags);
    FD_SET(comm_fd2, &write_flags);
    FD_SET(STDIN_FILENO, &write_flags);

    //call select
    sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd);

и то же самое с разными переменными на стороне клиента. Я получил эту базовую технику из онлайн-руководство и просто пошел с ним. Затем меня осенило - почему я очищаю набор и добавляю файловые дескрипторы каждый раз, когда зацикливаюсь? Если они уже добавлены, зачем их очищать и добавлять снова? Так что я попробовал сделать это только один раз перед while, и код больше не работает. Может кто-нибудь объяснить, почему? Это просто потому, что select изменяет содержимое набора? Любая помощь и / или понимание приветствуются.

23
задан Sterling 3 October 2011 в 16:23
поделиться