今天写了个消息队列的小测试程序结果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的更多相关文章

  1. 进程间通信消息队列msgsnd执行:Invlid argument——万恶的经验主义

    最近在搞进程间通信,首先在我的ubuntu 14.04上写了接口和测试demo,编译和执行都OK,,代码如下: 接口文件ipcmsg.h /* ipcmsg.h */ #ifndef H_MSGIPC ...

  2. 详解linux进程间通信-消息队列

    前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...

  3. Linux进程间通信—消息队列

    四.消息队列(Message Queue) 消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息.Linux维护了一个消息队列向量表:msgque,来表示系统中所有的 ...

  4. linux进程间通信-消息队列

    一 消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构. 我们可以通过发送消息来避免命名管道的 ...

  5. Linux进程间通信-消息队列(mqueue)

    前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点. 1.消息队列 消息队列的实现分为两种,一种为System V的消息队列,一种是P ...

  6. Linux 进程间通信 消息队列 实现两个进程间通信

    例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据 文件1 创建进程1 终端输入通过消息队列发送数据 #include <stdio ...

  7. Linux 进程间通信 消息队列

    1.特点: 消息队列是IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表.用户可以在消息队列中添加消息.读取消息等. 消息队列可以按照类型来发送/接收消息(消息的类型是正整 ...

  8. PHP 进程间通信——消息队列(msg_queue)

    PHP 进程间通信--消息队列 本文不涉及PHP基础库安装.详细安装说明,请参考官网,或期待后续博客分享. 1.消息队列函数准备 <?php//生成一个消息队列的key$msg_key = ft ...

  9. Linux下进程间通信--消息队列

    消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...

随机推荐

  1. 【转载】linux之sed用法

    linux之sed用法 原文地址:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html   sed是一个很好的文件处理工具 ...

  2. [android开发篇]项目目录结构

  3. shell的case-esac

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  4. P1651 塔 (动态规划)

    题目描述 小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块.每个木块只能用一次,也可以不用 ...

  5. Java面试题集(二)

    51.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序.  以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题. public class ThreadTest1 ...

  6. 使用plantuml生成uml图

    主要包括以下三步: 一.到http://plantuml.com/download 下载plantuml.jar ,我将这个软件放置到home的/home/munication/WORKM/Progr ...

  7. list或map 打印成json 方便调试

    private final Logger logger = Logger.getLogger(this.getClass()); logger.info(JSON.toJSONStringWithDa ...

  8. Spring 3.0 注解

    原文 :http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html 另两 参考博客 : http://kingtai168.iteye. ...

  9. AC日记——[SDOI2009]晨跑 bzoj 1877

    1877: [SDOI2009]晨跑 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2131  Solved: 1142[Submit][Status][ ...

  10. nyoj_90_整数划分_201403161553

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正整数 ...