Bug 40852
Summary: | select(2): document action of close()'ing a fd during a select() | ||
---|---|---|---|
Product: | Documentation | Reporter: | Stephane Fillod (fillods) |
Component: | man-pages | Assignee: | documentation_man-pages (documentation_man-pages) |
Status: | RESOLVED CODE_FIX | ||
Severity: | normal | CC: | mtk.manpages |
Priority: | P1 | ||
Hardware: | All | ||
OS: | Linux | ||
Kernel Version: | n/a | Subsystem: | |
Regression: | No | Bisected commit-id: |
Description
Stephane Fillod
2011-08-10 13:28:24 UTC
Confirmed, with the program below. #include <sys/time.h> #include <pthread.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) #define errExitEN(en, msg) \ do { errno = en; perror(msg); \ exit(EXIT_FAILURE); } while (0) static void * threadFunc(void *arg) { sleep(2); printf("Closing file descriptor\n"); close(STDIN_FILENO); return NULL; } /* threadFunc */ int main(int argc, char *argv[]) { pthread_t t1; fd_set readfds; int ready, s; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); s = pthread_create(&t1, NULL, threadFunc, (void *) 1); if (s != 0) errExitEN(s, "pthread_create"); printf("Main thread about to call select()\n"); ready = select(STDIN_FILENO + 1, &readfds, NULL, NULL, NULL); if (ready == -1) errExit("select"); s = pthread_join(t1, NULL); if (s != 0) errExitEN(s, "pthread_join"); printf("Main thread exiting\n"); exit(EXIT_SUCCESS); } I added some text under NOTES in select(2). --- a/man2/select.2 +++ b/man2/select.2 @@ -411,6 +411,22 @@ when .B _GNU_SOURCE is defined. Since glibc 2.2.2 the requirements are as shown in the SYNOPSIS. +.SS Multithreaded applications +If a file descriptor being monitored by +.BR select () +is closed in another thread, the result is unspecified. +On some UNIX systems, +.BR 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 the file descriptor reopened between the time +.BR select () +returned and the I/O operations was performed). +On Linux (and some other systems), +closing the file descriptor in another thread has no effect on +.BR select (). +In summary, any application that relies on a particular behavior +in this scenario must be considered buggy. .SS "Linux Notes" The .BR pselect () Also added a note to poll(2) that points to the discussion in select(2). Also added a note to epoll_wait(2) that points to the discussion in select(2). |