2009-02-26 11 views
3

私は名前付きパイプのセットを少しずつポーリングしようとしています。名前付きパイプファイル記述子でPOLLNVALの即時応答が得られます。このblog post about broken polling in OS Xを見つけた後、私はこれがOS Xのバグのバグだと確信しています。名前付きパイプ(FIFO)でpoll()を使用するとOS Xにバグがあります...エキスパートが確認できますか?

私はすでにUDPソケットを使用して自分のコードを切り替えるつもりですが、私はそれが本当に壊れていると確信している、そしてb)ドキュメンテーションの目的のために。 (私がテストした上記のリンク、内のコードはかなりよくそれを呪文が)ここで

は、私が書いたコードのストリップダウンバージョンです:

#includes 
... 
.... 
# 

static const char* first_fifo_path = "/tmp/fifo1"; 
static const char* second_fifo_path = "/tmp/fifo2"; 

int setup_read_fifo(const char* path){ 
    int fifo_fd = -1; 

    if(mkfifo(path, S_IRWXU | S_IRWXG | S_IRWXO)) 
    perror("error calling mkfifo()... already exists?\n"); 

    if((fifo_fd = open(path, O_RDONLY | O_NDELAY)) < 0) 
    perror("error calling open()"); 

    return fifo_fd; 
} 

void do_poll(int fd1, int fd2){ 
    char inbuf[1024]; 
    int num_fds = 2; 
    struct pollfd fds[num_fds]; 
    int timeout_msecs = 500; 

    fds[0].fd = fd1; 
    fds[1].fd = fd2; 
    fds[0].events = POLLIN; 
    fds[1].events = POLLIN; 

    int ret; 
    while((ret = poll(fds, num_fds, timeout_msecs)) >= 0){ 
    if(ret < 0){ 
     printf("Error occured when polling\n"); 
     printf("ret %d, errno %d\n", ret, errno); 
     printf("revents = %xh : %xh \n\n", fds[0].revents, fds[1].revents); 
    } 

    if(ret == 0){ 
     printf("Timeout Occurred\n"); 
     continue; 
    }                 

    for(int i = 0; i< num_fds; i++){ 
     if(int event = fds[i].revents){ 

     if(event & POLLHUP) 
      printf("Pollhup\n"); 
     if(event & POLLERR) 
      printf("POLLERR\n"); 
     if(event & POLLNVAL) 
      printf("POLLNVAL\n"); 

     if(event & POLLIN){ 
      read(fds[i].fd, inbuf, sizeof(inbuf)); 
      printf("Received: %s", inbuf); 
     } 
     } 
    } 
    } 
} 

int main (int argc, char * const argv[]) { 
    do_poll(setup_read_fifo(first_fifo_path), setup_read_fifo(second_fifo_path)); 
    return 0; 
} 

この出力:

 
$ ./executive 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
POLLNVAL 
... 

ad nauseam。

誰かがこれに遭遇しますか?これは本当のバグですね?

答えて

3

これは本物のバグのようです。 LinuxやOpenBSDでは期待通りに動作し、OS Xで説明したように失敗します。

3

OSX 10.4.1、動作を確認できます。同じコードはLinux上でうまく動作します(タイムアウトメッセージが問題ない限り)。これを含むすべての証拠 - http://www.virtualbox.de/changeset/12347 - は本当の問題があることを示唆しています。

+0

タイムアウトはライターなしの正しい動作です。私はさらにテストするための簡単なライタープログラムを書いています。そして、QのプログラムはLinx/OpenBSD上のFIFOをうまく読み込み、OS X上で悲惨に失敗します(同じPOLLNVAL問題)。 – dwc

1

はい、既知のバグです。私は投票の破損は10.4年以来だと思うし、Finkでそれを処理しなければならなかった。 Glibのconfigure.inはこれをテストしているので、あなたが想像していないことを確かめることができます。 (これは正確ではありませんが、デバイスでのポーリングのためのglibテストはFIFOではありません)

関連する問題