消息队列简记

消息队列简记


在了解了信号量共享内存之后,消息队列自然就比较容易理解了。

之前提到共享内存的操作不是原子的, 那么便可以结合信号量来进行控制。

消息队列是另外一种进程间通信的手段, 使用以下几个函数调用。

        #include <sys/types.h>

        #include <sys/ipc.h>

        #include <sys/msg.h>//一般上述两个头文件都被此文件包含

        int msgget(key_t key, int msgflg);

        int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

        ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

        int msgctl(int msqid, int cmd, struct msqid_ds *buf);

由此可见几种IPC機制都是类似的。


msgget(key, msgflg);

        同样的道理,该函数创建或获取一个和key相关的消息队列,一般使用 0666 | IPC_CREAT作为msgflg的值。看到0666很容易想到777(关于chmod),很容易可以知道是设置权限。

操作的是低9位, 666就是110110110。从高到低对应着u(用戶),g(组别), o(其他)的读、写和执行权限。比如最高三位110表示u有读和写权限,但没有执行权限。

函数返回一个msgid,供其它相关函数使用。


msgsnd(msgid, msgp, msgsz, msgflg);

        一般来说,消息队列中的消息成员都是一个结构体,该结构体至少包含两个成员: 一个是消息类型,另一个是消息数据。

比如:


        而msgp就是指向要传送的消息的指针。

        msgsz是消息的大小,不包含消息类型。

        msgflg一般置0。


msgrcv(msgid, msgp, msgsz, msgtyp, msgflg);

        与msgsnd类似,不同的是第4个参数msgtyp。

        msgtyp指定了要接收的消息类型, 一共有3种情况。

                1. msgtyp为0, 表示按顺序接收消息队列中的成员。

                2. msgtyp为某正数,表示接收类型为该正数的消息,类型由消息结构体中的msg_type指定。

                3. msgtyp为某负数,表示接收类型小于等于该负数绝对值的类型消息。

        msgctl一般用来撤销消息队列,形如 msgctl(msgid, IPC_RMID, 0)。

        下面是个小实验:

用于发送消息的msg1.c:

用于接收消息的msg2.c(指定接收数据类型为1的消息):


Jason Lee

2009-11-16 p.m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值