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

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

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

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

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

测试:

最新文章

  1. pycharm 调试 django 应用
  2. 前端性能监控方案window.performance 调研(转)
  3. WINDOWS SERVER 2008 RD服务器搭建
  4. java-装箱/拆箱-字符串转换成基本数据类型
  5. 链剖&amp;LCT总结
  6. silverlight和wpf中暴露 给子类override
  7. canvas绘制
  8. iOS开发--一些UITabBarItem属性的设置[转]
  9. 第三节:卸载AppDomain
  10. JS_CSS_logon_Mask
  11. Linux 命令 - curl: transfer a URL
  12. Linux内存映射(mmap)系列(1)
  13. page-object使用(2)---elements
  14. html网页获取php网页数据等知识记录
  15. node.js 基础知识之 querystring.stringify querystring.escape
  16. Restful API 的设计规范(转)
  17. IDEA取消默认工作区间
  18. 解决ssh连接超时时间(ssh timeout)的设置方法
  19. POJ3177 Redundant Paths【tarjan边双联通分量】
  20. 2.redis设计与实现--链表

热门文章

  1. 爬虫平台设置代理ip
  2. IDEA中将工程打包成war包及部署到Tomcat流程
  3. oracle null+字符串问题
  4. mysql的一些语法
  5. npm install 时 提示err code EINTEGRITY报错
  6. zookeeper常用配置详解
  7. element-UI select 踩过的坑和解决办法
  8. HDU-4747 二分+线段树
  9. 前后端分离进行权限管理之后端API返回菜单及权限信息(三)
  10. 逆向思维——cf1241D