进程间并发通信-IO多路复用

1 select

1.1 源码示例

/*************************************************************************> File Name: write.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 14时50分23秒************************************************************************/#include<stdio.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>int main(void)
{int fd=0;char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_WRONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 接收终端输入并写入管道文件描述符-向管道写数据 */while(1){fgets(tmpbuff,sizeof(tmpbuff),stdin);write(fd,tmpbuff,strlen(tmpbuff));}/* 4 关闭管道 */close(fd);return 0;
}
/*************************************************************************> File Name: read.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 14时34分49秒************************************************************************/#include<stdio.h>#include <signal.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>int main(void)
{int fd=0;fd_set rdfds;fd_set tmpfds;int ret=0;char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_RDONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 文件描述符集的操作 - 4个宏 - FD_ZERO(initialize)-FD_SET(create)-FD_CLR(delete)-FD_ISSET(retrieve) *//* 3.1 初始化文件描述符集合 */FD_ZERO(&rdfds);//清除文件描述符集合 - 初始化文件描述符集合/* 3.2 增加文件描述符至文件描述符集合 */FD_SET(fd,&rdfds);//添加文件描述符至文件描述符集FD_SET(0,&rdfds);/* 4 管道读(写) - 终端和管道-谁来数据就读谁 */while(1){/* 4.1 初始化监听文件描述符集合 */tmpfds=rdfds;/* 4.2 监听文件描述符集合 -> 监听多个文件描述符,直到有一个或者多个文件描述符准备进行某类IO操作 *//*注意: 一旦监听到某个文件描述符准备进行IO操作,那么这个文件描述符监听前后状态就发生了变化 ( 非ready状态->ready状态 ),* 所以要想一直对某个文件描述符进行监听,每次调用select之前都要重置该文件描述符状态为监听之前的状态(即非ready状态)*/ret=select(fd+1,&tmpfds,NULL,NULL,NULL);if(-1==ret){perror("fail to select");return -1;}/* 4.3 查询文件描述符集合中某个文件描述符状态是否发生改变 */if(FD_ISSET(fd,&tmpfds)){memset(tmpbuff,0,sizeof(tmpbuff));read(fd,tmpbuff,sizeof(tmpbuff));printf("fifo: %s\n",tmpbuff);}if(FD_ISSET(0,&tmpfds)){memset(tmpbuff,0,sizeof(tmpbuff));fgets(tmpbuff,sizeof(tmpbuff),stdin);printf("stdin: %s\n",tmpbuff);}}/* 5 关闭文件描述符 */close(fd);return 0;
}

1.2 运行结果

1.3 分析总结

2 poll

1.1 源码示例

/*************************************************************************> File Name: write.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 16时30分10秒************************************************************************/#include<stdio.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>int main(void)
{int fd=0;char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_WRONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 接收终端输入并写入管道文件描述符-向管道写数据 */while(1){fgets(tmpbuff,sizeof(tmpbuff),stdin);write(fd,tmpbuff,strlen(tmpbuff));}/* 4 关闭管道 */close(fd);return 0;
}
/*************************************************************************> File Name: read.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 16时30分10秒************************************************************************/#include<stdio.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>#include <poll.h>int main(void)
{int fd=0;struct pollfd fds[2];int fready=0;char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_RDONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 初始化文件描述符状态结构体数组*/fds[0].fd=fd;//添加文件描述符至数组fds[0].events=POLLIN;//修改文件描述符状态为 准备读fds[1].fd=0;fds[1].events=POLLIN;/* 4 管道读(写) - 终端和管道-谁来数据就读谁 */while(1){/* 4.1 监听文件描述符状态结构体数组 */fready=poll(fds,2,-1);//文件描述符数组(数组)-文件描述符个数(数组长度)-超时时间(-1 一直等)if(-1==fready){perror("fail to poll");return -1;}/* 4.2 查询文件描述符状态 - 通过位掩码方式查询 - 置位 */if(fds[0].revents&POLLIN){memset(tmpbuff,0,sizeof(tmpbuff));read(fd,tmpbuff,sizeof(tmpbuff));printf("fifo: %s\n",tmpbuff);}if(fds[1].revents&POLLIN){memset(tmpbuff,0,sizeof(tmpbuff));fgets(tmpbuff,sizeof(tmpbuff),stdin);printf("stdin: %s\n",tmpbuff);}}/* 5 关闭管道 */close(fd);
}

1.2 运行结果

1.3 分析总结

3 epoll

