синхронное мультиплексирование ввода / вывода (synchronous I/O multiplexing)
Обоснование (Rationale)
In earlier versions of the Single UNIX Specification, the
select() function was defined in the <sys/time.h> header. This is
now changed to <sys/select.h>. The rationale for this change was
as follows: the introduction of the pselect() function included
the <sys/select.h> header and the <sys/select.h> header defines
all the related definitions for the pselect() and select()
functions. Backwards-compatibility to existing XSI
implementations is handled by allowing <sys/time.h> to include
<sys/select.h>.
Code which wants to avoid the ambiguity of the signal mask for
thread cancellation handlers can install an additional
cancellation handler which resets the signal mask to the expected
value.
void cleanup(void *arg)
{
sigset_t *ss = (sigset_t *) arg;
pthread_sigmask(SIG_SETMASK, ss, NULL);
}
int call_pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set errorfds, const struct timespec *timeout,
const sigset_t *sigmask)
{
sigset_t oldmask;
int result;
pthread_sigmask(SIG_SETMASK, NULL, &oldmask);
pthread_cleanup_push(cleanup, &oldmask);
result = pselect(nfds, readfds, writefds, errorfds, timeout, sigmask);
pthread_cleanup_pop(0);
return result;
}