(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的更多相关文章

  1. 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO

    前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...

  2. IO的多路复用和信号驱动

    Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...

  3. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

  4. IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO

    最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...

  5. 信号驱动IO

    [1]信号驱动IO 应用程序:1)应用程序要捕捉SIGIO信号           signal(SIGIO, handler); 2)应用程序要指定进程为文件的属主,设置当前的文件描述为当前的调用进 ...

  6. Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...

  7. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  8. 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步

    IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...

  9. UDP信号驱动IO

    SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...

随机推荐

  1. opencv编程解决warning C4003: “max”宏的实参不足

    忘了把程序出错的代码附上了,运行修改好的程序才发现的.只好把问题的代码大致写一下了: warning C4003: “min”宏的实参不足 error C2589: “(”:“::”右边的非法标记 e ...

  2. 软件测试—— junit 单元测试

    Tasks: Install Junit(4.12), Hamcrest(1.3) with Eclipse Install Eclemma with Eclipse Write a java pro ...

  3. 了解Entity Framework中事务处理

    Entity Framework 6以前,框架本身并没有提供显式的事务处理方案,在EF6中提供了事务处理的API. 所有版本的EF,只要你调用SaveChanges方法进行插入.修改或删除,EF框架会 ...

  4. 【练习】trace文本重建控制文件

    这个小练习是针对控制文件全部丢失后怎么能快速的重建一个控制文件,快速的起库 1.备份控制文件到trace下 SQL> alter database backup controlfile to t ...

  5. Oracle密码过期the password has expired

    oracle11G新特征,半年会提醒一次修改新密码 正常情况:只要输入原先帐号密码,回车即可. 不正常情况:输入新密码帐号,回车,提示验证错误,这时就需要切换到没过期的管理员用户,高权限也行,输入   ...

  6. c++11 中的 move 与 forward

    [update: 关于左值右值的另一点总结,请参看这篇] 一. move 关于 lvaue 和 rvalue,在 c++11 以前存在一个有趣的现象:T&  指向 lvalue (左传引用), ...

  7. windows内核对象可以等待

    内核对象有两种状态 触发 与未触发. 是可以等待的.

  8. shell脚本循环执行mysql语句

    参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...

  9. 用Grunt搭建基于LESS的前端html开发框架

    . 安装Node.js    http://nodejs.org/download/ 2. 加速NPM安装    npm install -g cnpm --registry=http://r.cnp ...

  10. Something wrong with EnCase index search in Unallocated area

    hi, My EnCase version is v7 and I found a terrible issue about index search in Unallocated area. Wit ...