2015-09-18 64 views
0

我一直在處理這段代碼一段時間,由於某種原因民意調查返回零,即使有數據要從outFds管道讀入。由於某些原因,如果我讀入一些數據,然後運行poll,它會返回適當的值,但這不是解決方案。有沒有人看過這個,知道我該怎麼做?民意調查返回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

似乎就像你在孩子寫入管道之前進行「輪詢」。在「民意調查」之前,您是否嘗試過再次安排「睡眠」? – 5gon12eder

+1

「即使有數據要從outFds管道讀入,輪詢返回零」。你怎麼知道有數據要被讀取?你的代碼中沒有任何東西可以保證子'printf'在父'poll'之前執行。特別是因爲你在調用'printf'之前在孩子中有一個'睡眠'。所以我的錢是在「投票」行爲正確,你的假設不正確。 – kaylum

+0

謝謝艾倫!我現在看到我在錯誤的地方睡了一覺,這就解釋了爲什麼閱讀一個字節解決了問題。我不知何故忘了閱讀塊哈哈。 – Daniel

回答

0

從手冊頁:

指定零超時導致民意調查()如果沒有文件描述符準備立即返回,甚至 。

我看這是一個結構的timespec與tv_sectv_nsec設置爲0,但似乎投入nullptr具有相同的效果。