【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

news2024/9/22 21:12:06

目录

1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

2、使用有名管道实现两个进程间相互通信


1、使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
    //创建有名管道文件
    if(mkfifo("./linux",0664) == -1)
    {
        perror("mkfifo error");
        return -1;
    }

    getchar();
   
    //按下回车后自动删除创建的管道文件
    system("rm ./linux");

    return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
    //以只写的形式打开管道文件
    int wfd = -1;
    if((wfd = open("./linux",O_WRONLY)) == -1)
    {
        perror("open error");
        return -1;
    }

    //以读写的形式打开一个文件
    int destfd = -1;
    if((destfd = open("./dest.txt",O_RDWR|O_CREAT|O_TRUNC),0664) == -1)
    {
        perror("open error");
        return -1;
    }

    printf("管道文件写端打开\n");

    //发送数据,定义一个容器
    char wbuf[128] = "";
    while(1)
    {
        //输入数据
        printf("请输入>>>");
        fgets(wbuf,sizeof(wbuf),stdin);

        //将数据存入到文件中
        write(destfd,wbuf,sizeof(wbuf));

        wbuf[strlen(wbuf)-1] = 0;     //将数据最后置位'\0',成为一个字符串
        
        //将数据发送到管道中
        write(wfd,wbuf,sizeof(wbuf));

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

    //关闭文件描述符
    close(wfd);
    return 0;
}

 

//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
    //以只写的形式打开管道文件
    int rfd = -1;
    if((rfd = open("./linux",O_RDONLY)) == -1)
    {
        perror("open error");
        return -1;
    }

    printf("管道文件读端打开\n");

    //接收数据,定义一个容器
    char rbuf[128] = "";
    while(1)
    {
        //清空容器
        bzero(rbuf,sizeof(rbuf));

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

        if(strcmp(rbuf,"quit") == 0)
        {
            break;
        }
        printf("收到的数据是:%s\n",rbuf);
    }

    //关闭文件描述符
    close(rfd);
    return 0;
}

输出结果如下:可以看出已经实现在一个进程输入,另一个进程中能够输出了,同时能够保存数据到文件中

2、使用有名管道实现两个进程间相互通信

//create.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
    //创建两个有名管道
    if(mkfifo("./linux1",0664) == -1)
    {
        perror("open1 error");
        return -1;
    }

    if(mkfifo("./linux2",0664) == -1)
    {
        perror("open2 error");
        return -1;
    }

    getchar();
    
    system("rm linux1");
    system("rm linux2");
    return 0;
}
//snd.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
	//创建父子进程
	pid_t pid = fork();

	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}
	else if(pid == 0)
	{
		//子进程内容
		//以只读的形式打开有名管道1
		int rfd = open("./linux2",O_RDONLY);
		if(rfd == -1)
		{
			perror("open1 error");
			return -1;
		}

		//定义接收容器
		char rbuf[128] = "";

		while(1)
		{
			//初始化容器
			bzero(rbuf,sizeof(rbuf));

			//获取数据
			read(rfd,rbuf,sizeof(rbuf));
			if(strcmp(rbuf,"quit") == 0)
			{
				break;
			}

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


		close(rfd);

	}

	//父进程内容
	//以只读的形式打开有名管道1
	int wfd = open("./linux1",O_WRONLY);
	if(wfd == -1)
	{
		perror("open1 error");
		return -1;
	}
	printf("管道文件已经打开\n");

	//发送数据
	char wbuf[128] = "";

	while(1)
	{
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf) - 1] = 0;

		//将数据发送到管道里
		write(wfd,wbuf,sizeof(wbuf));
		//判断数据
		if(strcmp(wbuf,"quit") == 0)
		{
			break;
		}
	}

	wait(NULL);

	return 0;
}

