The Linux Programming Interface

(nextflipdebug5) #1
Alternative I/O Models 1357

The fd argument identifies which of the file descriptors in the interest list is to have
its settings modified. This argument can be a file descriptor for a pipe, FIFO,
socket, POSIX message queue, inotify instance, terminal, device, or even another epoll
descriptor (i.e., we can build a kind of hierarchy of monitored descriptors). However,
fd can’t be a file descriptor for a regular file or a directory (the error EPERM results).
The op argument specifies the operation to be performed, and has one of the
following values:


EPOLL_CTL_ADD
Add the file descriptor fd to the interest list for epfd. The set of events that
we are interested in monitoring for fd is specified in the buffer pointed to
by ev, as described below. If we attempt to add a file descriptor that is
already in the interest list, epoll_ctl() fails with the error EEXIST.


EPOLL_CTL_MOD
Modify the events setting for the file descriptor fd, using the information
specified in the buffer pointed to by ev. If we attempt to modify the set-
tings of a file descriptor that is not in the interest list for epfd, epoll_ctl() fails
with the error ENOENT.


EPOLL_CTL_DEL
Remove the file descriptor fd from the interest list for epfd. The ev argu-
ment is ignored for this operation. If we attempt to remove a file descriptor
that is not in the interest list for epfd, epoll_ctl() fails with the error ENOENT.
Closing a file descriptor automatically removes it from all of the epoll interest
lists of which it is a member.


The ev argument is a pointer to a structure of type epoll_event, defined as follows:


struct epoll_event {
uint32_t events; /* epoll events (bit mask) */
epoll_data_t data; /* User data */
};

The data field of the epoll_event structure is typed as follows:


typedef union epoll_data {
void *ptr; /* Pointer to user-defined data */
int fd; /* File descriptor */
uint32_t u32; /* 32-bit integer */
uint64_t u64; /* 64-bit integer */
} epoll_data_t;

The ev argument specifies settings for the file descriptor fd, as follows:


z The events subfield is a bit mask specifying the set of events that we are inter-
ested in monitoring for fd. We say more about the bit values that can be used in
this field in the next section.


z The data subfield is a union, one of whose members can be used to specify
information that is passed back to the calling process (via epoll_wait()) if fd later
becomes ready.

Free download pdf