进程间通信 骑猪看日落 2022-06-03 00:39 341阅读 0赞 **实现父子进程间的通信** **介绍: 1 .以结构体为传输目标 ,先定义一个枚举类型存放消息类型,定义一个结构体 存放消息类型和该消息类型的结构体的大小,定义不同消息类型的消息的结构体** ** 父进程写入消息,子进程读取消息 ** ** 2 .创建管道 父子进程,公有三个文件 pipe\_main.c main函数文件 创建管道的 子父进程 pipe\_mes.h 文件 枚举的定义 结构体的定义 各种函数的声明** **pipe\_mes.c 函数的实现** **具体代码段;** **pipe\_main.c: ** #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include "pipe_mes.h" int main(int argc,char** argv) { int fd[2]; int pipe_result; if(pipe_result = pipe(fd)); if(pipe_result == -1) { printf("管道创建失败!\n"); exit(errno); } pid_t child_pid; child_pid = fork(); if(child_pid < 0){ printf("创建子进程失败!\n"); exit(errno); } else if(child_pid == 0){ //进入子进程 并接受来自父进程的消息 解析并打印 close(fd[1]); int i; for(i = 0; i < 3; i++) { HMessage hm = (HMessage) malloc (sizeof(Message)); read(fd[0],hm,sizeof(Message)); switch(hm->msg_kind) { case Type_1: { HMES_ONE M_ONE = ReadMes_ONE(fd[0],hm); printf("接收来自Type_1的消息: %d\n",M_ONE->num); } break; case Type_2: { HMES_TWO M_TWO = ReadMes_TWO(fd[0],hm); printf("接收来自Type_2的消息: %s\n",M_TWO->str); } break; case Type_3: { HMES_THREE M_THREE = ReadMes_THREE(fd[0],hm); printf("接收来自Type_3的消息:%d\t%s\n",M_THREE->num,M_THREE->str); } break; default: printf("不识别的消息类型.......请检查!\n"); break; } } _exit(0); } close(fd[0]); //调用发送消息函数 SendMes_ONE(fd[1],2017); SendMes_TWO(fd[1],"结束了!"); SendMes_THREE(fd[1],2018,"开始了"); return 0; } **pipe\_mes.h** #ifndef __MESSAGE_H__ #define __MESSAGE_H__ //消息类型 typedef enum KIND{ Type_1,Type_2,Type_3 }Msg_kind; //Message 是所有消息的共同首部 typedef struct Message{ Msg_kind msg_kind; size_t size; }Message,*HMessage; //消息 ONE typedef struct TMessage_1{ Message base; int num; }MES_ONE,*HMES_ONE; //消息 TWO typedef struct TMessage_2{ Message base; char str[1024]; }MES_TWO,*HMES_TWO; //消息 THREE typedef struct TMessage_THREE{ Message base; int num; char str[1024]; }MES_THREE,*HMES_THREE; //消息 ONE 接收和发送函数 HMES_ONE ReadMes_ONE(int in,HMessage hm); size_t SendMes_ONE(int out,int num); //消息 TWO 接受和发送 HMES_TWO ReadMes_TWO(int in,HMessage hm); size_t SendMes_TWO(int out,char* str); //消息 THREE 接受和发送 HMES_THREE ReadMes_THREE(int in,HMessage hm); size_t SendMes_THREE(int out,int num,char *str); #endif **pipe\_mes.c** #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include "pipe_mes.h" //消息 Type_1 size_t SendMes_ONE(int out,int num) { HMES_ONE Mes_One = (HMES_ONE) malloc (sizeof(MES_ONE)); Mes_One->base.msg_kind = Type_1; Mes_One->base.size = sizeof(MES_ONE); Mes_One->num = num; return write(out,(char*)Mes_One,Mes_One->base.size); } HMES_ONE ReadMes_ONE(int in,HMessage HMES) { HMES_ONE Mes_One = (HMES_ONE) malloc (sizeof(MES_ONE)); memcpy(Mes_One,HMES,sizeof(Message)); read(in,(char*)Mes_One + sizeof(Message),sizeof(MES_ONE) - sizeof(Message)); return Mes_One; } //消息 Type_2 size_t SendMes_TWO(int out,char* str) { HMES_TWO Mes_Two = (HMES_TWO) malloc (sizeof(MES_TWO) + strlen(str)); Mes_Two->base.msg_kind = Type_2; Mes_Two->base.size = sizeof(MES_TWO) + strlen(str); memcpy(Mes_Two->str,str,strlen(str) + 1); return write(out,(char*)Mes_Two,Mes_Two->base.size); } HMES_TWO ReadMes_TWO(int in,HMessage HMES) { HMES_TWO Mes_Two = (HMES_TWO) malloc (HMES->size); memcpy(Mes_Two,HMES,sizeof(Message)); read(in,Mes_Two->str,HMES->size - sizeof(Message)); return Mes_Two; } //消息 Type_3 size_t SendMes_THREE(int out,int num,char* str) { HMES_THREE Mes_Three = (HMES_THREE) malloc (sizeof(MES_THREE) + strlen(str)); Mes_Three->base.msg_kind = Type_3; Mes_Three->base.size = sizeof(MES_THREE) + strlen(str); Mes_Three->num = num; memcpy(Mes_Three->str,str,strlen(str) + 1); return write(out,(char *)Mes_Three,Mes_Three->base.size); } HMES_THREE ReadMes_THREE(int in,HMessage HMES) { HMES_THREE Mes_Three = (HMES_THREE) malloc (HMES->size); memcpy(Mes_Three,HMES,sizeof(Message)); read(in,(char*)Mes_Three + sizeof(Message),sizeof(MES_THREE) - sizeof(Message)); return Mes_Three; } **运行截图:** ![Center][] 如有错误和疑问 可通过QQ2120397197 交流 [Center]: /images/20220603/29ac0ff7645848899f134ebb36faaf97.png
相关 进程间通信 管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道“我们之前说进程间通信的本质是让不同的进程看到同一份资源,管道就是其中... 一时失言乱红尘/ 2024年04月25日 20:18/ 0 赞/ 119 阅读
相关 进程间通信 1 引言 \---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口 迷南。/ 2024年02月18日 23:52/ 0 赞/ 80 阅读
相关 进程间通信 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号 以你之姓@/ 2024年02月18日 20:08/ 0 赞/ 88 阅读
相关 进程间通信 二、进程间通信方式 线程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的 阳光穿透心脏的1/2处/ 2023年10月17日 15:41/ 0 赞/ 24 阅读
相关 进程间通信 进程间通信(IPC,Inter-Process Communication),是指两个或两个以上的进程之间传递数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位,每 ゞ 浴缸里的玫瑰/ 2023年01月02日 15:24/ 0 赞/ 193 阅读
相关 进程间通信 进程间通信的基本概念 进程间通信意味着两个不同进程间可以交换数据,操作系统中应提供两个进程可以同时访问的内存空间。 通过管道实现进程间通信 基于管道(P 港控/mmm°/ 2022年05月25日 09:42/ 0 赞/ 389 阅读
相关 进程间通信 程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(inte 谁践踏了优雅/ 2022年01月16日 14:09/ 0 赞/ 399 阅读
相关 进程间通信 转载自:[http://songlee24.github.io/2015/04/21/linux-IPC/][http_songlee24.github.io_2015_04_ 不念不忘少年蓝@/ 2021年09月23日 04:10/ 0 赞/ 528 阅读
相关 进程间通信 进程间通信 1. 前言 2. 使用文件实现进程间的通信 3. 使用管道实现进程间的通信 4. 共享内存 5. 以上三种通信方式的区别 青旅半醒/ 2021年08月30日 22:05/ 0 赞/ 547 阅读
还没有评论,来说两句吧...