Movatterモバイル変換


[0]ホーム

URL:


man7.org > Linux >man-pages

Linux/UNIX system programming training


select(2) — Linux manual page

NAME |LIBRARY |SYNOPSIS |DESCRIPTION |RETURN VALUE |ERRORS |VERSIONS |STANDARDS |HISTORY |NOTES |BUGS |EXAMPLES |SEE ALSO |COLOPHON

select(2)                  System Calls Manualselect(2)

NAME        top

       select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO, fd_set -       synchronous I/O multiplexing

LIBRARY        top

       Standard C library (libc,-lc)

SYNOPSIS        top

#include <sys/select.h>typedef/* ... */fd_set;int select(intnfds, fd_set *_Nullable restrictreadfds,fd_set *_Nullable restrictwritefds,fd_set *_Nullable restrictexceptfds,struct timeval *_Nullable restricttimeout);void FD_CLR(intfd, fd_set *set);int  FD_ISSET(intfd, fd_set *set);void FD_SET(intfd, fd_set *set);void FD_ZERO(fd_set *set);int pselect(intnfds, fd_set *_Nullable restrictreadfds,fd_set *_Nullable restrictwritefds,fd_set *_Nullable restrictexceptfds,const struct timespec *_Nullable restricttimeout,const sigset_t *_Nullable restrictsigmask);   Feature Test Macro Requirements for glibc (seefeature_test_macros(7)):pselect():           _POSIX_C_SOURCE >= 200112L

DESCRIPTION        top

WARNING:select() can monitor only file descriptors numbers that       are less thanFD_SETSIZE(1024)—an unreasonably low limit for many       modern applications—and this limitation will not change.  All       modern applications should instead usepoll(2) orepoll(7), which       do not suffer this limitation.select() allows a program to monitor multiple file descriptors,       waiting until one or more of the file descriptors become "ready"       for some class of I/O operation (e.g., input possible).  A file       descriptor is considered ready if it is possible to perform a       corresponding I/O operation (e.g.,read(2), or a sufficiently       smallwrite(2)) without blocking.fd_set       A structure type that can represent a set of file descriptors.       According to POSIX, the maximum number of file descriptors in anfd_set structure is the value of the macroFD_SETSIZE.File descriptor sets       The principal arguments ofselect() are three "sets" of file       descriptors (declared with the typefd_set), which allow the       caller to wait for three classes of events on the specified set of       file descriptors.  Each of thefd_set arguments may be specified       as NULL if no file descriptors are to be watched for the       corresponding class of events.Note well: Upon return, each of the file descriptor sets is       modified in place to indicate which file descriptors are currently       "ready".  Thus, if usingselect() within a loop, the setsmust bereinitialized before each call.       The contents of a file descriptor set can be manipulated using the       following macros:FD_ZERO()              This macro clears (removes all file descriptors from)set.              It should be employed as the first step in initializing a              file descriptor set.FD_SET()              This macro adds the file descriptorfd toset.  Adding a              file descriptor that is already present in the set is a no-              op, and does not produce an error.FD_CLR()              This macro removes the file descriptorfd fromset.              Removing a file descriptor that is not present in the set              is a no-op, and does not produce an error.FD_ISSET()select() modifies the contents of the sets according to the              rules described below.  After callingselect(), theFD_ISSET() macro can be used to test if a file descriptor              is still present in a set.FD_ISSET() returns nonzero if              the file descriptorfd is present inset, and zero if it is              not.Arguments       The arguments ofselect() are as follows:readfds              The file descriptors in this set are watched to see if they              are ready for reading.  A file descriptor is ready for              reading if a read operation will not block; in particular,              a file descriptor is also ready on end-of-file.              Afterselect() has returned,readfds will be cleared of all              file descriptors except for those that are ready for              reading.writefds              The file descriptors in this set are watched to see if they              are ready for writing.  A file descriptor is ready for              writing if a write operation will not block.  However, even              if a file descriptor indicates as writable, a large write              may still block.              Afterselect() has returned,writefds will be cleared of              all file descriptors except for those that are ready for              writing.exceptfds              The file descriptors in this set are watched for              "exceptional conditions".  For examples of some exceptional              conditions, see the discussion ofPOLLPRIinpoll(2).              Afterselect() has returned,exceptfds will be cleared of              all file descriptors except for those for which an              exceptional condition has occurred.nfds   This argument should be set to the highest-numbered file              descriptor in any of the three sets, plus 1.  The indicated              file descriptors in each set are checked, up to this limit              (but see BUGS).timeout              Thetimeout argument is atimeval structure (shown below)              that specifies the interval thatselect() should block              waiting for a file descriptor to become ready.  The call              will block until either:              •  a file descriptor becomes ready;              •  the call is interrupted by a signal handler; or              •  the timeout expires.              Note that thetimeout interval will be rounded up to the              system clock granularity, and kernel scheduling delays mean              that the blocking interval may overrun by a small amount.              If both fields of thetimeval structure are zero, thenselect() returns immediately.  (This is useful for              polling.)              Iftimeout is specified as NULL,select() blocks              indefinitely waiting for a file descriptor to become ready.pselect()       Thepselect() system call allows an application to safely wait       until either a file descriptor becomes ready or until a signal is       caught.       The operation ofselect() andpselect() is identical, other than       these three differences:       •select() uses a timeout that is astruct timeval (with seconds          and microseconds), whilepselect() uses astruct timespec (with          seconds and nanoseconds).       •select() may update thetimeout argument to indicate how much          time was left.pselect() does not change this argument.       •select() has nosigmask argument, and behaves aspselect()          called with NULLsigmask.sigmask is a pointer to a signal mask (seesigprocmask(2)); if it       is not NULL, thenpselect() first replaces the current signal mask       by the one pointed to bysigmask, then does the "select" function,       and then restores the original signal mask.  (Ifsigmask is NULL,       the signal mask is not modified during thepselect() call.)       Other than the difference in the precision of thetimeout       argument, the followingpselect() call:           ready = pselect(nfds, &readfds, &writefds, &exceptfds,                           timeout, &sigmask);       is equivalent toatomically executing the following calls:           sigset_t origmask;           pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);           ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);           pthread_sigmask(SIG_SETMASK, &origmask, NULL);       The reason thatpselect() is needed is that if one wants to wait       for either a signal or for a file descriptor to become ready, then       an atomic test is needed to prevent race conditions.  (Suppose the       signal handler sets a global flag and returns.  Then a test of       this global flag followed by a call ofselect() could hang       indefinitely if the signal arrived just after the test but just       before the call.  By contrast,pselect() allows one to first block       signals, handle the signals that have come in, then callpselect()       with the desiredsigmask, avoiding the race.)The timeout       Thetimeout argument forselect() is a structure of the following       type:           struct timeval {               time_t      tv_sec;         /* seconds */               suseconds_t tv_usec;        /* microseconds */           };       The corresponding argument forpselect() is atimespec(3)       structure.       On Linux,select() modifiestimeout to reflect the amount of time       not slept; most other implementations do not do this.  (POSIX.1       permits either behavior.)  This causes problems both when Linux       code which readstimeout is ported to other operating systems, and       when code is ported to Linux that reuses astruct timeval for       multipleselect()s in a loop without reinitializing it.  Considertimeout to be undefined afterselect() returns.

