私は名前付きパイプのセットを少しずつポーリングしようとしています。名前付きパイプファイル記述子で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。
誰かがこれに遭遇しますか?これは本当のバグですね?
タイムアウトはライターなしの正しい動作です。私はさらにテストするための簡単なライタープログラムを書いています。そして、QのプログラムはLinx/OpenBSD上のFIFOをうまく読み込み、OS X上で悲惨に失敗します(同じPOLLNVAL問題)。 – dwc