From: KOSAKI Motohiro Date: 2011-11-01T02:36:39+09:00 Subject: [ruby-dev:44745] Re: [ruby-trunk - Bug #5524][Assigned] IO.wait_for_single_fd(closed fd) sticks on other than Linux 小崎です ええと、なるせさんの論旨がいまいちまだ把握できてない気がするのですが・・・・ > r31428 で、test_wait_for_invalid_fd ってテストを追加しており、 > IO.wait_for_single_fd(close 済みの fd) が EBADF になることを確認しているのですが、 > これ単体で動かすと FreeBSD で戻ってきません。 > > 思うに、このテストって本来ポータブルに刺さる物なんじゃないでしょうか。 > test-allだと何かの弾みで通ってしまうだけで。 Macとかでも刺さらないです。 > % cat poll.c > #include > #include > #include > #include > int > main(void) { > int pipes[2]; > int res = pipe(pipes); > if (res != 0) abort(); > int r = pipes[0]; > int w = pipes[1]; > res = close(w); > if (res != 0) abort(); > > struct pollfd fds; > fds.fd = w; > fds.events = POLLOUT; > errno = 0; > res = poll(&fds, 1, 1000); > fprintf(stderr, "%d %d %d\n", res, errno, fds.revents); > return 0; > } > > というプログラムではポータブルに POLLVAL が返り、 POLLVALが返ると思いますが、poll つかうのはLinuxのときだけなんで 今回の件は無関係ではないでしょうか。 > #include > #include > #include > int > main(void) { > int pipes[2]; > int res = pipe(pipes); > if (res != 0) abort(); > int r = pipes[0]; > int w = pipes[1]; > res = close(w); > if (res != 0) abort(); > fd_set readfds; FD_ZERO(&readfds); > fd_set writefds; FD_ZERO(&writefds); > fd_set exceptfds; FD_ZERO(&exceptfds); > //struct timeval *timeout = NULL; > //FD_SET(r, &readfds); > FD_SET(w, &writefds); > res = select(1, &readfds, &writefds, &exceptfds, NULL); > return 0; > } > > はポータブルにブロックされるあたり、このテストってLinux依存なんじゃ無いかという疑惑を持っているんですがどうでしょう。 SUSはEBADFを要求しているのでFreeBSDのバグではないでしょうか? http://pubs.opengroup.org/onlinepubs/7908799/xsh/select.html FreeBSDのときだけテストスキップじゃだめ?