进程间通信——进程与线程——day12

在进程间的通信,主要分为6部分内容,分别是:管道、信号、消息队列、共享内存、信号灯以及套接字

今天主要讲一下管道以及信号

管道

无名管道: 无名管道只能用于具有亲缘关系的进程间通信

pipeint pipe(int pipefd[2]);功能:创建一个无名管道参数:pipefd[0]:读管道文件描述符pipefd[1]:写管道文件描述符返回值:成功返回0 失败返回-1
无名管道特性:
1.管道中至少有一个写端: 读取数据时,如果管道中有数据直接读取,管道中没有数据阻塞等待直到有数据写入读出,继续向后执行
2.管道中没有写端:读取数据时,如果管道中有数据直接读取,管道中没有数据不阻塞等待直接向下执行
3.管道中至少有一个读端:写入数据时,如果管道中没有存满(64k),则直接写入,管道中如果存满,则阻塞等待直到有数据读出,才能继续写入
4.管道中没有读端:写入数据时,会产生管道破裂错误,导致程序崩溃

例子:在父进程中创建子进程, 在子进程中写hello world,通过管道,让其在父进程中打印出来。

#include"head.h"int main(void)
{pid_t pid;	//子进程IDint fd[2];	int ret = 0;char tmpbuff[4096] = {0};ret = pipe(fd);		//创建管道if(-1 == ret){perror("fail to pipe");return -1;}pid = fork();	//创建子进程if(-1 == pid){perror("fail to fork");return -1;}if(0 == pid)	//pid=0为子进程{strcpy(tmpbuff,"hello world!");write(fd[1],tmpbuff,sizeof(tmpbuff));	//写入}else if(pid > 0)	//进入父进程{sleep(3);read(fd[0],tmpbuff,sizeof(tmpbuff));	printf("%s\n",tmpbuff);		//输出}while(1){}close(fd[0]);close(fd[1]);	return 0;
}

结果:
在这里插入图片描述

有名管道:打开管道文件 -> 读写管道文件 -> 关闭管道文件

注意:有名管道必须读写两端同时加入才能继续向下执行

mkfifo int mkfifo(const char *pathname, mode_t mode);功能:创建一个管道文件参数:pathname:管道文件路径mode:权限返回值:成功返回0 失败返回-1

例子:编写两个进程,A B,两个进程都可以互发消息

首先我们先写进程A,因为两个进程的内容都相等,改的地方不大,在这边只展示A即可
#include "head.h"int fatob = 0;
int fbtoa = 0;
pthread_t tid_send;	//线程
pthread_t tid_recv;void *sendfun(void *arg)	//发送
{	char tmpbuff[1024] = {0};while (1){memset(tmpbuff, 0, sizeof(tmpbuff));	//用于初始化数组gets(tmpbuff);	write(fatob, tmpbuff, strlen(tmpbuff));	//在atob管道中,传入数据if (!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid_recv);		//若该线程结束,则recvfun线程也结束return NULL;
}void *recvfun(void *arg)
{char tmpbuff[1024] = {0};while (1){memset(tmpbuff, 0, sizeof(tmpbuff));read(fbtoa, tmpbuff, sizeof(tmpbuff));	//在btoa管道中,读取数据if (!strcmp(tmpbuff, ".quit")){break;}printf("RECV:%s\n", tmpbuff);	//输出}pthread_cancel(tid_send);return NULL;
}int main(void)
{char tmpbuff[1024] = {0};mkfifo("/tmp/ATOB", 0777);	//创建管道,并定义权限为0777mkfifo("/tmp/BTOA", 0777);fatob = open("/tmp/ATOB", O_WRONLY);	//以只写的方式打开ATOB管道if (-1 == fatob){perror("fail to open");return -1;}fbtoa = open("/tmp/BTOA", O_RDONLY);	//以只读的方式打开BTOA管道if (-1 == fbtoa){perror("fail to open");return -1;}pthread_create(&tid_send, NULL, sendfun, NULL);	//创建线程pthread_create(&tid_recv, NULL, recvfun, NULL);pthread_join(tid_send, NULL);	//回收线程空间,具有阻塞作用pthread_join(tid_recv, NULL);close(fatob);	//关闭管道close(fbtoa);return 0;
}

结果:
在这里插入图片描述
此时,两进程可以相互通信了。

信号:信号用来实现内核层和用户层信息的交互,也可以用来实现进程间通信

信号的种类:

1) SIGHUP	 	2) SIGINT	 	3) SIGQUIT	 	4) SIGILL	 	5) SIGTRAP
6) SIGABRT	 	7) SIGBUS	 	8) SIGFPE	 	9) SIGKILL		10) SIGUSR1
11) SIGSEGV		12) SIGUSR2		13) SIGPIPE		14) SIGALRM		15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD		18) SIGCONT		19) SIGSTOP		20) SIGTSTP
21) SIGTTIN		22) SIGTTOU		23) SIGURG		24) SIGXCPU		25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF		28) SIGWINCH	29) SIGIO		30) SIGPWR
31) SIGSYS		34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

