2012-02-06 38 views
5

私はソケットプログラミングの新人です。私は投票の仕組みを理解しようとしています。そこで私は小さなサンプルプログラムを作った。プログラムは私の期待通りに動作するようですが、int dummyの行をコメントアウトすると、forループは10回実行すると1回の繰り返ししか実行しません。私が理解していないのは、その変数がforループとどのように関係しているかです。プログラムは、3.5秒後に "timeout"を出力し、利用可能な入力があれば "return hit"を出力すると仮定しています。ポーリング機能はどのように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"); 
        ^

あなたは2つのファイルディスクリプタ(2たpollfd構造)を持っていますが、1つしかないpoll語っています。それはの未定義の動作です(未割り当てのメモリを掘り下げるためにポールを騙しています)。コメントアウトdummyするため、その効果ufds、あなたがpoll()に間違っnfds値を渡しているという事実スタックへの変更の可能性があるときに1

+0

ところで、元のポスターは 'poll'のマニュアルページを注意深く読んでください。 http://linux.die.net/man/2/poll –

2

行動の変化にその引数を変更します。 poll()を呼び出す前に、pollfd.reventsの値をリセットする必要があります。

関連する問題