1.1 源码示例

/*************************************************************************> File Name: write.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 17时22分26秒************************************************************************/#include<stdio.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>int main(void)
{int fd=0;char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_WRONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 接收终端输入并写入管道文件描述符-向管道写数据 */while(1){fgets(tmpbuff,sizeof(tmpbuff),stdin);write(fd,tmpbuff,strlen(tmpbuff));}/* 4 关闭管道 */close(fd);return 0;
}
/*************************************************************************> File Name: read.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年06月02日 星期日 17时22分26秒************************************************************************/#include<stdio.h>#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h>#include <unistd.h>#include <string.h>#include <sys/epoll.h>int main(void)
{int fd=0;int epfd=0;struct epoll_event env;int fready=0;int i=0;struct epoll_event retenv[2];char tmpbuff[4096]={0};/* 1 创建有名管道 */mkfifo("/tmp/myfifo",0664);/* 2 打开有名管道 */fd=open("/tmp/myfifo",O_RDONLY);if(-1==fd){perror("fail to open");return -1;}/* 3 创建内核事件表 - 并返回表头 */epfd=epoll_create(2);//预期添加到事件表的文件描述符数量if(-1==epfd){perror("fail to epoll_create");return -1;}/* 4 初始化内核epoll事件结构体 - 数据类型 -初始化事件结构体 */env.events=EPOLLIN;//修改文件描述符状态为 准备读 - 事件状态 - 非ready态env.data.fd=fd;//文件描述符 - 这里指有名管道/* 5 操作内核epoll事件表 - EPOLL_CTL_ADD(增-fd)-EPOLL_CTL_DEL(删-fd)-EPOLL_CTL_MOD(改-fd事件) */epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&env);//建立文件描述符fd及其对应的事件env,并将文件描述符fd添加到epoll事件表epfd中env.events=EPOLLIN;env.data.fd=0;epoll_ctl(epfd,EPOLL_CTL_ADD,0,&env);//终端也将发生同样的事件(EPOLLIN),所以将终端(此指stdin)也加入至该内核事件表/* 6 管道读(写) - 终端和管道-谁来数据就读谁 */while(1){/* 6.1 监听内核epoll事件表,并返回ready态的文件描述符数量 */fready=epoll_wait(epfd,retenv,2,-1);//这里通过结构体数组retenv作为出参,将ready态的文件描述符带出-ready态if(-1==fready){perror("fail to epoll_wait");return -1;}/* 6.2 遍历所有ready态的文件描述符 */for(i=0;i<fready;i++){/* 通过ready态文件描述符进一步确认是哪个文件描述符状态被置位 -* 检测(类似于IO输入检测-key检测的思想-位掩码)-查询*/if(retenv[i].data.fd==0){memset(tmpbuff,0,sizeof(tmpbuff));fgets(tmpbuff,sizeof(tmpbuff),stdin);printf("stdin: %s\n",tmpbuff);}else if(retenv[i].data.fd==fd){memset(tmpbuff,0,sizeof(tmpbuff));read(fd,tmpbuff,sizeof(tmpbuff));printf("fifo: %s\n",tmpbuff);}}}/* 6 关闭管道*/close(fd);
}

1.2 运行结果

1.3 分析总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低空经济发展报告

低空经济是指利用低空空间进行商业开发和经济活动的概念。随着航空技术的发展和无人机的普及&#xff0c;低空经济逐渐成为一个新兴的经济领域。 低空经济可以涵盖的领域非常广泛&#xff0c;包括但不限于物流配送、农业植保、城市交通、旅游观光等。利用无人机等飞行器进行物…

嵌入式学习——网络编程(TCP)——day31

1. TCP和UDP的区别 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 1.1 连接方式 TCP 是面向连接的协议&#xff0c;它在数据传输前需要通过三次握手建立…

【算法】一文搞懂归并排序

概念 归并排序利用了分治思想&#xff0c;将待排序的数组范围层层划分&#xff0c;每次划分会得到两个大小相近的区间。当无法划分时&#xff0c;递归结束&#xff0c;自下而上进行区间合并merge操作&#xff0c;合并操作依次比较两个区间的元素&#xff0c;进而使合并后的区间…

【西瓜书】5.神经网络

1.概念 有监督学习正向传播&#xff1a;输入样本---输入层---各隐层---输出层反向传播&#xff1a;误差以某种形式在通过隐层向输入层逐层反转&#xff0c;并将误差分摊给各层的所有单元&#xff0c;以用于修正各层的权值激活函数&#xff1a;也叫阶跃函数&#xff0c;目的是引…

