消息队列
--消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法
--每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值
--消息队列也有管道一样的不足,就是每个消息的最大长度是由上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)
消息大小的三大限制
cat /proc/sys/kernel/msgmax --最大消息的长度限制()
cat /proc/sys/kernel/msgmnb --消息队列总的字节数()
cat /proc/sys/kernel/msgmni --消息队列的条目数()
删除消息队列命令
--ipcrm msg msqid (注意是msg不是msq)
--ipcrm -q msqid
--注意:当msqid大于0时,这两个命令都可以释放消息队列,但是当msqid=0时(msqid=0这种情况很罕见),ipcrm msg msqid会报错
megget()函数
int msgget(key_t key, int msgflg);
--功能:用来创建和访问一个消息队列
--参数
key 某个消息队列的名字
msgflg 由九个权限标志构成,他们的用法和创建文件时使用的model模式标志是一样的
详解:这实际上是一个字变量,int类型有32位,前面9位用来标识读写权限(rwxr--r--)
--成功返回一个非负整数,失败返回-,并且更新errno

//消息队列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> int main(int arg, char * args[])
{
/*以可读可写方式打开消息队列,文件必须要存在,如果消息队列不存在,errno=ENOENT*/
//int msgid=msgget(0x1234,0666);
/*如果消息队列存在,使用现有消息队列,不存在该key值的消息队列,创建消息队列*/
//int msgid=msgget(0x1234,0666|IPC_CREAT);
/*如果没有该key值的消息队列,则创建消息队列,如果存在该消息队列,则报错提示文件已存在
* 一般用于判断消息队列是否存在(防止用户使用该key值的消息队列的新内容覆盖原有内容)
* IPC_EXCL单独使用没有效果,必须和IPC_CREAT一起使用
* */
//int msgid = msgget(0x1234, 0666 | IPC_CREAT | IPC_EXCL);
/*IPC_PRIVATE创建的消息队列只供父子进程间使用
* 每次使用IPC_PRIVATE都会创建一个新的消息队列,不会使用原来的,
* 因为使用IPC_PRIVATE不再具有访问现有消息队列的功能
* 所以IPC_CREAT和IPC_EXCL都没有用
* 但是在父子进程间,因为程序还没有结束,所以父进程仍然在使用消息队列,
* 所以子进程也可以用该消息队列与父进程交互信息
* IPC_PRIVATE 宏 值是0
* */
int msgid = msgget(IPC_PRIVATE, );
if (msgid == -)
{
if (errno == ENOENT)
{
printf("自定义错误:没有该文件!\n");
return -;
}
if (errno == EEXIST)
{
printf("自定义错误:该消息队列已经存在!\n");
return -;
}
perror("msgget() err");
return -;
}
printf("创建消息队列成功!id=%d \n", msgid);
return ;
}
//消息队列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> int main(int arg, char * args[])
{
//如果有,使用现有的,没有,创建一个
int msgid = msgget(0x1234, | IPC_CREAT);
if (msgid == -)
{
perror("msgget() err");
return -;
}
//以可读可写的权限访问一个只读不可写的消息队列 报错
msgid = msgget(0x1234, );
if (msgid == -)
{
perror("msgget() err");
return -;
}
return ;
}

Linux 进程间通讯详解二的更多相关文章

  1. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量 ...

  2. Linux 进程间通讯详解七

    上图的一台主机服务器架构的重大缺陷是容易死锁 因为客户端,服务器都往同一消息队列中发送接收消息,假设消息队列已经满了,此时客户端无法向队列中发送消息,阻塞了,而服务器接收完一条消息后,想向消息队列发送 ...

  3. Linux 进程间通讯详解六

    ftok()函数 key_t ftok(const char *pathname, int proj_id); --功能:创建系统建立IPC通讯 (消息队列.信号量和共享内存) 时key值 --参数 ...

  4. Linux 进程间通讯详解三

    msgctl()函数 int msgctl(int msqid, int cmd, struct msqid_ds *buf); --参数 msqid:有msgget函数返回的消息队列标识码 cmd: ...

  5. Linux 进程间通讯详解五

    msgrcv函数 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg); --功能:是从一个消息队列接 ...

  6. Linux 进程间通讯详解四

    msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); --功能:把一条消息添加到消息队列中 --参数 ...

  7. Linux 进程间通讯方式 pipe()函数 (转载)

    转自:http://blog.csdn.net/ta893115871/article/details/7478779 Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道( ...

  8. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  9. Linux 进程间通讯

    一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

随机推荐

  1. (原)3.2 Zookeeper应用 - 数据的发布与订阅

    本文为原创文章,转载请注明出处,谢谢 数据的发布与订阅 1.应用 服务端监听数据改变,客户端创建/更新节点数据,客户端提供数据,服务端处理 2.原理 客户端监控节点数据改变事件(例如配置信息,下图的c ...

  2. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  3. 盘点国内11家已经获得融资的移动CRM平台

    盘点国内11家已经获得融资的移动CRM平台 亿欧网盘点了目前国内已经获得融资的11家移动CRM平台,它们分别是:纷享销客.红圈营销.小满科技.腾腾科技.麦客.美洽.销售易.快消总管.EC营客通.店小三 ...

  4. Linux安全基础:shell及一些基础命令

    1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourn ...

  5. Android触摸事件流程剖析

    Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 onTouchEvent触摸事件处 ...

  6. Android5.0 TimePicker,DatePicker恢复成低版本滚动模式

    新版中的TimePicker DatePicker是不支持使用遥控器的, 恢复成低版本滚动模式只需要是xml文件加上一句即可: android:datePickerMode="spinner ...

  7. 拯救你的文档 – 【DevOps敏捷开发动手实验】开源文档发布

    今天上海的天气真是不错,风和日丽.再次来到微软上海紫竹研发中心,心情很是愉快,喜欢这里的大草坪,喜欢这里的工程气氛,更喜欢今天来陪我的小伙伴们. 这次动手实验培训与以往最大的不同就是采用了开源文档的方 ...

  8. EditText的inputType常用取值

    最近经过实际试验,总结了InputType几个常用取值表示的含义: 1.none, text, textVisiblePassword: 无任何输入限制 2.textMultiLine: 允许多行输入 ...

  9. tar解压问题gzip: stdin: not in gzip format

    如下所示,使用tar -zxvf解压文件时遇到"gzip: stdin: not in gzip format"等错误: [root@DB-Server tmp]# [root@D ...

  10. 化繁为简——分解复杂的SQL语句

    今天同事咨询一个SQL语句,如下所示,SQL语句本身并不复杂,但是执行效率非常糟糕,糟糕到一塌糊涂(执行计划也是相当复杂).如果查询条件中没有NOT EXISTS部分,倒是不要一秒就能查询出来. SE ...