linux进程间通信消息队列:msgsnd: Invalid argument
今天写了个消息队列的小测试程序结果send端程序总是出现:msgsnd: Invalid argument,搞了半个小时也没搞明白,后来查资料发现我将(st_msg_buf.msg_type = 0; //设置消息类型)设置为0了,原来0表示是任意类型的消息,只有recv端才可以设置为0表示:可以接受任意类型消息。
代码:
发送端源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h> #include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h> #define MAX_TEXT 512
#define BUF_SIZE 512 struct my_msg_st{ //临时消息结构 int msg_type;
char msg_text[MAX_TEXT]; //自定义存储空间大小
}; int main()
{
key_t key;
int running = ;
struct my_msg_st st_msg_buf;
int msgid;
char buffer[BUF_SIZE];
memset(&st_msg_buf, , sizeof(st_msg_buf));
memset(buffer, , sizeof(buffer)); //创建键值
if((key = ftok("./", )) == -){
perror("ftok");
exit();
}
printf("key : %#x\n", key); //创建信息队列
if((msgid = msgget(key, | IPC_CREAT)) == -){
perror("msgget");
exit();
}
printf("Enter the messge to send:"); //发送消息
while(running)
{
fgets(buffer, BUF_SIZE, stdin);//读取输入的消息
if(buffer[] == '\0' || buffer[] == '\n')
continue;
buffer[strlen(buffer) - ] = '\0';//去回车符
st_msg_buf.msg_type = ; //设置消息类型
strcpy(st_msg_buf.msg_text, buffer);//复制消息 printf("message have send to\n");
if(msgsnd(msgid, (void *)&st_msg_buf, MAX_TEXT, ) < ){
perror("msgsnd");
exit();
} if(strncmp(buffer, "end", ) == )//判断是否为退出结束消息
running = ; } return ;
}
接收端源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h> #include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h> #define MAX_TEXT 512
#define BUF_SIZE 512 struct my_msg_st{ //临时消息结构 int msg_type;
char msg_text[MAX_TEXT]; //自定义存储空间大小
}; int main()
{
key_t key;
int running = , size = ;
struct my_msg_st st_msg_buf;
int msgid;
int msg_to_receiver = ;
memset(&st_msg_buf, , sizeof(st_msg_buf)); //创建键值
if((key = ftok("./", )) == -){
perror("ftok");
exit();
}
printf("key : %#x\n", key); //创建信息队列
if((msgid = msgget(key, | IPC_CREAT)) == -){
perror("msgget");
exit();
} //接受消息
while(running)
{
if((size = msgrcv(msgid, (void *)&st_msg_buf,
MAX_TEXT, msg_to_receiver,)) < ){
perror("msgsnd");
exit();
} printf("receiver mssage: %d, %s\n", size, st_msg_buf.msg_text); if(strncmp(st_msg_buf.msg_text, "end", ) == )
running = ;
} if(msgctl(msgid, IPC_RMID, ) < ){
perror("msgctl");
exit();
} return ;
}
linux进程间通信消息队列:msgsnd: Invalid argument的更多相关文章
- 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义
最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...
- 详解linux进程间通信-消息队列
前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...
- Linux进程间通信—消息队列
四.消息队列(Message Queue) 消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息.Linux维护了一个消息队列向量表:msgque,来表示系统中所有的 ...
- linux进程间通信-消息队列
一 消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构. 我们可以通过发送消息来避免命名管道的 ...
- Linux进程间通信-消息队列(mqueue)
前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点. 1.消息队列 消息队列的实现分为两种,一种为System V的消息队列,一种是P ...
- Linux 进程间通信 消息队列 实现两个进程间通信
例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据 文件1 创建进程1 终端输入通过消息队列发送数据 #include <stdio ...
- Linux 进程间通信 消息队列
1.特点: 消息队列是IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表.用户可以在消息队列中添加消息.读取消息等. 消息队列可以按照类型来发送/接收消息(消息的类型是正整 ...
- PHP 进程间通信——消息队列(msg_queue)
PHP 进程间通信--消息队列 本文不涉及PHP基础库安装.详细安装说明,请参考官网,或期待后续博客分享. 1.消息队列函数准备 <?php//生成一个消息队列的key$msg_key = ft ...
- Linux下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
随机推荐
- 【编程工具】Sublime Text3 之 Emmet 插件的详细使用的方法
这篇关于 Emmet 插件使用的博文之前就想写了,今天刚好闲暇时间,就花了一些时间进行了总结. 我们都这道 Emmet 这款插件在前端设计里被称为神器,确实,神器称号名不虚传.因为这款插件可以帮助我们 ...
- Leetcode 388.文件的最长绝对路径
文件的最长绝对路径 假设我们以下述方式将我们的文件系统抽象成一个字符串: 字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示: dir ...
- J2EE 中间件 JVM 集群
[转]J2EE 中间件 JVM 集群 博客分类: 企业应用面临的问题 Java&Socket 开源组件的应用 jvm应用服务器weblogicjvm集群 1 前言 越来越多的关键任务和大型应用 ...
- 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)
题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...
- 怎么创建SpringBoot项目
上述中讲到了怎么创建SpringBoot项目,那么现在就来介绍下SpringBoot配置文件的两种格式yml和properties 首先呢发上一份application.properties 在放上一 ...
- POJ 1860: Currency Exchange 【SPFA】
套汇问题,从源点做SPFA,如果有一个点入队次数大于v次(v表示点的个数)则图中存在负权回路,能够套汇,如果不存在负权回路,则判断下源点到自身的最长路是否大于自身,使用SPFA时松弛操作需要做调整 # ...
- uva 10692 高次幂取模
Huge Mod Input: standard input Output: standard output Time Limit: 1 second The operator for exponen ...
- ElasticSearch中辅助API常用用法详解
本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...
- ReSharper7.1.25.234 注册机
经常用vs做开发的人都知道,ReSharper是vistual studio必备插件之一.他的智能提示,智能感知,.net底层方法查看,测试等都非常方便,给程序员带来了巨大的效率. 但众所周知ReSh ...
- MongoDB GridFS(命令行+php操作)
一.GridFS是什么 & 为什么需要它 我们知道目前MongoDB的BSON文件最大只能是16M,也就是说单个文档最多只能存储16M的数据,那么如果需要MongoDB存储超过16M的大文件该 ...