linux进程通信---消息队列

进程通信方式----消息队列

消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息,对消息队列有读权限的进程可以从中读走消息。

消息队列是随内核持续,只有在内核重启或者显示删除一个队列时,该消息队列才会真正被删除。

消息队列的结构:

队列头:struct msg_queue来描述,该结构体中包含消息队列的大量消息,包括:消息队列键值,用户ID,组ID,消息队列中消息数目等。

有图可知:

 

全局结构:structipc_ids msg_ids可以访问每个消息队列列头的第一个成员structkern_ipc_perm.

        struct kern_ipc_perm.能够与具体的消息队列对应起来,是因为在该结构体中,有一个

         key_t类型成员key,而key则是唯一确定一个消息队列。

 

使用消息队列的三个操作

1,      打开或创建消息队列,消息队列描述字是由系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路径。

2,      读写操作,每个消息由如下的结构

Struct msgbuf

{

   Long  mtype;

   Char mtext[1];

}

Mtype成员代表消息类型,

Mtext 消息内容

注意点:对于发消息和读消息来说,首先预置一个msgbuf缓冲区并写入和读出消息类型和消息内容。

3,      获得或设置消息队列属性,分配一个类似消息队列的结构,来返回消息队列的属性。

 

 

消息队列操作函数

1,      msgget

函数作用:创建消息队列

函数原型:int ,msgget(key_t key,intmsgflg)

函数参数:key:键值,可有fork()函数获得,

           msgflg:IPC_CREAT,IPC_EXCL,IPC_NOWAIT.

函数的使用:

如果消息队列的键值没有,并且msgflg中包含了IPC_CREAT标志位。

Key设置为IPC_PRIVATE

头文件:#include <sys/types.h>

         #include <sys/ipc.h>

         #include <sys/msg.h>

 

函数返回值:成功:消息队列描述字,失败:-1

 

2,      msgrcv

函数作用:读出消息队列的数据

函数原型:int msgrcv(int msgid,struct*msgp,int msgsz,long msgtyp,int msgflg)

函数参数:msgid:消息队列描述字。

          Msgp:储存信息

          Msgsz:消息内容的长度

          Msgtyp:消息的类型

          Msgflg:读消息标志,

头文件:#include <sys/types.h>

         #include <sys/ipc.h>

         #include <sys/msg.h>

返回值:成功:消息的实际字节数,失败:-1

 

 

3,      msgsnd

函数作用:往消息队列里写入数据

函数原型:int msgsnd(int msgid,strcutmsgbuf *msgp,int msgsz,int msgflg)

头文件:#include <sys/types.h>

         #include <sys/ipc.h>

         #include <sys/msg.h>

返回值:成功:0,失败:-1

 

4,      msgctl

函数作用:删除消息队列

函数原型:int msgctl(int msgid,intcmd,struct msqid_ds *buf)

函数参数:cmd:IPC_RMID,删除msqid标识的消息队列

头文件:#include <sys/types.h>

         #include <sys/ipc.h>

         #include <sys/msg.h>

返回值:成功,0,失败-1.

消息队列发送端

 

 

 

 

消息队列接收端

 

 

截图:

 

 

相互通信:

Msg1.c

 

 

 

 

 

Msg2.c

 

 

结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值