操作系统-管道通信

2023-11-12

编写程序,演示多进程并发执行和进程软中断、管道通信。

父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2;子进程1每隔1秒通过管道向子进程2发送数据:I send you x times. (x初值为1,每次发送后做加一操作)子进程2从管道读出信息,并显示在屏幕上。父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

`Child Process l is Killed by Parent!
Child Process 2 is Killed by Parent!`

父进程等待两个子进程终止后,释放管道并输出如下的信息后终止

Parent Process is Killed!
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define N 50
void stop1(),stop2();
int p1,p2;  // 子进程P1,P2
int fd[2];  //无名管道
char buf[N];//消息
void main()
{
	if(pipe(fd)<0)//创建管道
	{
		perror("Fail to pipe");//创建失败,输出提示
		exit(EXIT_FAILURE);
	}
	if(p1=fork())//创建子进程P1
	{
		if(p2=fork())//创建子进程P2
		{	
			signal(SIGINT,stop1);//等待接受SIGINT信号量
			wait(0);//等待P1进程关闭
			wait(0);//等待P2进程关闭
			printf("parent process is killed!\n");//输出父进程关闭
                        close(fd[0]);
                        close(fd[1]);
			exit(0);//退出父进程
	         }
			else
		{
			
			close(fd[1]);	//关闭写管道
			int n=0;
			signal(SIGINT,SIG_IGN);//忽略SIGINT信号
			signal(SIGUSR1,stop2);//接受kill信号,执行stop
			while(1)
			{
			n=read(fd[0],buf,sizeof(buf)+1);//读取管道中的信息
			buf[n]='\0';//添加结束标记
			printf("child %d receive:'%s.'\n",getpid(),buf);//输出读取的信息
		       }
		}
	}
	else
	{
		int i=0;
		close(fd[0]);//关闭读管道
		signal(SIGUSR1,stop2);//接受kill信号,执行stop
		signal(SIGINT,SIG_IGN);//忽略SIGINT信号
		while(1){
		sprintf(buf,"child %d send  %d time",getpid(),i);//写入写入次数到buf
		buf[strlen(buf)]='\0';//添加结束标记
		write(fd[1],buf,strlen(buf)+1);//将数据写入管道
		sleep(1);//等待1s
		i++;
	}
	}
}
void stop1()  // signal handler of parent process 
{
kill(p1,SIGUSR1);
kill(p2,SIGUSR1);
}
void stop2()  // signal handler of parent process 
{
        close(fd[0]);
        close(fd[1]);
//lockf(1,1,0); //锁定
        printf("child %d to exit!\n",getpid());
//lockf(1,0,0);//解锁
	exit(0);
}

实验结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统-管道通信 的相关文章