以上就是所以的信号种类

信号处理方式

    1.缺省:按照系统默认的方式处理2.忽略:不响应信号3.捕捉:按照自定义方式处理信号9号信号SIGKILL19号信号SIGSTOP 这两个信号不能被忽略和捕捉以下三个信号可以从键盘输入:SIGINT:ctrl + c SIGQUIT:ctrl + \SIGTSTP:ctrl + z

signal

typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);
功能:改变信号的处理方式
参数:signum:信号的编号handler:信号的处理方式SIG_IGN     忽略处理SIG_DFL     缺省处理函数首地址   捕捉处理
返回值:成功返回之前处理函数的首地址失败返回SIG_ERR

eg:编写一个进程循环执行while (1)
当按下 SIGINT(ctrl + c) 打印SIGINT信号来了
当按下 SIGQUIT(ctrl + ) 打印SIGQUIT信号来了
当按下 SIGTSTP(ctrl + z) 打印SIGTSTP信号来了

#include"head.h"void hander1(int signo)
{printf("SIGINT is comming!\n");return;
}void hander2(int signo)
{printf("SIGQUIT is comming!\n");return;
}void hander3(int signo)
{printf("SIGQUIT is comming!\n");return;
}int main(void)
{signal(SIGINT,hander1);		//参数1:信号编号signal(SIGTSTP,hander3);	//参数2:处理方式,我们这里采用捕捉处理signal(SIGQUIT,hander2);while(1){}return 0;
}

结果:
在这里插入图片描述
以上就是今天的内容,谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

QT C++实战:实现用户登录页面及多个界面跳转

