华清远见作业第二十三天——IO(第六天)

news2024/9/21 14:36:48

使用有名管道完成两个进程之间相互通信

 代码:

创建管道:

#include<a.h>
int main(int argc, const char *argv[])
{
    //创建有名管道文件
    if(mkfifo("./myfifo1", 0664) != 0)
    {
        perror("mkfifo1 error");
        return -1;
    }
    printf("myfifo1 create success\n");
    //创建有名管道文件
    if(mkfifo("./myfifo2", 0664) != 0)
    {
        perror("mkfifo2 error");
        return -1;
    }
    printf("myfifo2 create success\n");
    system("ls -l");
    //使用getchar阻塞一下
    getchar();
    system("rm myfifo1");
    system("rm myfifo2");
    return 0;
}

 主进程A:

#include<a.h>

int main(int argc, const char *argv[])
{
    pid_t pid = -1;   //定义变量存储进程号
    pid = fork();    //创建一个子进程
    //后续的程序,父子进程都会执行
    if(pid > 0)
    {
        printf("这是父进程对应管道1,pid = %d\n", pid);
		//以只写的形式打开管道文件
	    int wfd = -1;
	    if((wfd = open("./myfifo1", O_WRONLY)) == -1)
	    {
		perror("open error");
		return -1;
	    }
	    //向管道文件中循环写入数据
    	char wbuf[128] = "";
		while(1)
    	{
        	bzero(wbuf, sizeof(wbuf));           //清空内容
			//从终端输入数据
			printf("管道1请输入>>>>>");
        	fflush(stdout);            //刷新行缓冲区
       		read(0, wbuf, sizeof(wbuf));
        	wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'

        	//将数据写入管道中
        	write(wfd, wbuf, sizeof(wbuf));

        	//判断
        	if(strcmp(wbuf, "quit") == 0)
        	{
            	break;
        	}
    	}

    	//关闭文件
    	close(wfd);	
    	}
    	else if(pid == 0)
    	{
        	printf("这是子进程对应管道2,pid = %d\n", pid);
    		//以只读的形式打开管道文件
    		int rfd = -1;
    		if((rfd = open("./myfifo2", O_RDONLY)) == -1)
    		{
        		perror("open error");
        		return -1;
    		}

    			printf("管道2读端打开成功\n");

    			//从管道文件中循环读取数据
    			char rbuf[128] = "";
    			while(1)
    			{
        			bzero(rbuf, sizeof(rbuf));           //清空内容

        			//从管道中读取数据
        			read(rfd, rbuf, sizeof(rbuf));

        			printf("收到消息:%s\n", rbuf);

        
        		//判断
        		if(strcmp(rbuf, "quit") == 0)
        		{
            		break;
        		}
    		}

   	 			//关闭文件
    			close(rfd);	
	
    }else 
    {
        perror("fork error");
        return -1;
    }

    while(1);


    return 0;
}

主进程B:

#include<a.h>

