Linux 进程间通信 消息队列 实现两个进程间通信
例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据
文件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 ;
}
测试:
Linux 进程间通信 消息队列 实现两个进程间通信的更多相关文章
- PHP 进程间通信——消息队列(msg_queue)
PHP 进程间通信--消息队列 本文不涉及PHP基础库安装.详细安装说明,请参考官网,或期待后续博客分享. 1.消息队列函数准备 <?php//生成一个消息队列的key$msg_key = ft ...
- Linux进程间通信-消息队列(mqueue)
前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点. 1.消息队列 消息队列的实现分为两种,一种为System V的消息队列,一种是P ...
- Linux下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
- Linux进程间通信—消息队列
四.消息队列(Message Queue) 消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息.Linux维护了一个消息队列向量表:msgque,来表示系统中所有的 ...
- 详解linux进程间通信-消息队列
前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...
- linux进程间通信-消息队列
一 消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构. 我们可以通过发送消息来避免命名管道的 ...
- linux进程间通信消息队列:msgsnd: Invalid argument
今天写了个消息队列的小测试程序结果send端程序总是出现:msgsnd: Invalid argument,搞了半个小时也没搞明白,后来查资料发现我将(st_msg_buf.msg_type = 0; ...
- Linux 进程间通信 消息队列
1.特点: 消息队列是IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表.用户可以在消息队列中添加消息.读取消息等. 消息队列可以按照类型来发送/接收消息(消息的类型是正整 ...
- 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义
最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...
随机推荐
- opensns学习
根据ThinkPHP官方文档学习opensns框架 主要看了下opensns所用的单一入口模式的意义. 基础 opensns目录结构 index.php 入口文件 Application 应用目录(含 ...
- 百度地图errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败
最近要维护以前师兄的一个android项目,里面用到了百度地图,在我的机器上按照官网的方式获取的SHA1签名+包名申请ak: 然而就是报errorcode: 230 uid: -1 appid -1 ...
- OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW
最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...
- MySQL数据库企业级应用实践(主从复制)
MySQL数据库企业级应用实践(主从复制) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机App ...
- sql中char,varchar,nvarchar的区别
char[n] 是定长的,也就是当存储字符小于n时,他会自动补齐(补空值).优点:效率较varchar高. varchar[n]是变长且非unicode字符数据类型,n的取值在1到8000之间,该类型 ...
- 【学术篇】NOI2015 品酒大会 后缀数组+并查集
省选前大致是刷不了几道题了... 所以就找一些裸一点的题目练练板子算了= = 然而这题一点都不裸, 也并不怎么好写... 于是就浪费了将近一下午的时间... 然而还不是因为后缀数组板子不熟= = 首先 ...
- Dubbox服务的消费方开发
开发步骤: (1)创建Maven工程(WAR)dubboxdemo-web ,在pom.xml引入依赖 ,同“dubboxdemo-service”工程.区别就是把tomcat插件的运行端口改为808 ...
- Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?
HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...
- KindEditor在eclipse里的配置方法
KindEditor介绍: kindEditor是一款国产富文本编辑器,类似fckeditor和目前比较流行的百度Ueditor.其产品官方网站为http://kindeditor.net/ Kind ...
- hdu 3450 后缀数组
题目大意: 求多个字符串的最长公共子串 基本思路: 参加我的博客hdu2774 代码如下: #include<cstdio> #include<cstring> using n ...