当前位置: 首页 > news >正文

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

一、相关练习

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){//子进程//以只读的形式打开管道文件2int 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);}//以只写的形式打开管道文件1int 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){//子进程//以只读的形式打开管道文件2int 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);}//以只写的形式打开管道文件1int 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.lryc.cn/news/417467.html

相关文章:

  • FFmpeg推流
  • 【Rust光年纪】简化文件操作流程:深度剖析多款文件系统操作库
  • FFmpeg实现文件夹多视频合并
  • [设备] 关于手机设备中几种传感器的研究
  • C#通过Modbus读取温度和湿度
  • 海量数据处理商用短链接生成器平台 - 9
  • 从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化
  • 【Mysql】第十二章 视图特性(概念+使用)
  • 【颠覆数据处理的利器】全面解读Apache Flink实时大数据处理的引擎-上篇
  • 【C++】C++11(可变参数模板、lambda表达式、包装器)
  • 矩阵获客时代,云微客让你一个人成就一支队伍
  • 浅谈基础的图算法——Tarjan求强联通分量算法(c++)
  • 【Godot4自学手册】第四十四节用着色器(shader)实现溶解效果
  • 【画流程图工具】
  • Revit二次开发选择过滤器,SelectionFilter
  • 【Linux】进程概念—环境变量
  • 第十二章 Spring MVC 框架扩展和SSM框架整合(2023版本IDEA)
  • js中的全局函数有这些
  • Android SurfaceFlinger——重绘闪烁处理(四十六)
  • 罗马数字转整数 C++
  • Day20_2--介绍同步加载和异步加载
  • sftp做成一个池子
  • 全网最全-Netty从入门到精通
  • C#知识|文件与目录操作:对象的创建、保存、读取
  • 自定义 SwiftUI 中符号图像的外观
  • 循环神经网络和自然语言处理一
  • CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮
  • 20240807 每日AI必读资讯
  • 海外社媒账号如何让防关联?账号隔离的5大要点
  • 下一代 AI 搜索引擎 MindSearch:多智能体 + 系统2,模拟人类认知过程的 AI 搜索引擎