//recv.c
#include<myhead.h>
int main(int argc, char const *argv[])
{
	//创建父子进程
	pid_t pid = fork();

	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}
	else if(pid == 0)
	{
		//子进程内容
		int wfd = open("./linux2",O_WRONLY);
		if(wfd == -1)
		{
			perror("open1 error");
			return -1;
		}
		printf("管道文件已经打开\n");

		//发送数据
		char wbuf[128] = "";

		while(1)
		{
			printf("请输入>>>");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf) - 1] = 0;

			//将数据发送到管道里
			write(wfd,wbuf,sizeof(wbuf));
			//判断数据
			if(strcmp(wbuf,"quit") == 0)
			{
				break;
			}
		}
		close(wfd);
	}

	//父进程内容
	//以只读的形式打开有名管道1
	int rfd = open("./linux1",O_RDONLY);
	if(rfd == -1)
	{
		perror("open1 error");
		return -1;
	}

	//定义接收容器
	char rbuf[128] = "";

	while(1)
	{
		//初始化容器
		bzero(rbuf,sizeof(rbuf));

		//获取数据
		read(rfd,rbuf,sizeof(rbuf));
		if(strcmp(rbuf,"quit") == 0)
		{
			break;
		}

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


	close(rfd);
	return 0;
}

输出结果如下:可以看出已经成功实现两个进程间的通信了

3、思维导图

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

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

相关文章

Linux权限-普通权限

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 根据前面Linux用户介绍&#xff0c;里面涉及到超级管理员&#xff0c;普通用户&…

AI技术重塑招聘流程:效率与精准度的双重提升

一、引言 在21世纪的数字经济浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度渗透到社会经济的各个领域&#xff0c;其中&#xff0c;人力资源&#xff08;HR&#xff09;管理领域也不例外。作为组织发展与人才战略的核心环节&#xff0c;招聘流程正经…

VoNR网络架构与网元 IMS终端号码结构(VoLTE和VoNR适用)

目录 1. VoNR网络架构与网元 1.1 VoNR架构 vs VoLTE架构 1.2 回顾语音网络的演进与“分离” 1.3 TS23.228给出的5G的VoNR国际漫游 Home Routed 方案架构图 1.4 VoNR 网络架构图&#xff08;2022版&#xff09; 1.5 IMS 网元分类&#xff08;VoNR VoLTE 适用&#xff09…

【SpringBoot】集成Redis

[TOC] 1 redis ​ redis是一个用C语言开发的&#xff0c;基于内存结构进行键值对数据存储、高性能、非关系型NoSQL数据库 ​ 官网&#xff1a; https://redis.io/ 1.1 特点 基于内存存储&#xff0c;数据读写效率很高本身支持持久化虽然基于key-value存储&#xff0c;但是…

excel中有些以文本格式存储的数值如何批量转换为数字

一、背景 1.1 文本格式存储的数值特点 在平时工作中有时候会从别地方导出来表格&#xff0c;表格中有些数值是以文本格式存储的&#xff08;特点&#xff1a;单元格的左上角有个绿色的小标&#xff09;。 1.2 文本格式存储的数值在排序时不符合预期 当我们需要进行排序的时候…

HashMap中 put()方法的流程、扩容的思路(源码分析~)

文章目录 put() 方法的流程扩容流程为什么它会按照2的幂次方进行扩容呢&#xff1f; put() 方法的流程 下面我们通过分析源码来总结一下 put() 方法的流程 扩容流程 根据上图的分析&#xff0c;就可以总结出 HashMap 的扩容流程&#xff1a; 在插入元素时&#xff0c;会先…

LMDrive 端到端闭环自动驾驶框架

LMDrive&#xff0c;一种新颖的语言引导的端到端闭环自动驾驶框架。LMDrive独特地处理和整合多模态传感器数据与自然语言指令&#xff0c;使车辆能够在现实的指令设置中与人类和导航软件进行交互。 LMDrive由两个主要部分组成&#xff1a; 1&#xff09;一个视觉编码器&#x…

(javaweb)java中spring项目的搭建

spring 1.地位高-- 后端web开发--基于springboot开始 二.SpringBoot Web入门 1. http--请求协议 localhost--本机服务 8080--端口号 /hello--访问的资源 发起请求之后要被web应用程序处理 路径访问成功&#xff01;&#xff01;&#xff01;localhost&#xff1a;8080/hel…

桌面云备份可以删除吗?安不安全

