目录

简述

代码

编译

运行


简述

消息队列是Linux进程间通信方式之一,消息队列一般是用于简单的通信,数据量不大,通信不频繁的情况。如果交互频繁或者数据量大就不适合了。

代码

下面直接上代码,发送端代码:

//file name: msg_test.c

#include "msg_test.h"

//创建消息队列
int Creat_msg(char *path, int id)
{
key_t key;
int msg_id;
puts(path);
if ((key = ftok(path, id)) == -1)
{
perror("ftok");
exit(-1);
}
else
{
printf("key = %d\n", key);
} if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
}
else
{
printf("msg_id = %d\n", msg_id);
}
return msg_id;
}
struct msg
{
long type;
char buf[256+1];
};
int
main(int argc, char **argv)
{
int msgid = 0;
int ret = 0;
struct msg_struct msg_buf;
struct msg buf1;
bzero(&msg_buf, sizeof(msg_buf)); if(argc != 3)
{
printf("Usag: ./%s path id\n", argv[0]);
return 0;
} printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
msgid = Creat_msg(argv[1], atoi(argv[2]));
printf("msgid = %d\n", msgid); buf1.type = 0x32;
#if 1
while(1)
{
ret = msgsnd(msgid, (void *)&buf1, 256, 0); //最后一个参数IPC_NOWAIT可以设置非阻塞
//perror("msgrecv");
printf("ret = %d, errno = %d\n", ret, errno);
if(ret < 0 )
{
printf("get ENOMSG\n");
return 0;
}
usleep(2000);
}
#endif
if(msgctl(msgid, IPC_RMID, NULL)< 0)
{
perror("");
}
else
printf("rm OK!");
return 0;
}

接收端代码:

//file name: msg_test.c

#include "msg_test.h"

//创建消息队列
int Creat_msg(char *path, int id)
{
key_t key;
int msg_id;
puts(path);
if ((key = ftok(path, id)) == -1)
{
perror("ftok");
exit(-1);
}
else
{
printf("key = %d\n", key);
} if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
}
else
{
printf("msg_id = %d\n", msg_id);
}
return msg_id;
}
struct msg
{
long type;
char buf[256+1];
};
int
main(int argc, char **argv)
{
int msgid = 0;
int ret = 0;
struct msg_struct msg_buf;
struct msg buf1;
bzero(&msg_buf, sizeof(msg_buf)); if(argc != 3)
{
printf("Usag: ./%s path id\n", argv[0]);
return 0;
}
printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
msgid = Creat_msg(argv[1], atoi(argv[2]));
printf("msgid = %d\n", msgid); #if 1
while(1)
{
ret = msgrcv(msgid, (void *)&buf1, 256, 0x32, 0); //最后一个参数使用IPC_NOWAIT可以设置非阻塞
//perror("msgrecv");
printf("ret = %d, errno = %d\n", ret, errno);
if(ret < 0 )
{
printf("get ENOMSG\n");
return 0;
}
}
#endif
if(msgctl(msgid, IPC_RMID, NULL)< 0)
{
perror("");
}
else
printf("rm OK!");
return 0;
}

编译

gcc msg_send.c  -o msg_send
gcc msg_test.c -o msg_recv

运行

接收端:
./msg_recv /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 256, errno = 0 //接收到数据
ret = 256, errno = 0 发送端:
./msg_send /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 0, errno = 0 //发送成功
ret = 0, errno = 0

Linux系统之《消息队列》入手应用的更多相关文章

  1. (转)Linux环境进程间通信----系统 V 消息队列列

    转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...

  2. [转]Linux进程间通信——使用消息队列

    点击此处阅读原文 另收藏作者ljianhui的专栏初学Linux 下面来说说如何使用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linu ...

  3. 练习--LINUX进程间通信之消息队列MSG

    https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队 ...

  4. Linux进程间通信——使用消息队列

    下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道   一.什么是消息队列 消息队列提 ...

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

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

  6. Linux环境进程间通信----系统 V 消息队列(二)

    一.消息队列是一条由消息连接而成的链表,它保存在内核中,通过消息队列的引用标示符来访问. 二.消息队列不同于管道,通信的两个进程可以是完全无关的进程,它们之间不需要约定同步的方法.只要消息队列存在并且 ...

  7. linux 进程间消息队列通讯

    转自:http://blog.csdn.net/lifan5/article/details/7588529 http://www.cnblogs.com/kunhu/p/3608589.html 前 ...

  8. linux编程之消息队列

    消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式 从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息 ...

  9. Linux进程间通信(二) - 消息队列

    消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点(管道请查阅我的另一篇文章 ...

  10. Linux进程间通信之消息队列

    本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...

随机推荐

  1. www.215wd.com

    www.215wd.com 传奇销售系统 QQ:1479528000

  2. JVM 专题三:类加载子系统(一)类装载器子系统

    类装载器子系统 1.1 什么是类装载子系统? 类装载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识(魔数). 类装载器子系统(ClassLoader)只负 ...

  3. java IO流 (五) 转换流的使用 以及编码集

    转换流的使用 1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWr ...

  4. PHP提示dyld: Library not loaded问题解决

    Mac在命令行执行php命令时,如php -v 有错误提示: dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0..d ...

  5. Harbor打怪升级

    目录 一.目标 二.V1.4升级至V1.6 三.V1.6升级至V1.9 四.V1.9升级至V2.0 五.写在最后 一.目标 Harbor V1.4版本升级至V2.0 注: Harbor升级需要注意的是 ...

  6. T4 分配时间 题解

    问题描述 小王参加的考试是几门科目的试卷放在一起考,一共给 t 分钟来做.他现在已经知道每 门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己的名字很慢)请帮他 算一下他最高能得几分.总分 ...

  7. ant design pro/前端/JS:实现本地运行https

    工具:github---mkcert 用于生成本地证书 ant p版本:1.0.0 这里我只说如何给antp部署https,以及会遇到的问题解决,其他请看原文参考 1.用mkcert生成证书,去git ...

  8. blog only to u

    2020/7/16 属于我的第一个博客正式上线,以后我将在此更新我的笔记和我的知识积累还有我那阔爱的小仙女!

  9. NoSQL和SQL怎么选用?

    NoSQL 有分很多种,其中key-value NoSQL (Redis, MemcacheD, etc) 的选用相对比较清楚些,大多是当后端Data storage的cache层来用.这篇主要想请教 ...

  10. VS Code小白使用教程

    本文来自作者:你不知道的巨蟹 原文链接 https://www.cnblogs.com/tu-0718/p/10935910.html,如有侵权,则可删除. 前言 现在使用Vscode编码的人越来越多 ...