我在杭州的Day30_进程间通信(IPC)——20240805

news2024/9/20 20:38:21

一、相关练习

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

1.1> 01homework.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建一个有名管道
	if(mkfifo("./pipe", 0664) == -1)
	{
		perror("mkfifo error");
		return -1;
	}
	
	//定义通信容器
	char buf[128] = "";

	//创建父子进程
	pid_t pid = fork();
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid > 0)
	{
		//子进程
		//以读的形式打开文件
    	int rfd = open("./pipe", O_RDONLY);
    	if(rfd == -1)
    	{
        perror("open error");
        return -1;
    	
		}
		//已追加形式打开要写入文件
		int dfd = open("./test.txt", O_WRONLY|O_APPEND|O_CREAT, 0664);
		if(dfd == -1)
		{
			perror("open dfd error");
			return -1;
		}
	    printf("管道文件读端打开\n");

       	while(1)
    	{
        	bzero(buf, sizeof(buf));
        	//读取数据
        	read(rfd, buf, sizeof(buf));
        	if(strcmp(buf, "quit") == 0)
        	{
            	break;
        	}
        	printf("收到消息为:%s\n", buf);

			//将读取到的数据写入目标文件
			write(dfd, buf, strlen(buf));
			write(dfd, "\n", sizeof("\n"));
    	}

		//关闭文件
		close(rfd);
		close(dfd);

		//退出进程
		exit(EXIT_SUCCESS);
	}

	//以写的形式打开管道文件
	int wfd = open("./pipe", O_WRONLY);
	if(wfd == -1)
	{
		perror("open wfd error");
		return -1;
	}
	printf("管道文件写端打开\n");
	usleep(10);

	while(1)
	{
		usleep(10);
		bzero(buf, sizeof(buf));

		printf("请输入>>>");
		fgets(buf, sizeof(buf), stdin);
		buf[strlen(buf)-1] = 0;
		//写入数据
		write(wfd, buf, strlen(buf));

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

	//回收进程资源
	wait(NULL);

	//关闭写端
	close(wfd);

	//删除管道文件
	system("rm pipe");

	return 0;
}

1.2> 程序运行效果

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

2.1> creat.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建管道文件
	if(mkfifo("./pipe1", 0664) == -1)
	{
		perror("mkfifo pipe1 error");
		return -1;
	}
	if(mkfifo("./pipe2", 0664) == -1)
	{
		perror("mkfifo pipe2 error");
	}

	getchar();

	//删除管道文件
	system("rm pipe1");
	system("rm pipe2");

	return 0;
}

2.2> fork_a.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建通信中间变量
	char buf[128] = "";

	//创建父子进程
	pid_t pid = fork();
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程
		//以只读的形式打开管道文件2
		int rfd = open("./pipe2", O_RDONLY);
		if(rfd == -1)
		{
			perror("pipe2 open error");
			return -1;
		}

		//读取管道文件2中的数据
		while (1)
		{
			bzero(buf, sizeof(buf));
			read(rfd, buf, sizeof(buf));
			if(strcmp(buf, "quit") == 0)
			{
				//退出聊天
				printf("B已经退出聊天,请输入“quit”退出聊天\n");
				break;
			}
			printf("收到B的消息:%s\n", buf);
		}
		
		//关闭文件描述符
		close(rfd);

		//退出子进程
		exit(EXIT_SUCCESS);
	}

	//以只写的形式打开管道文件1
	int wfd = open("./pipe1", O_WRONLY);
	if(wfd == -1)
	{
		perror("pipe1 open error");
		return -1;
	}

	//向管道文件1中写入数据
	while(1)
	{
		bzero(buf, sizeof(buf));			//清空容器
		printf("向B发送消息:");
		fgets(buf, sizeof(buf), stdin);		//从标准输入中读取数据
		putchar(10);
		buf[strlen(buf)-1] = 0;				//去掉换行符
		write(wfd, buf, strlen(buf));		//向管道文件1中写入数据
		if(strcmp(buf, "quit") == 0)		//如果输入的是quit,则退出聊天
		{
			break;
		}
	}

	//回收子进程
	wait(NULL);

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

	return 0;
}

