2012-02-06 52 views
5

我是新來的套接字編程,我試圖找出投票如何工作。所以我做了一個小例子程序。該程序似乎按照我期望的方式工作,但是當我註釋掉int dummy的行時,for循環僅在假設執行10次時才運行一次迭代。我不明白的是這個變量與for循環有什麼關係。程序假設在3.5秒後打印「超時」,如果有可用輸入,則打印「返回打印」。輪詢函數如何在c中工作?

#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; 
} 

回答

7
if((rv = poll(ufds, 2, 3500)) == -1) perror("select"); 
        ^

你告訴poll你有2個文件描述符(2 pollfd結構),但你只能有一個。這是未定義的行爲(你正在欺騙民意調查,踩入未分配的內存)。註釋出時更改參數1

+0

順便說一句,原來的海報應該仔細閱讀'民意調查'的手冊頁,例如http://linux.die.net/man/2/poll – 2012-02-07 05:26:46

2

的行爲變化dummy是因爲改變堆的可能影響ufds和您傳遞了錯誤的nfds值到poll()的事實。在下一次撥打poll()之前,您還應該重置pollfd.revents的值。