消息队列见习

1,消息队列从本质上讲就是一个链表,一个消息的链表。

2,消息队列通信主要步骤:

(1),通过ftok()获取一个键值;

(2),通过这个键值创建一个消息队列,并将消息队列与键值相关联。通过message get:msgget( )函数来创建。

(3),操作消息队列:发送消息,message send:msgsnd()与接收消息,receive message:msgrcv().

(4),删除消息队列:msgctl().

3,创建消息队列

# include <sys/types.h>

# include <sys/ipc.h>

# include <sys/msg.h>

int msgget(key_t key, int msgflg);

msgflg,操作与权限,IPC_CREAT | 0666

4,发送消息,msgsnd()

# include <sys/types.h>

# include <sys/ipc.h>

# include <sys/msg.h>

int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

(1)msqid是msgget()函数返回的消息队列描述符,表示你要把消息队列发送到哪个消息队列里面去。

(2)msgp是一个指向struct msgbuf 型结构体的指针,表示你要把发送的消息存放到哪种类型的结构体变量中。固定格式的

struct msgbuf

{

long mtype;//消息类型,必须大于0;

char mtext[消息长度];//消息内容

};

(3),msgsz:表示要发送或接收的消息的字节数,即msgbuf中存放消息的mtext数组的长度,通过sizeof即可获得。

(4),msgflg:折个参数依然是控制函数行为的标志。

5,接收消息:

# include <sys/types.h>

# include <sys/ipc.h>

# include <sys/msg.h>

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

6,删除消息队列:msgctl()

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

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

① 参数shmid表示要控制的是哪个消息队列,即msgget()函数的返回值;

② 参数cmd如果取IPC_RMID就表示删除消息队列,即remove ID。我们一般使用shmctl()函数就是删除消息队列,所以cmd一般都取IPC_RMID,其它参数我们就不看了。PC_RMID的宏值为0,我们在编程的时候可以写宏名也可以直接写宏值,这里直接写宏值好像更方便一点,但含义没有宏名直观。

③ 参数struct msqid_ds *是一个结构体指针,同样这个参数一般就写NULL。

 

举例:

# include <unistd.h>

# include <sys/types.h>

# include <sys/ipc.h>ls

 

# include <sys/msg.h>

# include <stdlib.h>

# include <stdio.h>

# include <string.h>

 

struct msgbuf

{

long mtype;  /*消息类型,必须大于0 */

char mtext[1024];    /*消息内容*/

};

 

int main(void)

{

//获取键值

int key = ftok(".", 1);

 

//创建消息队列

int msgid = msgget(key, IPC_CREAT | 0666);

 

//发送消息

struct msgbuf data;

 

data.mtype = 3;

strcpy(data.mtext, "i love you");

 

msgsnd(msgid, &data, 1024, 0);

 

return 0;

}

 

# include <unistd.h>

# include <sys/types.h>

# include <sys/ipc.h>

# include <sys/msg.h>

# include <stdlib.h>

# include <stdio.h>

# include <string.h>

 

struct msgbuf

{

long mtype;  /*消息类型,必须大于0 */

char mtext[1024];    /*消息内容*/

};

 

int main(void)

{

//获取键值

int key = ftok(".", 1);

 

//打开消息队列

int msgid = msgget(key, IPC_CREAT);

 

//接收消息

struct msgbuf data;

 

msgrcv(msgid, &data, 1024, 3, 0);

printf("%s\n", data.mtext);

 

//删除消息队列

msgctl(msgid, 0, NULL);

 

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值