主要思路 一个登录界面,以管理员Or普通用户登录管理员:一个管理员的操作界面,可以把数据录入到数据库中。有返回登陆按钮,可以选择重新登陆(管理员Or普通用户普通用户:一个主界面,负责展示视频…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】链表—单链表

目录 1 -> 链表 1.1 -> 链表的概念及结构 1.2 -> 链表的分类 2 -> 无头单向非循环链表(单链表) 2.1 -> 接口声明 2.2 -> 接口实现 2.2.1 -> 动态申请一个结点 2.2.2 -> 单链表的打印 2.2.3 -> 单链表的尾插 2.2.4 -> 单链表的头插 2.…

React 模态框的设计(三)拖动组件的完善

我在上次的Draggable组件的设计中给了一个简化的方法,今天我来完善一下这个组件,可用于任何可移动组件的包裹。完善后的效果如下所示: 这个优化中,增加了一个注目的效果,还增加了触发可拖动区域的指定功能,…

设置虚拟内存

目录 1.作用:2.步骤:小结: 1.作用: 电脑的物理内存不够用时把一部分硬盘空间作为内存来使用,这部分硬盘空间就叫作虚拟内存。 2.步骤: 右键 我的电脑 属性 点到这里,取消勾选 选择好盘符和…

新版内容管理系统(CMS)搭建教程

基于云开发搭建的可视化的内容管理平台(CMS),新版内容管理系统(CMS)搭建教程。由公~号(木番薯科技)提供教程支持。 1、云开发 2、更多 3、内容管理 4、去使用 5、允许 6、下一步 7、开始 8、开…

多特征变量序列预测(10)基于麻雀优化算法的CEEMDAN-SSA-Transformer-BiLSTM预测模型

目录 往期精彩内容: 前言 1 多特征变量数据集制作与预处理 1.1 导入数据 1.2 CEEMDAN分解 1.3 数据集制作与预处理 2 麻雀优化算法 2.1 麻雀优化算法介绍 2.2 基于Python的麻雀优化算法实现 2.3 麻雀优化算法-超参数寻优过程 3 基于Pytorch的CEEMDAN SSA…

动态规划(算法竞赛、蓝桥杯)--深入浅出的完全背包DP

1、B站视频链接&#xff1a;E09【模板】背包DP 完全背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int n,m; int v[N],w[N],f[N][N];int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf("%d%d…

《计算机系统结构教程第三版课后习题答案》第一章作业手写答案

1.7 计算机系统结构计算题27、用一台40M Hz 处理机执行标准测试程序&#xff0c;它含的混合指令数和相应的时钟周期数如下&#xff1a;指令类型指令数时钟周期数整数运算450001数据传送320002浮点150002控制传送80002计算&#xff1a;(1)有效 CPI (2) MIPS (3&#xff09;程序的…

flutter 人机验证实战

先看效果 基本思路 接口进行触发是否进行图像验证&#xff0c;验证后将结果携带到接口里面去&#xff0c;进行人机验证 使用的技术(可惜只有web版本的) 验证码2.0智能人机验证(VAPTCHA)- 安全、易用、完全免费手势验证码VAPTCHA是基于人工智能和大数据的次世代人机验证解决方案…

【JavaEE进阶】图书管理系统开发日记——捌

文章目录 &#x1f343;前言&#x1f38d;统一数据返回格式&#x1f6a9;快速入门&#x1f6a9;存在问题&#x1f388;问题原因&#x1f388;代码修改 &#x1f6a9;统一格式返回的优点 &#x1f340;统一异常处理&#x1f332;前端代码的修改&#x1f6a9;登录页面&#x1f6a…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位&#xff1a;简单来说&#xff0c;复位引脚就是有复位信号&#xff0c;就是从头开始执行程序 本质&#xff1a;就是靠…

NC65 rest接口 开发 NC65接口开发

一、在对应模块META-INF下编写 xxx.rest 文件,也要放在Home里对应的目录下。 二、开发接口&#xff0c;继承extends AbstractUAPRestResource&#xff0c;&#xff08;有的项目会继承别的方法如&#xff1a;AbstractNCCRestResource&#xff0c;MTFRestResource&#xff1b;有…

智能水表预付费管理系统

智能水表预付费管理系统是当前智能水表技术的重要应用之一&#xff0c;结合了智能化管理和预付费功能&#xff0c;为水务公司和用户提供了便捷、高效的用水管理解决方案。该系统利用先进的科技手段&#xff0c;实现了水表抄表、计费和管理的自动化&#xff0c;为用户带来更便捷…

C++ Webserver从零开始:代码书写(十六)——配置文件,服务器,启动!

前言 现在是2024年2月28日的晚上20点36分&#xff0c;我完成了博客的所有内容。现在我整个人有一种如释重负的感觉&#xff0c;今天用webbench测试的时候还闹了个笑话&#xff0c;我在使用测试命令时&#xff0c;url多写了一个http://没注意&#xff0c;导致webbench访问服务器…

基于Python3的数据结构与算法 - 05 堆排序

目录 一、堆排序之树的基础知识 1. 树的定义 2. 树的一些概念 二、堆排序二叉树的基本知识 1. 二叉树的定义 2. 二叉树的存储方式&#xff08;表达方式&#xff09; 2.1 顺序存储方式 三、堆 1. 堆的定义 2. 堆的向下调整性质 四、堆排序的过程 1. 建造堆 五、时…

SpringCloud认识微服务

文章目录 1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 微服务架构是一种架构模式&…

软考51-上午题-【数据库】-索引

一、索引的定义 在数据库中&#xff0c;索引使得数据库程序无需对整个表进行扫描&#xff0c;就可以在其中找到所需数据。数据库中的索引是某个表中一列或者若干列&#xff0c;值的集合和相应的指向表中物理标识这些值的数据页逻辑指针清单。 二、索引的创建和删除 2-1、索引…

ThreeJS 几何体顶点position、法向量normal及uv坐标

文章目录 几何体的顶点position、法向量normal及uv坐标UV映射UV坐标系UV坐标与顶点坐标设置UV坐标案例1&#xff1a;使用PlaneGeometry创建平面缓存几何体案例2&#xff1a;使用BufferGeometry创建平面缓存几何体 法向量 - 顶点法向量光照计算案例1&#xff1a;不设置顶点法向量…

Linux shell:补充命令的使用

目录 一.导读 二.正文 三.结语 一.导读 上一篇介绍了脚本的简单概念以及使用&#xff0c;现在补充一些命令。 二.正文 目前处于全局目录&#xff0c;通过mkdir创建名我为day01的文件。 通过cd命令day01 切换至day01文件当中。 使用vim文本编辑器文件名&#xff08;firstdir&…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing算法学习笔记 &#x1f4ac;总结&#xff1a;希望你看完…