LeetCode:反转链表I

文章收录于LeetCode专栏 LeetCode地址 反转链表I 题目 给你单链表的头节点head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。   示例 1&#xff1a; #mermaid-svg-IYmD16EKuu3CZWwV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size…

Maven 中的 classifier 属性用过没?

最近训练营有小伙伴问到松哥一个关于 Maven 依赖的问题&#xff0c;涉及到 classifier 属性&#xff0c;随机问了几个小伙伴&#xff0c;都说工作中没用到过&#xff0c;因此简单整篇文章和小伙伴们分享下。 Maven 大家日常开发应该都有使用&#xff0c;Maven 中有一个比较好玩…

最小二乘法算法(个人总结版)

最小二乘法&#xff08;Least Squares Method&#xff09;是一种通过最小化误差平方和来拟合数据的回归分析方法。它被广泛应用于线性回归、多元回归以及其他数据拟合问题中。以下是详细的教程&#xff0c;涵盖基本概念、数学推导、具体步骤和实现代码。 1. 最小二乘法基本概念…

代码随想录算法训练营第35天 |435.无重叠区间、763.划分字母区间、56.合并区间

代码随想录算法训练营第35天 |435.无重叠区间、763.划分字母区间、56.合并区间 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 435.无重叠区间 链接: 763.划分字母区间 链接: 56.合并区间 自己看到题目的第一想法 435.无重叠区间:先对数组…

装机必备——鲁大师安装教程

装机必备——鲁大师安装教程 软件下载 软件名称&#xff1a;鲁大师 软件语言&#xff1a;简体中文 软件大小&#xff1a;144.75M系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通道①迅雷云盘丨…

p5开发helloworld

注意&#xff0c;执行的时候&#xff0c;后面不用带class的后缀

C语言(字符、字符串函数)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

Pinia(三): 了解和使用state

1.state state 就是我们要定义的数据, 如果定义 store 时传入的第二个参数是对象, 那么 state 需要是一个函数, 这个函数的返回值才是状态的初始值.这样设计的原因是为了让 Pinia 在客户端和服务端都可以工作 官方推荐使用箭头函数(()>{ })获得更好的类型推断 import { de…

最新张量补全论文收集【8篇】

目录 1、利用张量子空间先验&#xff1a;增强张量补全的核范数最小化和 2、基于可学习空间光谱变换的张量核范数多维视觉数据恢复 3、用于图像补全的增强型低秩和稀疏 Tucker 分解 4、多模态核心张量分解及其在低秩张量补全中的应用 5、 低秩张量环的噪声张量补全 6、 视…

三十四、openlayers官网示例Dynamic clusters解析——动态的聚合图层

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/clusters-dynamic.html 这篇绘制了多个聚合图层。 先初始化地图 &#xff0c;设置了地图视角的边界extent&#xff0c;限制了地图缩放的范围 initMap() {const raster new TileLayer({source: new XYZ…

JAVA流程控制break,continue,goto

1.break在任何循环语句的主体成分&#xff0c;均可用break控制循环的流程。break用于强行退出循环&#xff0c;不执行循环中剩余的语句。&#xff08;break语句也在switch语句中使用&#xff09; 如图&#xff1a;break语句强行退出循环&#xff0c;结果输出1~30便结束&#xf…

两数之和-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第76讲。 两数之和&#xf…

结构体(1)

结构体: 记录班级的学生的信息: 姓名 数组 char name[30][100]; // 性别 char sex[30]; // 0 1 年龄 int age[30]; 学号 int sno[30]; 打印 小明 同学 信息 c语言 --- 提供了一种方式&#xff0c;可以让用户自定义数据类型 &#xff1a; 构造一个数据类型 …

Java面试八股之死锁和活锁的区别

死锁和活锁的区别 基本定义&#xff1a; 死锁&#xff08;Deadlock&#xff09;&#xff1a;指两个或多个线程互相等待对方释放资源&#xff0c;从而导致所有线程都无法继续执行的状态。每个线程至少持有一个资源&#xff0c;并等待另一个由其他线程持有的资源&#xff0c;形…

初始操作系统

概念&#xff1a; 1.系统资源的管理者&#xff1a;实质控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机地工作和资源的分配 2.向上层提供方便易用的服务&#xff1a;以提供给用户和其他软件方便接口和环境 封装思想&#xff1a;操作系统把一些丑…