int main(int argc, const char *argv[])
{
	pid_t pid = -1;   //定义变量存储进程号
	pid = fork();    //创建一个子进程
	//后续的程序,父子进程都会执行
	if(pid > 0)
	{
		printf("这是父进程,pid = %d\n", pid);
		//以只读的形式打开管道文件
	    int rfd = -1;
	    if((rfd = open("./myfifo1", O_RDONLY)) == -1)
		{
			perror("open error");
			return -1;
		}
	    printf("读端打开成功\n");
	    //从管道文件中循环读取数据
		 char rbuf[128] = "";
		while(1)
	    {
			bzero(rbuf, sizeof(rbuf));           //清空内容
			//从管道中读取数据
			read(rfd, rbuf, sizeof(rbuf));
			printf("收到消息:%s\n", rbuf);
			//判断
			if(strcmp(rbuf, "quit") == 0)
			{
			    break;
			}
	     }

		    //关闭文件
		    close(rfd);
	    }else if(pid == 0)
	    {
			printf("这是子进程,pid = %d\n", pid);
    		//以只写的形式打开管道文件
    		int wfd = -1;
    		if((wfd = open("./myfifo2", O_WRONLY)) == -1)
    		{
       			 perror("open error");
        	     return -1;
   			 }

   				 printf("写端打开成功\n");

   			 //向管道文件中循环写入数据
    		char wbuf[128] = "";
    		while(1)
    		{
       			 bzero(wbuf, sizeof(wbuf));           //清空内容

        		//从终端输入数据
        		printf("请输入>>>>>");
        		fflush(stdout);            //刷新行缓冲区
        		read(0, wbuf, sizeof(wbuf));
        		wbuf[strlen(wbuf)-1] = 0;           //将回车换成'\0'

        		//将数据写入管道中
        		write(wfd, wbuf, sizeof(wbuf));

        		//判断
        		if(strcmp(wbuf, "quit") == 0)
        		{
            		break;
        		}
    		}

   			 //关闭文件
    		close(wfd);
	    }else 
	    {
			perror("fork error");
			return -1;
	    }

	    	printf("hello world\n");
	    	while(1);


    return 0;
}

运行效果:

 

 

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

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

相关文章

Python采集猎聘网站招聘数据内容,看看现在职位风向

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 Pycharm 模块使用: 第三方模块&#xff0c;需安装&#xff1a; requests -> pip install requests pandas -> pip install pandas pyecharts -> pip install pyecharts 内置模块&…

JS/JQ实现小程序/H5验证码页面

话不多说&#xff0c;先上效果图 核心代码 1、html/css关键代码 <div class"obtain-verification-code"><div class"obtain-verification-code-input-content"><input id"input-0" class"verification-code-input" m…

校招社招,认知能力测验,③如何破解语言常识类测试题?

作为认知能力测评中的一个环节&#xff0c;语言常识类&#xff0c;是大概率的出现&#xff0c;不同的用人单位可能略有不同&#xff0c;语言是一切的基础&#xff0c;而常识则意味着我们的知识面的宽度。 语言常识类的测试&#xff0c;如果要说技巧&#xff1f;难说....更多的…

微信公众号H5,录音功能

功能&#xff1a; 按住录音&#xff0c;移开取消&#xff0c;调用的微信录音api&#xff0c;因手机端H5长按图片文字会放大或者选中&#xff0c;得禁止 效果图&#xff1a; html <van-popupv-model"vanPopupShow"roundposition"bottom":style"…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

SCI一区级 | Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Mutilhead-Attention霜冰算法…

MyBatisPlus学习二:常用注解、条件构造器、自定义sql

常用注解 基本约定 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper 要指定对应的泛型 public interface UserMapper extends BaseMapper<User> 实体类中&#xff0c;类名驼峰转下划线作为表名、名为id的…

若依CRUD搬砖开始,Java小白入门(十)

背景 经过囫囵吞枣的学习若依框架&#xff0c;对于ruoyi-framework&#xff0c;common&#xff0c;安全&#xff0c;代码生成等模块都看了一圈&#xff0c;剩余的调度模块&#xff0c;这个暂时不深入&#xff0c;剩余的是ruoyi-system&#xff0c;就是用mybatis完成的&#xf…

基于算术优化算法优化的Elman神经网络数据预测 - 附代码

基于算术优化算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于算术优化算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于算术优化优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

纯血国产:鸿蒙系统与安卓分道扬镳,对低代码开发行业的影响

近日&#xff0c;科技圈迎来了一则震动性的新闻——鸿蒙系统的“独立宣言”。这一举措意味着鸿蒙系统将与安卓、iOS形成三足鼎立之势&#xff0c;为全球科技市场注入新的活力。 据华为内部人士透露&#xff0c;从明年起&#xff0c;HarmonyOS系统将不再兼容安卓应用&#xff0c…

数模学习day08-拟合算法

