博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 进程间通信 消息队列 实现两个进程间通信
阅读量:5876 次
发布时间:2019-06-19

本文共 2078 字,大约阅读时间需要 6 分钟。

例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据

  文件1 创建进程1 终端输入通过消息队列发送数据

#include 
#include
#include
#include
#include
#include
#include
struct msgbuf //消息结构体{ long types; char msg[20];};struct msgbuf mymsgbuf; //定义消息结构变量int main(int argc, const char *argv[]){ key_t key; int msgid; mymsgbuf.types = 100; //给消息结构赋值 key = ftok("./app",'a'); //建立key值 if(key < 0) { perror("ftok fail "); exit(1); } // 创建消息队列,如果消息队列存在,errno 会提示 eexist // 错误,此时只需要直接打开消息队列即可 msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666); if(msgid < 0) { if(errno == EEXIST) //文件存在错误提示 { msgid = msgget(key,0666);//打开消息队列 } else //其他错误退出 { perror("msgget fail "); exit(1); } } while(1) //循环从终端获取数据,然后通过消息队列发送出去,输入 “quit” 结束循环 { fgets(mymsgbuf.msg, 10, stdin); //终端获取消息写入消息队列中 //发送消息 msgsnd(msgid, &mymsgbuf, sizeof(mymsgbuf)-sizeof(long),0); if(strstr(mymsgbuf.msg, "quit")!=NULL) { break; } } //删除消息队列 msgctl(msgid, IPC_RMID, NULL); return 0;}

文件 2 创建进程2 ,接收消息队列的数据,打印到终端上

#include 
#include
#include
#include
#include
#include
#include
struct msgbuf //消息结构体{ long types; char b[20];};struct msgbuf mymsgbuf, recvbuf; //定义消息结构变量int main(int argc, const char *argv[]){ key_t key; int msgid; mymsgbuf.types = 100; //给消息结构赋值 key = ftok("./app",'a'); //建立key值 if(key < 0) { perror("ftok fail "); exit(1); } // 创建消息队列,如果消息队列存在,errno 会提示 eexist // 错误,此时只需要直接打开消息队列即可 msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666); if(msgid < 0) { if(errno == EEXIST) //文件存在错误提示 { msgid = msgget(key,0666);//打开消息队列 } else //其他错误退出 { perror("msgget fail "); exit(1); } } while(1) //接收到 “quit” 结束循环 { //接收消息 msgrcv(msgid,&recvbuf,sizeof(mymsgbuf)-sizeof(long),100,0); //recvbuf 是接收消息的结构体,其中的b是实际的数据 if(strstr(recvbuf.b, "quit") != NULL) { break; } printf("recvbuf: %s", recvbuf.b); // } //删除消息队列 msgctl(msgid, IPC_RMID, NULL); return 0;}

测试:

 

转载于:https://www.cnblogs.com/electronic/p/10946501.html

你可能感兴趣的文章
[日常] 算法-单链表的创建
查看>>
前端工程化系列[01]-Bower包管理工具的使用
查看>>
使用 maven 自动将源码打包并发布
查看>>
Spark:求出分组内的TopN
查看>>
Python爬取豆瓣《复仇者联盟3》评论并生成乖萌的格鲁特
查看>>
关于跨DB增量(增、改)同步两张表的数据小技巧
查看>>
飞秋无法显示局域网好友
查看>>
学员会诊之03:你那惨不忍睹的三层架构
查看>>
vue-04-组件
查看>>
Golang协程与通道整理
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
js - object.assign 以及浅、深拷贝
查看>>
python mysql Connect Pool mysql连接池 (201
查看>>
Boost在vs2010下的配置
查看>>
android camera(四):camera 驱动 GT2005
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>