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. How to Kill All Processes That Have Open Connection in a SQL Server Database[关闭数据库链接 最佳方法] -摘自网络

    SQL Server database administrators may frequently need in especially development and test environmen ...

  2. Native code - how to get function call stack (backtrace) programatically 附带源代码

    自己根据 https://github.com/zhuowei/libcorkscrew-ndk 上的库做了一个包装库并附带使用的例子(executable 分支),具体代码在自己的代码仓库里,名字叫 ...

  3. grep -P的一个小问题

    用grep时,发现一个怪异的问题. 背景:grep -E表示用扩展的正则表达式.grep -P 表示用perl正则表达式,区别:http://www.cnblogs.com/wangkangluo1/ ...

  4. 程序员提高工作效率的15个技巧【Facebook】

    程序员提高工作效率的15个技巧[Facebook] 作者: habadog 日期: 2015 年 02 月 13 日发表评论 (0)查看评论 程序员提高工作效率的15个技巧[Facebook] 1,D ...

  5. SRM659 1100pts

    绍一模拟赛的题[问题描述]小Z.小Y和小B拥有

  6. hi3531 SDK 编译 uboot, 改动PHY地址, 改动 uboot 參数 .

    一,编译uboot SDK文档写得比較清楚了,写一下须要注意的地方吧. 1. 之前用SDK里和别人给的已经编译好的uboot,使用fastboot工具都刷不到板子上.最后自己用SDK里uboot源代码 ...

  7. java实现window phone推送通知

    package com.windowphone.text; import java.io.IOException;import java.io.OutputStream;import java.net ...

  8. stack计算表达式的值

    9.52 使用stack对象处理带圆括号的表达式.遇到左圆括号时,将其标记下来.当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈. 接 ...

  9. linux上安装shell编辑器与linux运维面试题

    分两个部分 一.安装B-shell解释器 安装cygwin  Eclipse要找到安装的bin路径 https://cygwin.com 二.安装编辑器shellEd 下载可以得到一个:net.sou ...

  10. java编译环境

    系统环境变量: path D:\Program Files\Java\jdk1.7.0_45\bin (若里面已经有内容,前面加一个分号) 在c盘当前目录,能编译d盘的文件吗----能 javac D ...