Unix上有定义了许多信号。源自Berkeley的实现使用的是SIGIO信号来支持套接字和终端设备上的信号驱动IO。

信号驱动IO模型主要是在UDP套接字上使用,在TCP套接字上几乎是没有什么使用的。

在UDP上,SIGIO信号会在下面两个事件的时候产生:

1 数据报到达套接字

2 套接字上发上一部错误

因此我们很容易判断SIGIO出现的时候,如果不是发生错误,那么就是有数据报到达了。

而在TCP上,由于TCP是双工的,它的信号产生过于平凡,并且信号的出现几乎没有告诉我们发生了什么事情。因此对于TCP套接字,SIGIO信号是没有什么使用的。

sigaction(查询或设置信号处理方式)

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

参数含义:

signum:所注册的信号,我们这边都设置为SIGIO

act :信号触发所处理的函数

oldact:一般设置为NULL

这里涉及到了

sigaction结构

struct sigaction
{void (*sa_handler) (int);sigset_t sa_mask;int sa_flags;void (*sa_restorer) (void);}

sa_handler代表的是新的信号处理函数

sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置

sa_flags 用来设置信号处理的其他相关操作

下面的例子是基于UDP的程序

服务器端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h> int listenfd1;void do_sigio(int sig)
{int clifd, clilen;struct sockaddr_in cli_addr;char buffer[256];clifd = accept(listenfd1, (struct sockaddr *) &cli_addr, &clilen);bzero(buffer, 256);read(clifd, buffer, 255);printf("Listenfd1 Message%s\r\n", buffer);
}int main(int argc, char *argv[])
{//绑定监听7779端口的fdstruct sockaddr_in serv_addr1;listenfd1 = socket(AF_INET, SOCK_DGRAM, 0);bzero((char *) &serv_addr1, sizeof(serv_addr1));serv_addr1.sin_family = AF_INET;serv_addr1.sin_port = htons(7779);serv_addr1.sin_addr.s_addr = INADDR_ANY;struct sigaction sigio_action;memset(&sigio_action, 0, sizeof(sigio_action));sigio_action.sa_flags = 0;sigio_action.sa_handler = do_sigio;sigaction(SIGIO, &sigio_action, NULL);fcntl(listenfd1, F_SETOWN, getpid());int flags;flags = fcntl(listenfd1, F_GETFL, 0);flags |= O_ASYNC | O_NONBLOCK;fcntl(listenfd1, F_SETFL, flags);bind(listenfd1, (struct sockaddr *) &serv_addr1, sizeof(serv_addr1));while(1);close(listenfd1);return 0;}

客户端:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>int main(int argc, char* argv[])
{int socketfd, n;socketfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in serv_addr;bzero((char *)&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(7779);connect(socketfd,(struct sockaddr *)  &serv_addr, sizeof(serv_addr));write(socketfd, "client message", 14);return 0;}

运行结果:

Linux IO模型漫谈(6)- 信号驱动IO模型相关推荐

  1. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  2. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  3. 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

    目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...

  4. IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    文章目录 IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用IO五类. 最主要的两 ...

  5. 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

    高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具 ...

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

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

  7. Python之IO模式 阻塞式io 非阻塞io 多路复用io 异步io 信号驱动io

    参考:https://www.cnblogs.com/alex3714/articles/5248247.html 提高:http://www.cnblogs.com/alex3714/article ...

  8. Linux IO模型漫谈(1)

    基础知识 Linux将所有外部设备都看做一个文件来进行操作.因此,linux对所有外部设备的操作都可以看做是文件的操作.文件的操作当然需要有个标示描述它,这就是文件描述符(file descripto ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

最新文章

  1. 请举出OSI七层模型在实际应用中的实例
  2. wpf展开树节点_回归树分析与sklearn决策树案例,来玩一会
  3. Object.keys()返回对象自身可枚举属性组成的数组
  4. php 多线程写入文件,C#_C#实现多线程写入同一个文件的方法,本文实例讲述了C#实现多线程 - phpStudy...
  5. android 关闭上下文菜单,【Android笔记】ContextMenu上下文菜单
  6. python中iter是什么意思_python iter()与 __iter__()的区别
  7. 【java入门】超基础的java入门知识,细节拉满
  8. xcode-instrument
  9. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-053(很普通的数独)
  10. linux 磁盘序列号修改,linux 获取硬盘序列号解决思路
  11. IPD的决策评审CDP(2):因地制宜,因时而动
  12. java整合kafka做消息消费
  13. caffe中各种loss函数
  14. ArcGIS Pro从0到1入门实战教程 书籍淘宝线上销售,免费下载数据和视频
  15. 大数据挖掘的意义是什么?
  16. 你也可以看懂,量子力学的困惑,测不准原理 薛定谔的猫 !
  17. 「镁客·请讲」海聊颜志威:推进卫星通讯手机民用化,不让一个人丢在探险的路上...
  18. China Merchants Bank Beats Rivals In Quality Of Service
  19. iOS基于jenkins打包+上传蒲公英+钉钉群通知
  20. Microsoft Edge 离线下载安装技巧

热门文章

  1. PCIe知识学习 (转载)
  2. 献上程序员大学四年珍藏的30个宝藏网站,全部拿出来
  3. 学Python真的可以无所欲为,连对门小姐姐的家wifi密码都可以破解
  4. 用 Python 写个贪吃蛇,保姆级教程
  5. python-mysql超简单银行转账Model(我说了很简单的)
  6. python3.6爬虫环境安装要多少内存_Python3爬虫环境配置——解析库安装(附tesserocr安装方法)...
  7. vue 同一个域名移动端pc端两套代码跳转_百度移动搜索优化:手机站优化指南
  8. 大数据在企业IT的应用
  9. 如何使用Fiddler抓包操作?
  10. wxml 点击图片下载_云存储之上传图片和展示图片(小程序云开发)