RETURN VALUE        top

       On success,select() andpselect() return the number of file       descriptors contained in the three returned descriptor sets (that       is, the total number of bits that are set inreadfds,writefds,exceptfds).  The return value may be zero if the timeout expired       before any file descriptors became ready.       On error, -1 is returned, anderrno is set to indicate the error;       the file descriptor sets are unmodified, andtimeout becomes       undefined.

ERRORS        top

EBADFAn invalid file descriptor was given in one of the sets.              (Perhaps a file descriptor that was already closed, or one              on which an error has occurred.)  However, see BUGS.EINTRA signal was caught; seesignal(7).EINVALnfds is negative or exceeds theRLIMIT_NOFILEresource              limit (seegetrlimit(2)).EINVALThe value contained withintimeout is invalid.ENOMEMUnable to allocate memory for internal tables.

VERSIONS        top

       On some other UNIX systems,select() can fail with the errorEAGAINif the system fails to allocate kernel-internal resources,       rather thanENOMEMas Linux does.  POSIX specifies this error forpoll(2), but not forselect().  Portable programs may wish to       check forEAGAINand loop, just as withEINTR.

STANDARDS        top

       POSIX.1-2008.

HISTORY        top

select()              POSIX.1-2001, 4.4BSD (first appeared in 4.2BSD).              Generally portable to/from non-BSD systems supporting              clones of the BSD socket layer (including System V              variants).  However, note that the System V variant              typically sets the timeout variable before returning, but              the BSD variant does not.pselect()              Linux 2.6.16.  POSIX.1g, POSIX.1-2001.              Prior to this, it was emulated in glibc (but see BUGS).fd_setPOSIX.1-2001.