2.3> fork_b.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建通信中间变量
	char buf[128] = "";

	//创建父子进程
	pid_t pid = fork();
	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子进程
		//以只读的形式打开管道文件2
		int rfd = open("./pipe1", O_RDONLY);
		if(rfd == -1)
		{
			perror("pipe2 open error");
			return -1;
		}

		//读取管道文件2中的数据
		while (1)
		{
			bzero(buf, sizeof(buf));
			read(rfd, buf, sizeof(buf));
			if(strcmp(buf, "quit") == 0)
			{
				//退出聊天
				printf("A已经退出聊天,请输入“quit”退出聊天\n");
				break;
			}
			printf("收到A的消息:%s\n", buf);
		}
		
		//关闭文件描述符
		close(rfd);

		//退出子进程
		exit(EXIT_SUCCESS);
	}

	//以只写的形式打开管道文件1
	int wfd = open("./pipe2", O_WRONLY);
	if(wfd == -1)
	{
		perror("pipe1 open error");
		return -1;
	}

	//向管道文件1中写入数据
	while(1)
	{
		bzero(buf, sizeof(buf));			//清空容器
		printf("向A发送消息:");
		fgets(buf, sizeof(buf), stdin);		//从标准输入中读取数据
		putchar(10);
		buf[strlen(buf)-1] = 0;				//去掉换行符
		write(wfd, buf, strlen(buf));		//向管道文件1中写入数据
		if(strcmp(buf, "quit") == 0)		//如果输入的是quit,则退出聊天
		{
			break;
		}
	}

	//回收子进程
	wait(NULL);

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

	return 0;
}

2.4> 程序运行效果

二、思维导图

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

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

相关文章

怎么实现外地分公司与总公司软件连接?

为了确保外地分公司能够顺利连接总公司的管理软件和财务软件&#xff0c;建立一个安全可靠的网络基础设施是必不可少的。首先&#xff0c;我们可以通过搭建虚拟专用网络来实现分公司与总公司内部网络的互联互通。虚拟专用网络不仅能够保障数据传输的安全性&#xff0c;还能提供…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

systemd-manage系统服务图形化管理工具使用教程

1. systemd-manage介绍 systemd-manage是一个开源的基于systemd服务管理的图形化工具&#xff0c;使用qt图形库进行开发&#xff0c;可以提供服务管理&#xff0c;用户会话&#xff0c;配置文件修改&#xff0c;日志查询&#xff0c;性能分析&#xff0c;进程管理等功能。图形…

【Pyautogui自动准备jupyter】附上报错合集,已解决

刚认识了pyautogui&#xff0c;浅浅写一段自动准备jupyter的程序 import pyautogui #import pyperclip import timedef open_jupyter():print(Opening jupyter...)time.sleep(1)try:location pyautogui.locateOnScreen(r"D:\STEFANOS\python\tools\auto\icons\jupyter…

SpringCloud入门简介

1. SpringCloud是什么 SpringCloud是微服务治理方案之一&#xff1b; SpringCloud与SSM框架和SpringBoot没什么关联 SSM&#xff1a;web应用的开发框架&#xff0c;包含视图层&#xff08;模型model视图view控制器controller&#xff09;&#xff0c;业务层&#xff0c;持久…

unity草体渲染方案 GPU Instaning

有一天看项目里的FrameDebug发现在森林系的场景里草体的drawcall差不多有100多 主要是因为灯光贴图&#xff0c;位置等不一样导致的打断合批&#xff0c;导致一个批次只能渲染10个左右的草体 之前有了解过unity有接口&#xff08;Graphics.DrawMeshInstanced&#xff09;可以把…

SpringBoot 框架学习笔记(七):Thymeleaf、拦截器 和 文件上传实现(解决了文件重名 和 按日期分目录存放问题)

1 Thymeleaf 1.1 基本介绍 &#xff08;1&#xff09;官方文档&#xff1a;Tutorial: Using Thymeleaf &#xff08;2&#xff09;Thymeleaf 是什么 Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎&#xff0c;可完全替代 JSPThymeleaf 是一个 java 类库&#xf…

AnyGo(虚拟定位软件) for MacOS苹果电脑安装下载 支持最高系统 兼容M芯片

