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

进程:消息队列

使用消息队列实现两个进程的相互通信

进程1:

#include <myhead.h>
//定义消息结构体
typedef struct
{long mtype; 	//消息类型char mtext[1024]; 	//消息正文
}msgbuf;#define MSGSZ (sizeof(msgbuf) - sizeof(long))int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("./",'0');if(key == -1){perror("ftok error");return -1;}//创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if( msgid == -1 ){perror("msgget error");return -1;}//创建2个进程pid_t pid = fork();msgbuf sbuf,rbuf;//当前进程用于发送消息if(pid > 0){while(1){//printf("发送消息的类型>>>");//scanf("%ld",&sbuf.mtype);//getchar(); 							//吸收回车sbuf.mtype = 1; 						//本进程发送消息的类型为1//printf("%ld\n",sbuf.mtype);//printf("发送消息的正文>>>");fgets(sbuf.mtext , MSGSZ , stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = '\0'; 	//将回车置为0msgsnd(msgid , &sbuf ,MSGSZ , 0); 	//发送消息的正文//printf("发送成功\n");if( strcmp(sbuf.mtext,"quit") == 0 ) 	//结束循环{break;}}}//子进程用于接收消息else if(pid == 0){while(1){rbuf.mtype = 2; 						//本进程接收消息的类型msgrcv(msgid , &rbuf , MSGSZ , rbuf.mtype ,0); 	//接收信息printf("张三:%s\n",rbuf.mtext);if(strcmp(rbuf.mtext,"quit") == 0) 	//结束循环{break;}}//删除消息队列if( msgctl(msgid,IPC_RMID,NULL) == -1){perror("msgctl error");return -1;}exit(EXIT_SUCCESS); 	//退出进程}else{perror("fork error");return -1;}wait(NULL); 	//回收子进程资源	return 0;
}

进程2:

#include <myhead.h>
//定义消息结构体
typedef struct
{long mtype; 	//消息类型char mtext[1024]; 	//消息正文
}msgbuf;#define MSGSZ (sizeof(msgbuf) - sizeof(long))int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("./",'0');if(key == -1){perror("ftok error");return -1;}//创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if( msgid == -1 ){perror("msgget error");return -1;}//创建2个进程pid_t pid = fork();msgbuf sbuf,rbuf;//当前进程用于发送消息if(pid > 0){while(1){//printf("发送消息的类型>>>");//scanf("%ld",&sbuf.mtype);//getchar(); 							//吸收回车sbuf.mtype = 2; 						//本进程发送的消息类型//printf("%ld\n",sbuf.mtype);//printf("发送消息的正文>>>");fgets(sbuf.mtext , MSGSZ , stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = '\0'; 	//将回车置为0msgsnd(msgid , &sbuf ,MSGSZ , 0); 	//发送消息的正文//printf("发送成功\n");if( strcmp(sbuf.mtext,"quit") == 0 ) 	//结束循环{break;}}}//子进程用于接收消息else if(pid == 0){while(1){rbuf.mtype = 1;msgrcv(msgid , &rbuf , MSGSZ , rbuf.mtype ,0); 	//接收信息printf("李四:%s\n",rbuf.mtext);if(strcmp(rbuf.mtext,"quit") == 0) 	//结束循环{break;}}exit(EXIT_SUCCESS); 	//退出进程}else{perror("fork error");return -1;}wait(NULL); 	//回收进程资源return 0;
}

思维导图:


http://www.mrgr.cn/news/55587.html

相关文章:

  • Linux下进程通信原理图(详细)总结附实例代码快速掌握
  • T3矩阵看功率
  • MySQL备份和还原,用mysqldump、mysql和source命令来完成
  • 学习eNSP对提升就业竞争力有多大帮助?
  • Android应用性能优化的方法
  • Wasm解析入口分析
  • 用ESP32驱动stt7735 TFT屏幕
  • 1-2.Python 引入 - 变量(变量定义、变量命名、动态类型)
  • System:oneshot类型的service
  • 多ip访问多网站
  • 数据库权限提升GetShell
  • 配置Typescript环境
  • 虚拟滚动列表如何实现?
  • “第15代”英特尔CPU来袭!命名全面变更,速览
  • 为什么软件维护成本比软件的开发成本高?
  • Vue学习记录之十八 Vue3集成tailwindcss
  • 深入理解Python函数
  • Unity 同项目多开
  • ES2017 新特性 (Async和await)
  • Linux -- 进程间通信、初识匿名管道
  • 企业注销后微信商户平台账号注销商户主体的详细操作流程及解答
  • Grid Designer 网格设计师
  • Yolo目标检测:Yolo v1简介
  • tftpd.exe源代码分析第一篇get 2.txt
  • 头歌——人工智能(启发式搜索算法)
  • Linux安装Python解释器