信号驱动的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单独提 ...
随机推荐
- 让EntityFramework6支持SQLite
最近给朋友的小孩做了一个毕业设计.用的是asp.net MVC5 + EntityFramework6 + SQL Server 2008. 结果做好后,朋友说能不能不要数据库,直接运行?顿时让我很纠 ...
- docker 1.12设置非https访问registry
升级docker到1.12后,发现使用原来的/etc/sysconfig/docker文件中设置--insecure-registry的方式,访问registry失败,提示"http: se ...
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...
- iOS copy&mutableCopy理解
Copy&mutableCopy 通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...
- java 中byte[] 数组的合并
因工作的需要,在从事 .Net 的开发中接触到了 Java, 虽然在大学的时候学过一段Java 编程,但并没有在实际的工作中使用过, Java 和 .Net的C#语法很相似,都是面向对象的,感觉在语法 ...
- 华为OJ平台——将真分数分解为埃及分数
题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...
- 【HTML/XML 10】XML文档中的Schema文件
导读:DTD是对XML文档进行有效性验证的方法之一,事实上,继DTD之后,出现了用来规范和描述XML文档的第二代标准:Schema.Schema是DTD的继承,但是也有其不同的地方,它是真正的以独立的 ...
- 网络设备模拟器 GNS3
https://www.gns3.com/support/docs/linux-installation sudo dpkg --add-architecture i386 sudo add-apt- ...
- WF4 常用类<第二篇>
一.WorkflowInvoker 常用方法如下: 方法 说明 BeginInvoke() 使用指定的 AsyncCallback 和用户提供的状态以异步方式调用工作流 EndInvoke() 返回使 ...
- windbg配置问题汇总
.loadby sos.dll mscorwks.symfix c:\windows\symbols windbg配置问题汇总 1.Failed to find runtime DLL (clr.dl ...