信号驱动的IO
(1)client1,基于SIGIO的写法:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h> #include <stdio.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 128 static int fdr;
static int fdw; static void handler(int unuse)
{
int ret;
char buf[BUFSIZE]; ret = read(fdr, buf, BUFSIZE);
if (ret == -) {
return;
}
if (ret == ) {
exit();
}
write(, "\033[31m", );
write(, buf, ret);
write(, "\033[0m", );
} int main(void)
{
int ret;
char buf[BUFSIZE];
long flags; signal(SIGIO, handler); fdr = open("f1", O_RDONLY);
if (fdr == -) {
perror("f1");
goto open_fdr_err;
} fdw = open("f2", O_WRONLY);
if (fdw == -) {
perror("f2");
goto open_fdw_err;
} flags = fcntl(fdr, F_GETFL);
flags |= O_ASYNC;
fcntl(fdr, F_SETFL, flags); fcntl(fdr, F_SETOWN, getpid()); while () {
ret = read(, buf, BUFSIZE);
if (ret == -) {
if (errno == EINTR) {
continue;
}
perror("read()");
break;
}
if (ret == ) {
break;
}
write(fdw, buf, ret);
} close(fdw);
close(fdr); return ; close(fdw);
open_fdw_err:
close(fdr);
open_fdr_err:
return ;
}
client1,基于自定义信号的写法:
#define _GNU_SOURCE #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h> #include <stdio.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 128 static int fdr;
static int fdw; static void handler(int unuse)
{
int ret;
char buf[BUFSIZE]; ret = read(fdr, buf, BUFSIZE);
if (ret == -) {
return;
}
if (ret == ) {
exit();
}
write(, "\033[31m", );
write(, buf, ret);
write(, "\033[0m", );
} int main(void)
{
int ret;
char buf[BUFSIZE];
long flags; signal(SIGUSR1, handler); fdr = open("f1", O_RDONLY);
if (fdr == -) {
perror("f1");
goto open_fdr_err;
} fdw = open("f2", O_WRONLY);
if (fdw == -) {
perror("f2");
goto open_fdw_err;
} flags = fcntl(fdr, F_GETFL);
flags |= O_ASYNC;
fcntl(fdr, F_SETFL, flags); fcntl(fdr, F_SETOWN, getpid());
fcntl(fdr, F_SETSIG, SIGUSR1); while () {
ret = read(, buf, BUFSIZE);
if (ret == -) {
if (errno == EINTR) {
continue;
}
perror("read()");
break;
}
if (ret == ) {
break;
}
write(fdw, buf, ret);
} close(fdw);
close(fdr); return ; close(fdw);
open_fdw_err:
close(fdr);
open_fdr_err:
return ;
}
(2)client2:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h> #include <stdio.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 128 static int fdr;
static int fdw; static void handler(int unuse)
{
int ret;
char buf[BUFSIZE]; ret = read(fdr, buf, BUFSIZE);
if (ret == -) {
return;
}
if (ret == ) {
exit();
}
write(, "\033[31m", );
write(, buf, ret);
write(, "\033[0m", );
} int main(void)
{
int ret;
char buf[BUFSIZE];
long flags; signal(SIGIO, handler); fdw = open("f1", O_WRONLY);
if (fdw == -) {
perror("f1");
goto open_fdw_err;
} fdr = open("f2", O_RDONLY);
if (fdr == -) {
perror("f2");
goto open_fdr_err;
} flags = fcntl(fdr, F_GETFL);
flags |= O_ASYNC;
fcntl(fdr, F_SETFL, flags); fcntl(fdr, F_SETOWN, getpid()); while () {
ret = read(, buf, BUFSIZE);
if (ret == -) {
if (errno == EINTR) {
continue;
}
perror("read()");
break;
}
if (ret == ) {
break;
}
write(fdw, buf, ret);
} close(fdr);
close(fdw); return ; close(fdr);
open_fdr_err:
close(fdw);
open_fdw_err:
return ;
}
信号驱动的IO的更多相关文章
- 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO
前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...
- IO的多路复用和信号驱动
Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
- IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO
最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...
- 信号驱动IO
[1]信号驱动IO 应用程序:1)应用程序要捕捉SIGIO信号 signal(SIGIO, handler); 2)应用程序要指定进程为文件的属主,设置当前的文件描述为当前的调用进 ...
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步
IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...
- UDP信号驱动IO
SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...
随机推荐
- git克隆项目到一个非空目录
这只是记录: 1. 进入非空目录,假设是 /workdir/proj1 2. git clone --no-checkout https://git.oschina.net/NextApp/platf ...
- OpenStack学习笔记(一)----安装虚拟化工具
下面的命令运行在操作系统Ubuntu 14.04上. 在开源软件里面,主要是采用KVM和Xen.尽管OpenStack对KVM和Xen都支持,但是OpenStack对KVM的支持明显要比Xen做得好, ...
- 计数排序(Count Sort )与插入排序(Insert Sort)
计数排序法:计数数组适用于当前数组密集的情况.例如(2,3,5,4,2,3,3,2,5,4) 方法:先找出最大值最小值,之后统计每个数出现的次数,根据次数从小到大往数组里添加 计数排序法是一种不需要比 ...
- 洛谷P1465
P1465 序言页码 Preface Numbering 74通过 111提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 一类书 ...
- No.004 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
- Java程序员面试宝典——重要习题整理
1.下面程序的输出结果是() public class Test { public static void main(String[] args) { int j = 0 ; for(int i = ...
- ios如何获取位置权限
获取当前位置需要改plist文件 在plist文件加入 NSLocationWhenInUseUsageDescription 字段 /** 初始化一个管理器对象 */ locationMan ...
- WWF3XOML方式创建和启动工作流 <第十篇>
一.XOML使用工作流的好处 通过Xoml方式使用工作流的好处在于,它能够不重新启动程序的情况下,仅仅通过配置xoml就能够实现改变工作流,非常灵活. 创建一个WinForm程序如下: 代码如下: n ...
- Windows phone 8 学习笔记(5) 图块与通知(转)
基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...
- java初始化深度剖析
当用一个类来创建对象的时候,JVM会帮我们执行下面的6个步骤. 1.在磁盘上找到对应内的class文件: 2.加载class文件到内存,初始化所有静态域(成员变量和方法): 3.如果使用new cla ...