Signal-driven I/O and signal-driven I/O
(1) client1, written based on SIGIO:
1 # include <sys/types. h> 2 # include <sys/stat. h> 3 # include <fcntl. h> 4 # include <unistd. h> 5 # include <signal. h> 6 7 # include <stdio. h> 8 # include <stdlib. h> 9 # include <errno. h> 10 11 # define BUFSIZE 12812 13 static int fdr; 14 static int fdw; 15 16 static void handler (int unuse) 17 {18 int ret; 19 char buf [BUFSIZE]; 20 21 ret = read (fdr, buf, BUFSIZE); 22 if (ret =-1) {23 return; 24} 25 if (ret = 0) {26 exit (0); 27} 28 write (1, "\ 033 [31 m", 5); 29 write (1, buf, ret); 30 write (1, "\ 033 [0 m", 4); 31} 32 33 int main (void) 34 {35 int ret; 36 char buf [BUFSIZE]; 37 long flags; 38 39 signal (SIGIO, handler); 40 41 fdr = open ("f1", O_RDONLY); 42 if (fdr =-1) {43 perror ("f1 "); 44 goto open_fdr_err; 45} 46 47 fdw = open ("f2", O_WRONLY); 48 if (fdw =-1) {49 perror ("f2 "); 50 goto open_fdw_err; 51} 52 53 flags = fcntl (fdr, F_GETFL); 54 flags | = O_ASYNC; 55 fcntl (fdr, F_SETFL, flags); 56 57 fcntl (fdr, f_SETOWN, getpid (); 58 59 while (1) {60 ret = read (0, buf, BUFSIZE); 61 if (ret =-1) {62 if (errno = EINTR) {63 continue; 64} 65 perror ("read ()"); 66 break; 67} 68 if (ret = 0) {69 break; 70} 71 write (fdw, buf, ret); 72} 73 74 close (fdw); 75 close (fdr); 76 77 return 0; 78 79 80 close (fdw); 81 open_fdw_err: 82 close (fdr); 83 open_fdr_err: 84 return 1; 85}View Code
Client1, written based on custom signals:
1 # define _ GNU_SOURCE 2 3 # include <sys/types. h> 4 # include <sys/stat. h> 5 # include <fcntl. h> 6 # include <unistd. h> 7 # include <signal. h> 8 9 # include <stdio. h> 10 # include <stdlib. h> 11 # include <errno. h> 12 13 # define BUFSIZE 12814 15 static int fdr; 16 static int fdw; 17 18 static void handler (int unuse) 19 {20 int ret; 21 char buf [BUFSIZE]; 22 23 ret = read (fdr, buf, BUFSIZE); 24 if (ret =-1) {25 return; 26} 27 if (ret = 0) {28 exit (0); 29} 30 write (1, "\ 033 [31 m", 5); 31 write (1, buf, ret); 32 write (1, "\ 033 [0 m", 4); 33} 34 35 int main (void) 36 {37 int ret; 38 char buf [BUFSIZE]; 39 long flags; 40 41 signal (SIGUSR1, handler); 42 43 fdr = open ("f1", O_RDONLY); 44 if (fdr =-1) {45 perror ("f1 "); 46 goto open_fdr_err; 47} 48 49 fdw = open ("f2", O_WRONLY); 50 if (fdw =-1) {51 perror ("f2 "); 52 goto open_fdw_err; 53} 54 55 flags = fcntl (fdr, F_GETFL); 56 flags | = O_ASYNC; 57 fcntl (fdr, F_SETFL, flags); 58 59 fcntl (fdr, f_SETOWN, getpid (); 60 fcntl (fdr, F_SETSIG, SIGUSR1); 61 62 while (1) {63 ret = read (0, buf, BUFSIZE ); 64 if (ret =-1) {65 if (errno = EINTR) {66 continue; 67} 68 perror ("read ()"); 69 break; 70} 71 if (ret = 0) {72 break; 73} 74 write (fdw, buf, ret); 75} 76 77 close (fdw ); 78 close (fdr); 79 80 return 0; 81 82 83 close (fdw); 84 open_fdw_err: 85 close (fdr); 86 open_fdr_err: 87 return 1; 88}View Code
(2) client2:
1 # include <sys/types. h> 2 # include <sys/stat. h> 3 # include <fcntl. h> 4 # include <signal. h> 5 # include <unistd. h> 6 7 # include <stdio. h> 8 # include <stdlib. h> 9 # include <errno. h> 10 11 # define BUFSIZE 12812 13 static int fdr; 14 static int fdw; 15 16 static void handler (int unuse) 17 {18 int ret; 19 char buf [BUFSIZE]; 20 21 ret = read (fdr, buf, BUFSIZE); 22 if (ret =-1) {23 return; 24} 25 if (ret = 0) {26 exit (0); 27} 28 write (1, "\ 033 [31 m", 5); 29 write (1, buf, ret); 30 write (1, "\ 033 [0 m", 4); 31} 32 33 int main (void) 34 {35 int ret; 36 char buf [BUFSIZE]; 37 long flags; 38 39 signal (SIGIO, handler); 40 41 fdw = open ("f1", O_WRONLY); 42 if (fdw =-1) {43 perror ("f1 "); 44 goto open_fdw_err; 45} 46 47 fdr = open ("f2", O_RDONLY); 48 if (fdr =-1) {49 perror ("f2 "); 50 goto open_fdr_err; 51} 52 53 flags = fcntl (fdr, F_GETFL); 54 flags | = O_ASYNC; 55 fcntl (fdr, F_SETFL, flags); 56 57 fcntl (fdr, f_SETOWN, getpid (); 58 59 while (1) {60 ret = read (0, buf, BUFSIZE); 61 if (ret =-1) {62 if (errno = EINTR) {63 continue; 64} 65 perror ("read ()"); 66 break; 67} 68 if (ret = 0) {69 break; 70} 71 write (fdw, buf, ret); 72} 73 74 close (fdr); 75 close (fdw); 76 77 return 0; 78 79 80 close (fdr); 81 open_fdr_err: 82 close (fdw); 83 open_fdw_err: 84 return 1; 85}View Code