随机推荐

  • 微搭低代码学习之销售员销售目标采集系统开发

    四月二十三 春意渐浓 草木抽出新枝 鸟儿唱响欢融 花开满园 香气袭人 阳光明媚 人们心情舒畅 愿这美好的日子 伴随你一生 使用Notion AI提问 写一首关于4月23日的诗 文章目录 前言 一 销售员销售目标采集系统需求分析 一 需求背景
  • Matplotlib绘制混淆矩阵及colorbar标签设置

    本文提供一种通过Matplotlib绘制混淆矩阵并调整colorbar标签的程序 直接上程序 from sklearn metrics import confusion matrix import matplotlib pyplot as
  • JS从编译到运行代码的过程

    js运行分为两个阶段 具体AST树以及bytecode等名词看我上一篇文章 浏览器工作原理 1 编译阶段 js代码 gt AST树 代码被解析的过程 v8引擎内部会在堆内存帮助我们创建一个对象 GlobalObject gt GO 简称GO
  • JS闭包理解

    JS闭包 1 闭包 每次看到jQuery的时候 首先想到的就是闭包 这是个常谈的问题了 今天重新回忆了一下闭包 什么是闭包 当有一个函数想要访问另一个函数内部的变量 这个是访问不了的 所有我们要用闭包来访问 所以简单的来说 闭包就是连接函数
  • STM32使用IIC协议驱动0.96寸OLED屏

    IIC是常用的协议之一 它通过不同的地址来区分设备 并且端口需要是开漏模式 并且需要接上拉电阻 要使用IIC驱动OLED 首先要配置IIC void I2C Configuration void I2C InitTypeDef I2C In
  • 程序员工资大概组成【刚毕业的大学生看过来】

    一 程序员的薪资组成是什么样子的呢 薪资组成因人而异 受到很多因素的影响 如工作地点 工作经验 工作职责 专业领域等 一般而言 中国程序员的薪资组成包括基本工资 绩效工资 津贴和奖金等 在中国 程序员的平均薪资水平受到地区 行业和职业经验等
  • C++实现一个线程池

    一 为什么使用线程池 大家都知道C 支持多线程开发 也就是支持多个任务并行运行 我们也知道线程的生命周期中包括创建 就绪 运行 阻塞 销毁等阶段 所以如果要执行的任务很多 每个任务都需要一个线程的话 那么频繁的创建 销毁线程会比较耗性能 有
  • 【计算机视觉

    文章目录 一 检测相关 9篇 1 1 Boosting Detection in Crowd Analysis via Underutilized Output Features 1 2 CircleFormer Circular Nucl
  • 油猴安装错误问题(下载中断问题)及脚本安装

    第一步 在电脑c盘找到这个文件 C Windows System32 drivers etc 然后用记事本打开hots 打开之后如此图 2 在host文件最后面 添加 131 253 33 219 edge microsoft com 13
  • 利用python绘制二三维曲面和矢量流线图

    为了实现不同数据的可视化 最近研究了python环境下的可视化方案 为后续的流体运动仿真模拟做好储备 由于python处理数据的便利性 导致目前很多后端处理或者可视化成图操作都在python中实现 比如前端是vue 加上简单的交互操作 后端
  • nextjs的getStaticProps要点

  • 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换

    全球24个时区的划分 相较于两地时间表 显示世界各时区时间和地名的世界时区表 Universal WorldTime 就显得精密与复杂多 通常世界时区表的表盘上会标示着全球24个时区的城市名称 全球24个时区是如何产生的 过去世界各地原本各
  • 【学习笔记】【DBN】十九——深度信念网络DBN

    本篇简要介绍深度信念网络DBN 是一个不太常见的神经网络 首先对深度信念网络 DBN 进行简要介绍 然后对其组成原件RBM的结构 原理和训练过程进行介绍 接着对DBN的训练过程进行介绍 目录 一 DBN概述 二 首先玻尔兹曼机 RBM 1
  • 图形推理1000题及答案解析_公考干货

    图形推理中 立体折叠类图形最大的难点就是考察人的立体空间推理 主要考察方式有折纸盒 三视图 剖面图 解题方法有特殊面法 相邻面法 相对面法 无论题目有多难都不会逃出这三个方法 但是很多考生的立体推理能力比较差 教给大家一个小技巧 在考试过程
  • LeetCode 20. 有效的括号

    题目链接 https leetcode cn problems valid parentheses C 代码如下 class Solution public bool isValid string s stack
  • The Standard C Library

    C的标志库函数是学习和使用C语言的基础 是编写经典C程序的基础 是学习其他计算机知识的基础 C标志库中一共包含了15个头文件
  • matlab求lypunov,【原创】Lyapunov、Sylvester和Riccati方程的Matlab求解

    Lyapunov Sylvester和Riccati方程是控系统常用到的几个方程 应用和计算比较广泛 在这里我们只要讨论下Lypunov方程的连续方程 离散方程的数值和解析解法 其中数值解法MATLAB提供的直接的lyap 和dlyap 函
  • ClassNotFoundException:NullPointerException:ArrayIndexOutOfBounException:FileNotFoundException:等异常

    目录 1 ClassNotFoundException 解决方法 2 NullPointerException 解决方法 3 ArrayIndexOutOfBoundsException 解决方法 4 FileNotFoundExcepti
  • EasySwoole ElasticSearch打造高性能小视频服务系统

    好久没有更新教程 现在更新一套缓存视频给大家 Elasticsearch的索引思路 将磁盘里的东西尽量搬进内存 减少磁盘随机读取次数 同时也利用磁盘顺序读特性 结合各种奇技淫巧的压缩算法 用及其苛刻的态度使用内存 所以 对于使用Elasti
  • 操作系统-管道通信

    编写程序 演示多进程并发执行和进程软中断 管道通信 父进程使用系统调用pipe 建立一个管道 然后使用系统调用fork 创建两个子进程 子进程1和子进程2 子进程1每隔1秒通过管道向子进程2发送数据 I send you x times x