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下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
随机推荐
- luogu2051 [AHOI2009]中国象棋
巨水,调了好久,心态爆炸 #include <iostream> #include <cstring> #include <cstdio> using namesp ...
- C语言的那些秘密之---函数返回局部变量[转]
来源:http://blog.csdn.net/haiwil/article/details/6691854/ 一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部 ...
- .NET重构(五):存储过程、触发器和函数的区别
导读:在触发器的学习过程中,师傅讲了它的耦合性高,建议我能用存储过程,那到底什么是存储过程呢,自己也不是特别了解,还有就是,触发器也算是一种特殊的存储过程,为什么就不建议多用呢?接下来,就谈谈触发器. ...
- POJ 3693 Maximum repetition substring ——后缀数组
重复次数最多的字串,我们可以枚举循环节的长度. 然后正反两次LCP,然后发现如果长度%L有剩余的情况时,答案是在一个区间内的. 所以需要找到区间内最小的rk值. 两个后缀数组,四个ST表,$\Thet ...
- 论文笔记:Ten years of pedestrian detection, what have we learned?
最近正在研究行人检测,学习了一篇2014年发表在ECCV上的一篇综述性的文章,是对行人检测过去十年的一个回顾,从dataset,main approaches的角度分析了近10年的40多篇论文提出的方 ...
- P1754 球迷购票问题 (卡特兰数,递推)
题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...
- Spring-IOC源码解读2.3-BeanDefinition的注册
在DefaultListAbleBeanFactory中通过一个HashMap持有载入的BeanDefinition信息 ,这个HashMap的定义在DefaultListAbleBeanFactor ...
- git提交之后没有push,代码被覆盖之后恢复
git reflog 通过这个看commit id git reset [commit id] --hard 有时候要删除一个index.lock文件.
- Numpy 布尔型数组
一 给定一个列表,返回大于10的元素. 在python中,有两种方法.一种方法是循环遍历,第二种方法是使用内置函数filter() 在数组中,有更为简单的方法.即布尔型索引 布尔型索引: 将同样大小 ...
- 洛谷 [P2148] E&G
SG函数的应用 首先每一组都是独立的,所以我们可以求出每一组的SG值异或出来. 那么怎么求每一组的SG值呢,网上的题解都是打表找规律,但其实这个规律是可以证明的 先看规律: x为奇数,y为奇数:SG= ...