桌面云备份可以删除吗&#xff1f;答案是可以的。如果用户不需要这些备份或者想要释放存储空间&#xff0c;桌面云备份是可以进行删除的&#xff0c;并且删除桌面云备份是一个相对安全的过程&#xff0c;但需要注意以下几点来确保操作的安全性和数据的完整性。 一、桌面云备份…

C# Unity 面向对象补全计划 泛型约束

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 1.泛型约束了什么 在C#中&#xff0c;泛型约束用于限制泛型类型参数的类型 可以在泛型类型或方法的声明中使用 where 关键字来指定这些约束 2.约束栗子 基类约束…

ShardingSphere之ShardingProxy实战操作、分布式事务

文章目录 简介基础使用部署ShardingProxy配置分库分表策略 分布式事务机制介绍XA事务Demo使用另外两种XA事务管理器 简介 ShardingSphere的两个核心产品分别为ShardingJDBC和ShardingProxy。前文已经详细介绍了ShardingJDBC的具体使用&#xff0c;接下来介绍服务端的分库分表S…

MyBatis搭建和增删改查

MyBatis是一个开源的持久层框架&#xff0c;用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置&#xff0c;并自动生成对应的SQL语句&#xff0c;从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离&#xff0c;…

Java01 Java预备知识

第一节&#xff1a;Java预备知识 进制转化 &#xff08;1&#xff09;&#xff1a;二进制转十进制采用数字与阶码相乘并相加&#xff0c;阶码从右往左依次增大&#xff0c;从左往右依次减小。 例&#xff1a;100&#xff08;2&#xff09;0*2^00*2^11*2^44(10) (2)&#xff1a…

【远程桌面】远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

转发原文&#xff1a;https://blog.csdn.net/juanjuan_01/article/details/127005255 错误提示 Windows10系统中远程连接服务器的时候出现如下错误的提示&#xff1a; 解决方案一&#xff1a; 步骤1、winR打开运行窗口 步骤2、输入gpedit.msc命令&#xff0c;点击“确定”&a…

Go语言-- 版本管理go module以及go.sum详解

为了确保一致性构建&#xff0c;Go语言中引入了go.mod文件来标记每个依赖包的版本&#xff0c;在构建过程中go命令会下载go.mod中的依赖包&#xff0c;下载的依赖包会缓存在本地&#xff0c;以便下次构建。 在进行go语言项目开发的时候&#xff0c;会依赖3种类型的库包&#x…

使用ThreadLocal来存取单线程内的数据

一.什么是ThreadLocal&#xff1f; ThreadLocal&#xff0c;即线程本地变量。如果你创建了一个 ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际是在操作自己本地内存里面的变量&…

Selenium+Python自动化测试:解决无法启动IE浏览器及报错问题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前言&#xff1a;记录启动IE浏览器的报错及解决方法。 错误1&#xff1a; selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe execu…

MySQL:索引(Index)语句

索引的限制 每个表最多可以有 16 个索引&#xff08;InnoDB 表的限制&#xff09;。 单个索引最多可以包含 16 列。 索引列的最大长度为 767 字节&#xff08;对于 CHAR, VARCHAR, 和 BINARY 类型&#xff09;&#xff0c;3072 字节&#xff08;对于 BLOB 类型&#xff09;。…

网鼎杯比赛二次注入技巧

文章目录 前端的网页展示分析题目暴力破解寻找代码找到注入点进行注入查询想要的文件 前端的网页展示 分析题目 1.目前我们能看到的只有三个页面&#xff0c;但是我们可以看到三个*号。 2.考虑三个*的密码是什么&#xff0c;这里可以采用暴力破解&#xff08;我们先猜这是三个…

【精选】6款一键生成论文的软件3000字论文网站

千笔-AIPassPaPer是一款功能强大且全面的AI论文写作工具&#xff0c;特别适合学术研究者和学生使用。它不仅能够一键生成高质量的论文初稿&#xff0c;还涵盖了700多个学科专业方向&#xff0c;满足各种学术需求。 一、千笔-AIPassPaPer 传送门&#xff1a;https://www.aipape…