Функция Select (Linux) всегда возвращает 0 - PullRequest
2 голосов
/ 18 мая 2011

Функция выбора в моем случае всегда возвращает ноль, что является тайм-аутом, и это происходит непрерывно, поэтому загрузка процессора также увеличивается до 98% для моего процесса.Я также попытался установить NULL вместо установки некоторого значения тайм-аута, тем не менее он возвращает ноль.Я также использовал функцию опроса, заменяющую select.Та же проблема возникла и с опросом.

вот часть моего кода;

while(1)
{        
    value = 0;
    selectTimeOut = 0;
    memset(buf,0,SIZE);
    FD_ZERO(&read_fds);
    FD_SET(fd, &read_fds);
    struct timeval tv;
    tv.tv_sec = 10;
    tv.tv_usec = 1000;
    fdmax = fd;

    //using select to reduce cpu utilization
    selectret = select(fdmax + 1,&read_fds,NULL,NULL,&tv);
    if (selectret == -1)
    {
       print_sync("/home/fes/syclogs.txt","Select fails");
       exit(0);
    }
    else
    {
        print_sync("/home/fes/syclogs.txt","Error set is %s",strerror(errno));
        if(!FD_ISSET(fd, &read_fds))
        {
            print_sync("/home/fes/syclogs.txt","Select Time Out");
            selectTimeOut = 1;
        }
    }
    if(selectTimeOut == 1)
        continue;
    noread  = read(fd,buf,SIZE);
}

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Ваша логика не имеет смысла. errno интересен, только если select () возвращает -1. Если он возвращает ноль, никакие fds не были готовы, поэтому был тайм-аут, и не нужно было ничего проверять Если он возвращает положительное значение, вам нужно зациклить и обработать столько готовых fd.

0 голосов
/ 18 мая 2011

Почему бы вам не проверить конец файла или подобное условие? Я считаю, что EOF или другое исключительное состояние вашего дескриптора идеально подходит для этой ситуации.

Возможно, вам следует дополнительно описать дескриптор и контекст. Откуда берется fd? Какой источник данных он представляет?

Глядя на ваши отладочные сообщения, можно прийти к выводу, что вы пытаетесь отслеживать изменения обычного файла. Я не думаю, что выбор может помочь с этой задачей.

Источник утилиты Tail может помочь вам реализовать ваш код мониторинга файлов.

...