AnyGo for Mac是一款专为Mac用户设计的虚拟定位软件。它允许用户在Mac设备上模拟GPS位置&#xff0c;从而改变设备在各种基于位置的应用和服务中的显示位置。AnyGo提供了简单直观的操作界面&#xff0c;用户可以轻松地在地图上选择任意地点作为模拟位置&#xff0c;或者通过输入…

【平衡二叉树】数据结构—平衡二叉树

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;它的左右子树的高度差不超过1&#xff0c;这样可以保证树的高度相对较低&#xff0c;从而使得查找、插入和删除操作的时间复杂度保持在 。 平衡二叉树的基本概念 1. 二叉树&#xff1a…

LeetCode 热题 HOT 100 (020/100)【宇宙最简单版】[创作中]

【链表】No. 0142 环形链表 II【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#…

C++ 简单学习

C简单编译 auto关键字 auto 关键字用于自动类型推导。它允许编译器自动推断变量的类型&#xff0c;使得代码更加简洁和易于编写&#xff0c;尤其是在处理复杂类型或模板编程时。使用 auto 可以避免编写冗长的类型声明&#xff0c;同时减少由于类型不匹配导致的编译错误 auto x…

学习vue3 三,组件基础,父子组件传值

组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例&#xff1a; App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…

Docker部署Node+Koa+TS+Mongo项目

Docker 简介 简而言之&#xff0c;Docker 容器轻量级、启动快、可移植&#xff0c;适合微服务架构。主要组件包括 Docker Engine、Docker 镜像、Docker 容器和 Docker Hub&#xff0c;它通过容器打包应用程序及其依赖项&#xff0c;使得应用在任何环境中都能一致运行。 这里不…

Selenium中send_keys上传图片方法以及可能失败的原因

Python Selenium是一个用于自动化浏览器操作的工具&#xff0c;可以用于模拟用户在浏览器中的各种操作。在使用Python Selenium进行自动化测试时&#xff0c;有时需要上传图片。下面是在这种情况下如何上传图片的步骤&#xff1a; 今天是主要说的是input标签&#xff0c;这种可…

基于R语言绘制GGE双标图3

参考资料&#xff1a; https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf GGE叠图法一分析品种环境互作模式的理想方法【作物学报】 GGE 双标图如何看&#xff1f;-CSDN博客 1、品种间两两比较 GGE 双标图可用于直接比较两个品种在各个试验点的表现&…

白银市场暴跌的技术分析与投资策略

一、白银市场暴跌与技术分析 周一&#xff08;8月5日&#xff09;&#xff0c;现货白银暴跌逾4.5%&#xff0c;并跌破关键的100日移动均线。FXStreet分析师Christian Borjon Valencia对银价技术走势进行了分析&#xff0c;指出银价前景转为看跌&#xff0c;技术面显示白银将进一…

探索Python并发的秘境:Greenlet库的奇幻之旅

文章目录 探索Python并发的秘境&#xff1a;Greenlet库的奇幻之旅背景&#xff1a;为何选择Greenlet&#xff1f;绿野仙踪&#xff1a;Greenlet是什么&#xff1f;安装&#xff1a;如何将Greenlet纳入囊中&#xff1f;功能探索&#xff1a;Greenlet的五大法宝场景应用&#xff…

【系统分析师】-综合知识-软件工程与项目管理

1、按照成本性态分类&#xff0c;可以分为固定成本、变动成本和混合成本。 &#xff08;1&#xff09;固定成本。管理人员的工资、办公费、固定资产折旧费、员工培训费、广告费、员工培训费、技术开发经费、办公场地及机器设备的折旧费、房屋及设备租金、管理人员的工资等。 …

提示工程:CO-STAR框架

在人工智能领域&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;的应用中&#xff0c;提示工程已成为一项至关重要的技能。它不仅需要对技术有深刻的理解&#xff0c;还需要创造力和战略思维的结合。本文将探讨提示工程的重要性&#xff0c;详细介绍CO-STAR框架的使…

0209-开发状态切换(场景切换)功能

一、设置场景状态 1、已有方法 2、实现步骤 引用API&#xff1a;using UnityEngine.SceneManagement 写设置场景状态的方法 场景名字切换&#xff0c;需要获取mSceneName&#xff0c;他是私有的&#xff0c;给一个getset 3、问题 &#xff08;1&#xff09;同步加载 加载场…