信号驱动的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 }

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 }

(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 }

时间: 2024-10-12 10:24:56

信号驱动的IO的相关文章

IO的多路复用和信号驱动

Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状态,然后再采取相应的措施. 信号驱动模型有必要仔细研究一下,一般有如下步骤: 设置安装函数,信号是驱动信号是SIGIO(最好使用sigaction的方式,方便设置flag为SA_RESTART,因为client中读取终端的syscall可能会被中断,有必要重启.当然,使用signal()的方式然后再

五种网络IO模型-阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O、异步I/O

1.阻塞I/O模型 我去面馆吃面,点了碗面条,我也不知道做面条需要多久,也不敢出去,只能在那里坐着等.等值师傅做完面,我吃完面条后,再去逛街.这里的吃面就是I/O操作. 2.非阻塞I/O模型 我不甘心在这里等着无聊,我想这段时间继续逛商场,但是又怕面条做好了,所以,我逛一会就回来吧台看一眼!为了吃碗面,来来回回跑,差点没跑断腿! 3.I/O多路复用 我同时在不同的地方点了菜,要跑来跑去的轮询几十遍,累死了.后来,善良的管理员安装了电子屏幕:上面写着每个菜的状态,我需要去看屏幕,就知道数据准备好了

信号驱动和异步驱动的区别

5种I/O模型: 1.阻塞I/O 2.非阻塞I/O 3.异步I/O 4.信号驱动I/O 5.I/O复用 信号驱动和异步驱动的区别 信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程. 异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程.IO操作即内核当中的服务例程. 异步I/O和信号驱动I/O的区别很容易被混淆.前者与后者的区

Socket层实现系列 — 信号驱动的异步等待

主要内容:Socket的异步通知机制. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件.有数据可读事件.有发送缓存可写事件.有IO错误事件. 对于这些事件,socket中分别定义了相应的事件处理函数,也称回调函数. Socket I/O事件的处理过程中,要使用到sock上的两个队列:等待队列和异步通知队列,这两个队列中 都保存着等待该Socket I/O事件的进程. Q:为什么要使用两个队列,等待

udp套接字使用信号驱动式I/O

信号驱动式I/O的本质就是:进程预先告知内核当某个描写叙述符发生事件时,内核会向该进程发送SIGIO信号通知进程,进程可在信号处理函数中进行处理 进程能够通过fcntl打开O_ASYNC标志或ioctl打开FIOASYNC标志来通知内核,二者的差别是一些系统不支持fcntl,所以应尽量使用ioctl 对于TCP套接字产生SIGIO信号的条件: 1.监听套接字上有新连接请求完毕 2.某个断连请求发起 3.某个断连请求完毕 4.数据到达套接字 5.数据已从套接字发送走(输出缓冲区有空暇空间) 6.发

驱动笔记 - IO端口和IO内存

访问IO端口 (#include <asm/io.h>) 设备资源struct resource{ resource_size_t start; //资源起始物理地址 resource_size_t end; //资源结束物理地址 const char *name; unsigned long flags; //资源类型,如IORESOURCE_MEM,IORESOURCE_IO,IORESOURCE_IRQ struct resource *parent, *sibling, *child;

IO模型介绍 以及同步异步阻塞非阻塞的区别

阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成 同步:用户进程发起IO(就绪判断)后,轮询内核状态异步:用户进程发起IO后,可以做其他事情,等待内核通知 介绍一下IO模型 网络IO模型和文件IO模型是一样的,上图是IO的5种模型,包括阻塞IO.非阻塞IO.多路复用IO.信号驱动的IO.异步IO. 一次IO包括两个过程,内核数据准备 .把数据从内核空间copy到用户空间. 1.阻塞IO(re

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

高性能IO模型浅析(转)

转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书吧. 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO