2015-09-18 8 views
0

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

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/poll.h> 

int main(void) 
{ 
    int outFds[2]; 

    pipe(outFds); 

    if(!fork()) { 
     dup2(outFds[1], 1); 

     close(outFds[0]); 
     close(outFds[1]); 

     // disable printf buffering 
     setvbuf(stdout, NULL, _IONBF, 0); 

     sleep(1); 
     char buf[32]; 
     printf("blah"); 

     exit(0); 
    } 

    close(outFds[1]); 

    char c; 
    // Read 'b' into c. If this next line is not commented poll returns 1 
    //read(outFds[0], &c, 1); 

    struct pollfd outFd; 
    outFd.fd = outFds[0]; 
    outFd.events = POLLIN; 
    printf("%d\n", poll(&outFd, 1, 0)); // poll returns 0 for some reason 
} 
+0

Кажется, что вы 'poll', прежде чем ребенок написал в трубу. Вы пытались поставить еще «sleep» перед «poll»? – 5gon12eder

+1

"Опрос возвращает ноль, несмотря на то, что есть данные, которые нужно прочитать из трубы outFds". Откуда вы знаете, что есть данные для чтения? Ничто в коде не гарантирует, что дочерний 'printf' выполняется перед родительским' poll'. Тем более, что у вас есть «спать» у ребенка до вызова 'printf'. Таким образом, мои деньги на 'poll' ведут себя правильно, и ваше предположение неверно. – kaylum

+0

Спасибо Алан! Теперь я вижу, что спал не в том месте, и это объясняет, почему чтение в байте фиксировало проблему. Я как-то забыл, что читает блоки ха-ха. – Daniel

ответ

0

Из страницы руководства:

Задание тайм-аута нуля вызывает опрос(), чтобы вернуться немедленно, даже если нет файловых дескрипторов не будут готовы.

Я прочитал это как TimeSpec структуры с tv_sec и tv_nsec набор для 0, но мне кажется, что положить в nullptr имеет тот же эффект.