3.1 概述

消息队列结构:

struct msqid_ds
{
struct ipc_perm msg_perm; //权限结构
struct msg *msg_first; //队列中第一个消息
struct msg *msg_last; //队列中最后一个消息
msglen_t msg_cbytes; //队列中当前消息总字节数
msglen_t msg_qbytes; //队列中最大消息总字节数
msgqnum_t msg_qnum; //队列中当前消息数
pid_t msg_lspid; //最后发送消息进程
pid_t msg_lrpid; //最后接收消息进程
time_t msg_stime; //最后发送时间
time_t msg_rtime; //最后接收时间
time_t msg_ctime; //最后修改时间
};

内核中消息队列结构:

6.2 msgget函数

#include <sys/msg.h>
int msgget(key_t key,int oflag)

oflag:0x0400|0x0200 | 0x0040|0x0020 | 0x0004|0x0002 | IPC_CREAT | IPC_EXCL

创建一个消息队列时:

msg_perm中的uid、gid、cuid、cgid依据调用进程来初始化

msg_perm中的mode依据oflag进行初始化

msg_qnum、msg_lspid、msg_lrpid、msg_stime、msg_rtime置为0

msg_ctime置为当前时间

msg_qbytes设置为系统限制值

6.3 msgsnd函数

#include <sys/msg.h>
int msgsnd(int msqid,void *ptr,size_t len,int flag)

ptr一般是自定义的消息结构

struct mymsg
{
long type;
char text[LEN];
};

len:mymsg结构中类型字段之后的数据长度

falg:IPC_NOWAIT 非阻塞msgsnd(msgsnd不能向队列中写消息时,阻塞还是出错返回的控制位),也可以置为0

6.4 msgrcv函数

#include <sys/msg.h>
ssize_t msgrcv(int msqid,void *ptr,size_t len,long type,int flag)

ptr:接收数据缓冲区

len:缓冲区长度

type:接收的消息类型

0:接收队列中第一个消息

大于0:接收type类型的消息

小于0:接收类型值小于等于|type|的消息中类型值最小的第一个消息

flag:在消息队列中没有指定消息类型时,出错返回还是阻塞

6.5 msgctl函数

#include <sys/msg.h>
int msgctl(int msgid,int cmd,struct msqid_ds *buf)

IPC_STAT:将某个消息队列的信息写到buf中

IPC_SET:按照buf中的mag_perm.uid,msg_perm.gid、msg_perm.mode和msg_qbytes修改消息队列对应项

IPC_RMID:buf忽略,删除消息队列

System V 消息队列的更多相关文章

  1. 进程间通信 System V 消息队列

    1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...

  2. 第6章 System V消息队列

    6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...

  3. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  4. 利用System V消息队列实现回射客户/服务器

    一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...

  5. UNIX环境高级编程——system V消息队列

    unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的.     消息队列(也叫报文队列)客服了这些缺点:     消息队列就是一个消息的链表.     可以把消 ...

  6. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  7. 第二十五章 system v消息队列(一)

    IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...

  8. linux网络编程之system v消息队列(二)

    今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...

  9. Linux IPC System V 消息队列

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ftok() //获取key ...

  10. System V消息队列

    消息的基本属性 System V的消息属性包含在一个msqid_ds的结构中 struct msqid_ds{ struct ipc_cerm msg_perm; //读取权限, 0644, 0777 ...

随机推荐

  1. SQLite 入门教程(三)好多约束 Constraints(转)

    转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...

  2. Hyper-V避免使用快照

    虽然Hyper-V快照好处多多,但应该尽量少用,有两个原因,首先,如果你创建的是数据库服务器快照,你必须执行回滚,这样数据库往往会招到破坏,其次,创建快照会影响虚拟机的性能,实际上,创建快照就是创建第 ...

  3. BDB (Berkeley DB)数据库简单介绍(转载)

    近期要使用DBD,于是搜了下相关的资料,先贴个科普性的吧: 转自http://www.javaeye.com/topic/202990 DB综述DB最初开发的目的是以新的HASH訪问算法来取代旧的hs ...

  4. android应用程序的优先级

    andorid系统为保障应用程序运行的流畅性,当内存资源比较匮乏的时候会杀死那些优先级比较低的进程 android进程的优先级如下图: 1.活动进程: 是指那些正在与用户进行交互的应用程序进程,这种组 ...

  5. 启动列表的activity

    每学一个知识点就要重新创建一个项目,感觉那样太繁琐了,特别是android studio开发,没创建一个项目都会重新打开一个窗口 所以我就在那想,何不有一个功能列表,点击每一个列表项的时候就跳转到那个 ...

  6. cocos2d-x 2.1.4学习笔记01:windows平台搭建cocos2d-x开发环境

    cocos2d-x的大致开发流程是,首先使用win32版进行代码编写并完成游戏,然后将代码迁移到对应的开发环境上进行交叉编译完成游戏打包,如iphone上是mac+xcode,android是ecli ...

  7. java.sql.SQLException: Lock wait timeout exceeded --转

    org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...

  8. linux服务器上

    命令行>mysql -uwin -pwin2009进入mysql command状态>use mindo时入mindo数据库>source 500sql.txt执行sql

  9. 破解C#的readonly只读字段

    破解C#的readonly只读字段 目录 请允许我再唠叨几句const和readonly 修改readonly字段: 计策1:反间计 -- 反射修改 计策2:借刀杀人--调节字段偏移位置的结构体来修改 ...

  10. 搭建FTP+PAM+MySQL环境

    搭建FTP+PAM+MySQL环境 1 搭建环境: CentOS6.5或CentOS6.7 [root@vhost3 ~]# uname -a Linux vhost3 -.el6.x86_64 # ...