epoll のドキュメントからこれを理解するのに苦労してpipe(fd)
いfd[0]
ますfd[1]
。に何かを書き込んfd[1]
で閉じます。
write(fd[1], "abc", 3);
write(fd[1], "def", 3);
close(fd[1]);
潜在的に同時に、epoll インスタンスを作成し、それが から読み取れるようになるまで待機するように指示し、読み取り可能になっfd[0]
たら 3 バイトを読み取ります。
int epoll_fd = epoll_create(10);
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = fd[0];
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd[0], &ev);
struct epoll_event event;
epoll_wait(epoll_fd, &event, 1, -1);
char buffer[100];
read(fd[0], buffer, 3);
ここで、epoll_wait
もう一度呼び出します。パイプが閉じられていても、カーネルにはまだ 3 バイトがバッファリングされているはずfd[0]
です。したがって、次が機能することを期待しています(つまり、ブロックしません):
epoll_wait(epoll_fd, &event, 1, -1);
read(fd[0], buffer, 3); // buffer should start with "def" now
これで、パイプには何も残っておらず、書き込み側が閉じられています。epoll_wait
3 度目の場合はどうすればよいですか?
epoll_wait(epoll_fd, &event, 1, -1); // will this block indefinitely?
read(fd[0], buffer, 3);
ここで異なる答えを示しているように見える 2 つの異なるコードがあります。