Как работает функция poll в c? - PullRequest
5 голосов
/ 07 февраля 2012

Я новичок в программировании сокетов и пытаюсь понять, как работает опрос. Итак, я сделал небольшой пример программы. Программа, кажется, работает так, как я ожидаю, но когда я закомментирую строку с циклом int dummy, цикл for запускает только одну итерацию, когда предполагается, что она будет делать десять. Я не понимаю, как эта переменная имеет отношение к циклу for. Предполагается, что программа напечатает «timeout» через 3,5 секунды и напечатает «return hit», если есть доступный ввод.

#include <stdio.h>
#include <poll.h>

int main(int argc, char *argv[]) {
    int a;
    int b;
    int c;
    char buf[10];
    int i;
    struct pollfd ufds[1];      
    ufds[0].fd = 0;
    ufds[0].events = POLLIN;
    int rv;
    int dummy;
    for(i=0; i < 10; i++) {
        printf("%i ", i);
        if((rv = poll(ufds, 2, 3500)) == -1) perror("select");
        else if (rv == 0) printf("Timeout occurred!\n");
        else if (ufds[0].revents & POLLIN) {
            printf("return hit\n");
            read(0, buf, 10);
        }   
        fflush(stdout); 
    }   
    return 0;
}

Ответы [ 2 ]

7 голосов
/ 07 февраля 2012
if((rv = poll(ufds, 2, 3500)) == -1) perror("select");
                    ^

Вы говорите poll, что у вас есть 2 файловых дескриптора (2 структуры pollfd), но у вас есть только один.Это неопределенное поведение (вы обманываете опрос, чтобы войти в нераспределенную память).Измените этот аргумент на 1.

2 голосов
/ 07 февраля 2012

Изменение поведения при комментировании dummy, вероятно, связано с изменениями в стеке, которые влияют на ufds и тем фактом, что вы передаете неправильное значение nfds в poll(). Вам также следует сбросить значения pollfd.revents перед следующим вызовом на poll().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...