信号驱动的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单独提 ...
随机推荐
- Android开发-API指南-Fragment
Fragments 英文原文:http://developer.android.com/guide/components/fragments.html 采集日期:2014-12-31 在本文中 设计理 ...
- 压缩上传并预览 flash
最近研究一个功能:用as3写的上传图片并实现预览.觉得花了很多时间也学到很多知识,将自己的所得记录下来供大家分享. 首先是预览功能的实现,大家自然而然就想到了loader来加载图片并显示,由于项目没有 ...
- 让Windows7运行速度更快的BIOS优化设置教程
和以前使用WindowsXP一样,很多用户都在设法提高windows7的系统运行速速,比较常见的方法大多是对系统服务进行优化,去掉一些可有可无的系统服务,还有就是优化资源管理器菜单等.除此之外,还有一 ...
- windows 服务的启动与安装
在使用windows 操作系统时,我们对windows服务再也熟悉不过了,这些服务有的是系统层的,有的是应用层的,大部分都是运行在桌面的后台,可以在进程中看到,有时候在做web项目时,在站点启动时要启 ...
- SVN中文件属性
从SVN中checkout代码,然后设置crontab 定时执行脚本,发现permission denied 查看发现脚本没有可执行权限 但是,之前项目中的代码是有该权限的,于是猜想应该可以对SVN中 ...
- 洛谷P1475 控制公司 Controlling Companies
P1475 控制公司 Controlling Companies 66通过 158提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 ...
- css兼容
1.不同浏览器默认边距不同,必须对body自定义:margin:0;padding:0; 2.margin.padding属性值为%时,不是所有浏览器都支持: 3.transparent属性,IE7之 ...
- facelets标签
facelets标签 <ui:component>标签用于JSF组件树中插入一个uicomponent实例,并作为它包含的的组件和内容片断的根节点,这视图中这个标签以外的的内容被编译器忽略 ...
- .NET常用类库知识总结
常用类库之.NET中的字符串 字符串的特性 1.不可变性 由于字符串是不可变的的,每次修改字符串,都是创建了一个单独字符串副本(拷贝了一个字符串副本).之所以发生改变只是因为指向了一块新 ...
- Interpreter
#include <string> #include <iostream> #include <stack> using namespace std; stack& ...