From: Motohiro KOSAKI Date: 2011-11-09T01:40:10+09:00 Subject: [ruby-dev:44840] [ruby-trunk - Bug #5524] IO.wait_for_single_fd(closed fd) sticks on other than Linux Issue #5524 has been updated by Motohiro KOSAKI. なるせさんのテストプロは selectのmaxfds引数が間違っているので、動かないのは期待通りではないでしょうか。以下の修正をあててFreeBSDで 動かしてもらえませんか ~/projects/test/select_ebadf% diff -u select_badf.c.orig select_badf.c diff -u select_badf.c.orig select_badf.c --- select_badf.c.orig 2011-11-08 11:33:44.000000000 -0500 +++ select_badf.c 2011-11-08 11:38:26.000000000 -0500 @@ -3,6 +3,8 @@ #include #include +#define max(x,y) ((x > y) ? x : y) + int main(void) { int pipes[2]; @@ -18,7 +20,8 @@ //struct timeval *timeout = NULL; //FD_SET(r, &readfds); FD_SET(w, &writefds); - res = select(1, &readfds, &writefds, &exceptfds, NULL); + res = select(max(r,w)+1, &readfds, &writefds, &exceptfds, NULL); + return 0; } ---------------------------------------- Bug #5524: IO.wait_for_single_fd(closed fd) sticks on other than Linux http://redmine.ruby-lang.org/issues/5524 Author: Yui NARUSE Status: Assigned Priority: Normal Assignee: Motohiro KOSAKI Category: Target version: ruby -v: - r31428 で、test_wait_for_invalid_fd ってテストを追加しており、 IO.wait_for_single_fd(close 済みの fd) が EBADF になることを確認しているのですが、 これ単体で動かすと FreeBSD で戻ってきません。 思うに、このテストって本来ポータブルに刺さる物なんじゃないでしょうか。 test-allだと何かの弾みで通ってしまうだけで。 % 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 が返り、 #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依存なんじゃ無いかという疑惑を持っているんですがどうでしょう。 -- http://redmine.ruby-lang.org