diff options
Diffstat (limited to 'man2/select_tut.2')
-rw-r--r-- | man2/select_tut.2 | 102 |
1 files changed, 51 insertions, 51 deletions
diff --git a/man2/select_tut.2 b/man2/select_tut.2 index 5d4a233df..e860de3cf 100644 --- a/man2/select_tut.2 +++ b/man2/select_tut.2 @@ -9,7 +9,7 @@ .\" various other changes .\" 2008-01-26, mtk, substantial changes and rewrites .\" -.TH SELECT_TUT 2 2023-02-05 "Linux man-pages 6.03" +.TH SELECT_TUT 2 2023-05-03 "Linux man-pages 6.05.01" .SH NAME select, pselect \- synchronous I/O multiplexing .SH LIBRARY @@ -85,13 +85,13 @@ Our program would look like: .PP .EX static volatile sig_atomic_t got_SIGCHLD = 0; - +\& static void child_sig_handler(int sig) { got_SIGCHLD = 1; } - +\& int main(int argc, char *argv[]) { @@ -99,14 +99,14 @@ main(int argc, char *argv[]) struct sigaction sa; fd_set readfds, writefds, exceptfds; int r; - +\& sigemptyset(&sigmask); sigaddset(&sigmask, SIGCHLD); if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == \-1) { perror("sigprocmask"); exit(EXIT_FAILURE); } - +\& sa.sa_flags = 0; sa.sa_handler = child_sig_handler; sigemptyset(&sa.sa_mask); @@ -114,26 +114,26 @@ main(int argc, char *argv[]) perror("sigaction"); exit(EXIT_FAILURE); } - +\& sigemptyset(&empty_mask); - +\& for (;;) { /* main loop */ /* Initialize readfds, writefds, and exceptfds before the pselect() call. (Code omitted.) */ - +\& r = pselect(nfds, &readfds, &writefds, &exceptfds, NULL, &empty_mask); if (r == \-1 && errno != EINTR) { /* Handle error */ } - +\& if (got_SIGCHLD) { got_SIGCHLD = 0; - +\& /* Handle signalled event here; e.g., wait() for all terminated children. (Code omitted.) */ } - +\& /* main body of program */ } } @@ -345,25 +345,25 @@ from one TCP port to another. #include <sys/select.h> #include <sys/socket.h> #include <unistd.h> - +\& static int forward_port; - +\& #undef max #define max(x, y) ((x) > (y) ? (x) : (y)) - +\& static int listen_socket(int listen_port) { int lfd; int yes; struct sockaddr_in addr; - +\& lfd = socket(AF_INET, SOCK_STREAM, 0); if (lfd == \-1) { perror("socket"); return \-1; } - +\& yes = 1; if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == \-1) @@ -372,7 +372,7 @@ listen_socket(int listen_port) close(lfd); return \-1; } - +\& memset(&addr, 0, sizeof(addr)); addr.sin_port = htons(listen_port); addr.sin_family = AF_INET; @@ -381,34 +381,34 @@ listen_socket(int listen_port) close(lfd); return \-1; } - +\& printf("accepting connections on port %d\en", listen_port); listen(lfd, 10); return lfd; } - +\& static int connect_socket(int connect_port, char *address) { int cfd; struct sockaddr_in addr; - +\& cfd = socket(AF_INET, SOCK_STREAM, 0); if (cfd == \-1) { perror("socket"); return \-1; } - +\& memset(&addr, 0, sizeof(addr)); addr.sin_port = htons(connect_port); addr.sin_family = AF_INET; - +\& if (!inet_aton(address, (struct in_addr *) &addr.sin_addr.s_addr)) { fprintf(stderr, "inet_aton(): bad IP address format\en"); close(cfd); return \-1; } - +\& if (connect(cfd, (struct sockaddr *) &addr, sizeof(addr)) == \-1) { perror("connect()"); shutdown(cfd, SHUT_RDWR); @@ -417,7 +417,7 @@ connect_socket(int connect_port, char *address) } return cfd; } - +\& #define SHUT_FD1 do { \e if (fd1 >= 0) { \e shutdown(fd1, SHUT_RDWR); \e @@ -425,7 +425,7 @@ connect_socket(int connect_port, char *address) fd1 = \-1; \e } \e } while (0) - +\& #define SHUT_FD2 do { \e if (fd2 >= 0) { \e shutdown(fd2, SHUT_RDWR); \e @@ -433,9 +433,9 @@ connect_socket(int connect_port, char *address) fd2 = \-1; \e } \e } while (0) - +\& #define BUF_SIZE 1024 - +\& int main(int argc, char *argv[]) { @@ -447,42 +447,42 @@ main(int argc, char *argv[]) char buf1[BUF_SIZE], buf2[BUF_SIZE]; fd_set readfds, writefds, exceptfds; ssize_t nbytes; - +\& if (argc != 4) { fprintf(stderr, "Usage\en\etfwd <listen\-port> " "<forward\-to\-port> <forward\-to\-ip\-address>\en"); exit(EXIT_FAILURE); } - +\& signal(SIGPIPE, SIG_IGN); - +\& forward_port = atoi(argv[2]); - +\& h = listen_socket(atoi(argv[1])); if (h == \-1) exit(EXIT_FAILURE); - +\& for (;;) { nfds = 0; - +\& FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); FD_SET(h, &readfds); nfds = max(nfds, h); - +\& if (fd1 > 0 && buf1_avail < BUF_SIZE) FD_SET(fd1, &readfds); /* Note: nfds is updated below, when fd1 is added to exceptfds. */ if (fd2 > 0 && buf2_avail < BUF_SIZE) FD_SET(fd2, &readfds); - +\& if (fd1 > 0 && buf2_avail \- buf2_written > 0) FD_SET(fd1, &writefds); if (fd2 > 0 && buf1_avail \- buf1_written > 0) FD_SET(fd2, &writefds); - +\& if (fd1 > 0) { FD_SET(fd1, &exceptfds); nfds = max(nfds, fd1); @@ -491,22 +491,22 @@ main(int argc, char *argv[]) FD_SET(fd2, &exceptfds); nfds = max(nfds, fd2); } - +\& ready = select(nfds + 1, &readfds, &writefds, &exceptfds, NULL); - +\& if (ready == \-1 && errno == EINTR) continue; - +\& if (ready == \-1) { perror("select()"); exit(EXIT_FAILURE); } - +\& if (FD_ISSET(h, &readfds)) { socklen_t addrlen; struct sockaddr_in client_addr; int fd; - +\& addrlen = sizeof(client_addr); memset(&client_addr, 0, addrlen); fd = accept(h, (struct sockaddr *) &client_addr, &addrlen); @@ -524,19 +524,19 @@ main(int argc, char *argv[]) else printf("connect from %s\en", inet_ntoa(client_addr.sin_addr)); - +\& /* Skip any events on the old, closed file descriptors. */ - +\& continue; } } - +\& /* NB: read OOB data before normal reads. */ - +\& if (fd1 > 0 && FD_ISSET(fd1, &exceptfds)) { char c; - +\& nbytes = recv(fd1, &c, 1, MSG_OOB); if (nbytes < 1) SHUT_FD1; @@ -545,7 +545,7 @@ main(int argc, char *argv[]) } if (fd2 > 0 && FD_ISSET(fd2, &exceptfds)) { char c; - +\& nbytes = recv(fd2, &c, 1, MSG_OOB); if (nbytes < 1) SHUT_FD2; @@ -584,17 +584,17 @@ main(int argc, char *argv[]) else buf1_written += nbytes; } - +\& /* Check if write data has caught read data. */ - +\& if (buf1_written == buf1_avail) buf1_written = buf1_avail = 0; if (buf2_written == buf2_avail) buf2_written = buf2_avail = 0; - +\& /* One side has closed the connection, keep writing to the other side until empty. */ - +\& if (fd1 < 0 && buf1_avail \- buf1_written == 0) SHUT_FD2; if (fd2 < 0 && buf2_avail \- buf2_written == 0) |