Open Source Web Development Tutorials - Dev Shed
Linuxファイルとイベントポーリングインターフェース
(2009/03/10公開)
Epollでイベント待機
epoll_wait()システムコールは、epollインスタンスと関連付いたファイル記述子のイベントを待機します。
#include <sys/epoll.h>
int epoll_wait (int epfd,
struct epoll_event *events,
int maxevents,
int timeout);
epoll_wait()のコールは、最長timeoutミリ秒まで、epollインスタンスepfdに関連付いたファイルのイベントを待機します。成功すると、最多maxeventsイベントまで、各イベントを記述するepoll_event構造を含むメモリーをeventsが指摘します。戻り値はイベント数です。エラーの場合は-1が戻り、errnoが以下のいずれかを示します。
EBADF
epfdが有効なファイル記述子ではありません。
EFAULT
eventsが指摘したメモリーへの書き込みアクセス権がありません。
EINTR
信号によって中断されたため、システムコールを完了できませんでした。
EINVAL
epfdが有効なepollインスタンスではありません。あるいは、maxeventsがゼロ以下です。
timeoutがゼロの場合は、たとえ入手できるイベントがなくても、直ちにコールがゼロを戻します。Timeoutが-1の場合は、イベントが入手できるまで、コールは戻りません。
コールが戻ると、epoll_event構造のeventsフィールドが発生したイベントを記述します。Dataフィールドには、内容にかかわらず、epoll_ctl()を呼び出す前にユーザーが設定した内容が入っています。
epoll_wait()例の全体は、以下のようになります。
#define MAX_EVENTS 64
struct epoll_event *events;
int nr_events, i, epfd;
events = malloc (sizeof (struct epoll_event) * MAX_EVENTS);
if (!events) {
perror ("malloc");
return 1;
}
nr_events = epoll_wait (epfd, events, MAX_EVENTS, -1);
if (nr_events < 0) {
perror ("epoll_wait");
free (events);
return 1;
}
for (i = 0; i < nr_events; i++) {
printf ("event=%ld on fd=%d\n",
events[i].events,
events[i].data.fd);
/*
* We now can, per events[i].events, operate on
* events[i].data.fd without blocking.
*/
}
free (events);
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








