summaryrefslogtreecommitdiffstats
path: root/man2/select_tut.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/select_tut.2')
-rw-r--r--man2/select_tut.2102
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)