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下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
随机推荐
- luogu2569 [SCOI2010]股票交易
题解看这里 #include <iostream> #include <cstring> #include <cstdio> using namespace std ...
- Objective-c 实例变量的访问级别
在C#和JAVA中无论是method还是variable都有严格的访问级别控制,那么在object-c中对访问级别的使用非常稀少,原因可能是因为在method上没有访问级别的语法,单单控制变量没有什么 ...
- WordPress 编辑器没有可视化
第一次安装wordpress后出现文章编辑器只有一行按钮的问题,即使我安装了其他的编辑插件也是一样只有一行, 解决方法: 原来是再Users->All Users 中勾选了Disable the ...
- 【LeetCode】To Lower Case(转换成小写字母)
这道题是LeetCode里的第709道题. 题目要求: 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: ...
- [android开发篇] android apidemo 学习网址
http://www.2cto.com/special/ApiDemos/ApiDemos/type-160-10.html
- soa服务治理
SOA服务治理 文章:SOA 治理简介 文章:中小型互联网公司微服务实践-经验和教训
- POJ 1887 Testing the CATCHER
Testing the CATCHER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13396 Accepted: 4 ...
- BZOJ 1974 [Sdoi2010]auction 代码拍卖会 ——动态规划
把每一位上不递减的数拆成1+11+11111+11111+..... 然后就可以把巨大的N从复杂度中消掉,因为随着长度的增加1...111%p出现了循环节. 然后就是从n个数中选出几个使他们结果为0( ...
- Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】
大水题,真不知道出题者是怎么把这么水的题出的这么长的TAT 其实这题在于考语文水平,一共三个要求,前两个要求意思就是要选出的道路是树形的,最后一个要求就是要权值最小,于是整个题意说白了就是求一棵MST ...
- essential c++ 随笔
编写一个C++程序: vector初始化两种方法: vector<int>elem_seq(seq_size); elem_seq[0]=1 elem_seq[1]=2; 另一种方法则是利 ...