这里拟合算法可以和差值算法对比 引入 插值和拟合的区别 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟 合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所 有的数据点最为接近&#xff0c;即曲线拟…

springCould中的Hystrix【下】-从小白开始【8】

目录 &#x1f9c2;1.熔断机制❤️❤️❤️ &#x1f32d;2.修改8001服务 ❤️❤️❤️ &#x1f95e;3.测试 ❤️❤️❤️ &#x1f953;4. 服务监控hystrixDashboard❤️❤️❤️ &#x1f32d;5.仪表盘❤️❤️❤️ &#x1f9c2;6.仪表盘的使用 ❤️❤️❤️ 1.熔断机…

Linux的Inode号和日志服务管理

目录 一、Inode号 1.inode和block 2.查看inode信息 二、日志服务管理 1.日志的级别 2.日志的种类 3.日志的功能和日志文件的分类 4.日志的格式和分析工具 三、rsyslog日志处理系统 1、使用Rsyslog创建日志优点 2、Rsyslog配置文件解析 3.通过rsyslog将ssh服务的日志…

k8s---pod基础下

k8s的pod与docker重启策略的区别 k8s的重启策略 always deployment的yaml文件只能是always&#xff0c;pod的yaml三种模式都可以。不论正常退出还是非正常退出都重启。OnFailure&#xff1a;正常退出不重启&#xff0c;非正常退出会重启Never&#xff1a;正常退出和非正常退出…

宿舍安全用电监控系统解决方案

摘 要&#xff1a;很多高校宿舍的用电功率存在限制,为此设计了宿舍用电智能监控系统。系统由主控制器、采集部分、通信部分组成。利用STM32作为主控芯片,采集部分采用BL0937芯片采集电压和电流,采集多条线路用电数据,各路数据采集通道均采用隔离保护,通信部采用4G、LoRa无线通信…

系统架构设计师教程(十)软件可靠性基础知识

软件可靠性基础知识 10.1 软件架构演化和定义的关系10.1.1 演化的重要性10.1.2 演化和定义的关系 10.2 面向对象软件架构演化过程10.2.1 对象演化10.2.2 消息演化10.2.3 复合片段演化10.2.4 约束演化 10.3 软件架构演化方式的分类10.3.1 软件架构演化时期10.3.2 软件架构静态演…

Dockerfile基本结构及编写详解

文章目录 1 Dockerfile1.1 Dockerfile的基本结构1.2 Dockerfile文件说明1.3 Dockerfile常见命令1.4 build命令1.5 部署微服务1.6 docker-compose部署 1 Dockerfile ​ Dockerfile其实就是我们用来构建Docker镜像的源码&#xff0c;当然这不是所谓的编程源码&#xff0c;而是一…

用通俗易懂的方式讲解:2024 检索增强生成技术(RAG)研究进展

本篇内容1w字左右&#xff0c;稍微有点长&#xff0c;相对不容易理解&#xff0c;喜欢可以收藏、关注、点赞。 一、前言 在过去的一两年里&#xff0c;人工智能领域目睹了检索增强生成技术&#xff08;RAG&#xff09;的迅猛发展&#xff0c;这种技术结合了强大的语言模型与信…

百倍潜力股Aleo即将上线,布局正当时!牛市来时,你得有币!

前言 在加密货币市场&#xff0c;2024年被众多市场专家预测为迎来新一轮牛市的关键年份。这一预测背后&#xff0c;潜藏着多种可能推动牛市的因素。其中&#xff0c;下一次比特币&#xff08;BTC&#xff09;的减半事件&#xff0c;以及2024年 BTC 现货ETF的推出&#xff0c;都…

python统计分析——直方图(sns.histplot)

使用seanborn.histplot()函数绘制直方图 from matplotlib.pyplot as plt import seaborn as snsdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) &#xff08;1&#xff09;dataNone, 表示数据源。 &#xff08;2&#xff09;xNone, 表示直方图的分布垂直与x轴…