NOTES        top

       The following header also provides thefd_set type:<sys/time.h>.       Anfd_set is a fixed size buffer.  ExecutingFD_CLR() orFD_SET()       with a value offd that is negative or is equal to or larger thanFD_SETSIZEwill result in undefined behavior.  Moreover, POSIX       requiresfd to be a valid file descriptor.       The operation ofselect() andpselect() is not affected by theO_NONBLOCKflag.The self-pipe trick       On systems that lackpselect(), reliable (and more portable)       signal trapping can be achieved using the self-pipe trick.  In       this technique, a signal handler writes a byte to a pipe whose       other end is monitored byselect() in the main program.  (To avoid       possibly blocking when writing to a pipe that may be full or       reading from a pipe that may be empty, nonblocking I/O is used       when reading from and writing to the pipe.)Emulating usleep(3)       Before the advent ofusleep(3), some code employed a call toselect() with all three sets empty,nfds zero, and a non-NULLtimeout as a fairly portable way to sleep with subsecond       precision.Correspondence between select() and poll() notifications       Within the Linux kernel source, we find the following definitions       which show the correspondence between the readable, writable, and       exceptional condition notifications ofselect() and the event       notifications provided bypoll(2) andepoll(7):           #define POLLIN_SET  (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN |                                EPOLLHUP | EPOLLERR)                              /* Ready for reading */           #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT |                                EPOLLERR)                              /* Ready for writing */           #define POLLEX_SET  (EPOLLPRI)                              /* Exceptional condition */Multithreaded applications       If a file descriptor being monitored byselect() is closed in       another thread, the result is unspecified.  On some UNIX systems,select() unblocks and returns, with an indication that the file       descriptor is ready (a subsequent I/O operation will likely fail       with an error, unless another process reopens the file descriptor       between the timeselect() returned and the I/O operation is       performed).  On Linux (and some other systems), closing the file       descriptor in another thread has no effect onselect().  In       summary, any application that relies on a particular behavior in       this scenario must be considered buggy.C library/kernel differences       The Linux kernel allows file descriptor sets of arbitrary size,       determining the length of the sets to be checked from the value ofnfds.  However, in the glibc implementation, thefd_set type is       fixed in size.  See also BUGS.       Thepselect() interface described in this page is implemented by       glibc.  The underlying Linux system call is namedpselect6().       This system call has somewhat different behavior from the glibc       wrapper function.       The Linuxpselect6() system call modifies itstimeout argument.       However, the glibc wrapper function hides this behavior by using a       local variable for the timeout argument that is passed to the       system call.  Thus, the glibcpselect() function does not modify       itstimeout argument; this is the behavior required by       POSIX.1-2001.       The final argument of thepselect6() system call is not asigset_t * pointer, but is instead a structure of the form:           struct {               const kernel_sigset_t *ss;   /* Pointer to signal set */               size_t ss_len;               /* Size (in bytes) of object                                               pointed to by 'ss' */           };       This allows the system call to obtain both a pointer to the signal       set and its size, while allowing for the fact that most       architectures support a maximum of 6 arguments to a system call.       Seesigprocmask(2) for a discussion of the difference between the       kernel and libc notion of the signal set.Historical glibc details       glibc 2.0 provided an incorrect version ofpselect() that did not       take asigmask argument.       From glibc 2.1 to glibc 2.2.1, one must define_GNU_SOURCEin       order to obtain the declaration ofpselect() from<sys/select.h>.

