信号驱动的IO

(1)client1,基于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 128
12 
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[31m", 5);
29     write(1, buf, ret);
30     write(1, "\033[0m", 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,基于自定义信号的写法:

 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 128
14 
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[31m", 5);
31     write(1, buf, ret);
32     write(1, "\033[0m", 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 128
12 
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[31m", 5);
29     write(1, buf, ret);
30     write(1, "\033[0m", 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

 

posted @ 2015-03-30 00:34  prepat  阅读(1032)  评论(0编辑  收藏  举报