system V 消息队列的用法

system消息队列,说白了就是内核维护的队列,这个队列的元素是进程发出的一些字符串。通过消息队列,可以实现进程间消息的传递。


对于每个消息队列,内核都维护了下面这个数据结构

struct msqid_ds {
	struct ipc_perm	msg_perm;	//存一些权限,创建信息之类的
	struct msg*	msg_first;	//ptr to first message on queue
	struct msg*	msg_last;	//ptr to last message on queue
	msglen_t 	msg_cbytes;	//current # bytes on queue
	msgqnum_t 	msg_qnum;	//current # of message on queue
	msglen_t 	msg_qbytes;   <span style="white-space:pre">	</span>//max \# of bytes allowed on queue
	pid_t 		msg_lspid;	//pid of last msgsnd
	pid_t 		msg_lrpid;	//pid of last msgrcv
	time_t		msg_stime;	//time of last msgsnd()
	time_t 		msg_rtime;	//time of last msgrcv()
	time_t 		msg_ctime;	//time of last msgctl()	
};


其实吧,这东西会用就行了,也就是4个API而已

1.msgget()函数-------建立消息队列

#include<sys/msg.h>

int msgget(key_t key,int oflag);

//若成功返回非负标识符,否则返回-1;

其中 key_t 要么是ftok()的返回值,要么是常量IPC_PRIVATE(0),要么是你随便填的一个非负数.

差别在于:系统通过key值确定你要使用哪个消息队列,两个进程想要使用消息队列通信,必须使用相同的key。

ftok(char * pathname,int id)函数可以通过一致的pathname和id很方便的构造出key;

IPC_PRIVATE 意为私有的,用这个参数得到的消息队列,只能通过fork()在本进程和子进程间使用 注;IPC_PRIVATE值为0

随便填一个非负数,你记住它就行了,在你想要通信的进程的msgget函数中填入相同的数,即可快活的使用消息队列,但!但!!但!!!这么填的话很有可能别的不相干的进程的msgget参数也是这个值,后果就是,这个消息队列中充斥着不同的信息,自己的消息被别的进程读了,别的进程的消息可能又被自己读了,。,。


oflag参数,基本就是: 权限位,IPC_CREAT,IPC_EXCL;

IPC_CREAT 如果消息队列不存在,就创建它。IPC_CREAT一般都与权限位异或,比如 0666|IPC_CREAT

IPC_EXCL 如果消息队列已存在,msgget返回 -1;


2.msgsnd()函数 ------发送消息

#include<sys/msg.h>

int msgsnd(int msqid,const void *ptr,size_t length,int flag);

//成功返回0,失败返回-1



msqid 消息队列标识符 是 msgget()的返回值
ptr 指向了消息结构体,模板如下

struct msgbuf {
	long mtype; 	// mssage type must be > 0 
	char mtext[length];// mssage data 
};

ptr指向一个long 长整型数,表示消息类型,紧跟其后的就是消息。

length 表示消息类型之后的,消息正文的长度。

flag只有两个参数 0 或 IPC_NOWAIT(非阻塞);


3.msgrcv()函数 -----接收消息

#include <sys/msg.h>

ssize_t msgrcv(int msqid,void *ptr,size_t length,long type ,int flag);

//若成功,返回成功读入的消息正文的字节数,否则返回-1


msqid : 消息队列标识符;

ptr :指向msgbuf结构体的指针;

length  :消息的正文长度 ,不包括消息类型long 

type; 接收类型, type  == 0 返回该队列第一个消息;

type > 0 返回消息类型等于type的第一个消息

type < 0 返回小于等于type绝对值的,最小的消息类型的第一个消息

flag: IPC_NOWAIT 非阻塞

do nothing

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值