BUGS        top

       POSIX allows an implementation to define an upper limit,       advertised via the constantFD_SETSIZE, on the range of file       descriptors that can be specified in a file descriptor set.  The       Linux kernel imposes no fixed limit, but the glibc implementation       makesfd_set a fixed-size type, withFD_SETSIZEdefined as 1024,       and theFD_*() macros operating according to that limit.  To       monitor file descriptors greater than 1023, usepoll(2) orepoll(7) instead.       The implementation of thefd_set arguments as value-result       arguments is a design error that is avoided inpoll(2) andepoll(7).       According to POSIX,select() should check all specified file       descriptors in the three file descriptor sets, up to the limitnfds-1.  However, the current implementation ignores any file       descriptor in these sets that is greater than the maximum file       descriptor number that the process currently has open.  According       to POSIX, any such file descriptor that is specified in one of the       sets should result in the errorEBADF.       Starting with glibc 2.1, glibc provided an emulation ofpselect()       that was implemented usingsigprocmask(2) andselect().  This       implementation remained vulnerable to the very race condition thatpselect() was designed to prevent.  Modern versions of glibc use       the (race-free)pselect() system call on kernels where it is       provided.       On Linux,select() may report a socket file descriptor as "ready       for reading", while nevertheless a subsequent read blocks.  This       could for example happen when data has arrived but upon       examination has the wrong checksum and is discarded.  There may be       other circumstances in which a file descriptor is spuriously       reported as ready.  Thus it may be safer to useO_NONBLOCKon       sockets that should not block.       On Linux,select() also modifiestimeout if the call is       interrupted by a signal handler (i.e., theEINTRerror return).       This is not permitted by POSIX.1.  The Linuxpselect() system call       has the same behavior, but the glibc wrapper hides this behavior       by internally copying thetimeout to a local variable and passing       that variable to the system call.

EXAMPLES        top

       #include <stdio.h>       #include <stdlib.h>       #include <sys/select.h>       #include <sys/time.h>       int       main(void)       {           int             retval;           fd_set          rfds;           struct timeval  tv;           /* Watch stdin (fd 0) to see when it has input. */           FD_ZERO(&rfds);           FD_SET(0, &rfds);           /* Wait up to five seconds. */           tv.tv_sec = 5;           tv.tv_usec = 0;           retval = select(1, &rfds, NULL, NULL, &tv);           /* Don't rely on the value of tv now! */           if (retval == -1)               perror("select()");           else if (retval)               printf("Data is available now.\n");               /* FD_ISSET(0, &rfds) will be true. */           else               printf("No data within five seconds.\n");           exit(EXIT_SUCCESS);       }

SEE ALSO        top

accept(2),connect(2),poll(2),read(2),recv(2),restart_syscall(2),send(2),sigprocmask(2),write(2),timespec(3),epoll(7),time(7)       For a tutorial with discussion and examples, seeselect_tut(2).

COLOPHON        top

       This page is part of theman-pages (Linux kernel and C library       user-space interface documentation) project.  Information about       the project can be found at        ⟨https://www.kernel.org/doc/man-pages/⟩.  If you have a bug report       for this manual page, see       ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩.       This page was obtained from the tarball man-pages-6.15.tar.gz       fetched from       ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ on       2025-08-11.  If you discover any rendering problems in this HTML       version of the page, or you believe there is a better or more up-       to-date source for the page, or you have corrections or       improvements to the information in this COLOPHON (which isnot       part of the original manual page), send a mail to       man-pages@man7.orgLinux man-pages 6.15            2025-05-17select(2)

Pages that refer to this page:pmdaamdgpu(1)pmdanvidia(1)pmdapipe(1)pmdasystemd(1)strace(1)accept(2)alarm(2)connect(2)epoll_wait(2)eventfd(2)F_GETSIG(2const)FUTEX_FD(2const)io_uring_enter2(2)io_uring_enter(2)migrate_pages(2)open(2)pause(2)perf_event_open(2)perfmonctl(2)personality(2)pidfd_open(2)poll(2)PR_SET_TIMERSLACK(2const)read(2)recv(2)restart_syscall(2)seccomp_unotify(2)select_tut(2)send(2)signalfd(2)socket(2)syscalls(2)timerfd_create(2)TIOCPKT(2const)userfaultfd(2)write(2)avc_netlink_loop(3)ldap_get_option(3)ldap_result(3)pcap(3pcap)pcap_get_required_select_timeout(3pcap)pcap_get_selectable_fd(3pcap)pmrecord(3)pmtime(3)rpc(3)sctp_connectx(3)timeval(3type)ualarm(3)usleep(3)random(4)rtc(4)ldap.conf(5)proc_pid_mounts(5)slapd-asyncmeta(5)slapd-ldap(5)slapd-meta(5)systemd.exec(5)epoll(7)fanotify(7)inotify(7)mq_overview(7)pipe(7)pty(7)signal(7)signal-safety(7)socket(7)system_data_types(7)tcp(7)time(7)udp(7)setarch(8)



HTML rendering created 2025-09-06 byMichael Kerrisk, author ofThe Linux Programming Interface.

For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere.

Hosting byjambit GmbH.

Cover of TLPI


[8]ページ先頭

©2009-2025 Movatter.jp