Linux:进程间通信之消息队列(IPC资源)

进程间通信----消息队列篇

system V消息队列

消息队列提供的服务就是一个进程向一个进程发送有类型数据块。
消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值消息队列也有管道⼀样的不⾜,就是每个消息的最⼤⻓度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有⼀个上限(MSGMNI)。
消息队列的生命周期也是随内核的。 它支持双向通信,但是A进程和B进程都可以向消息队列发送数据块,也都可以拿取数据块,那么万一A进程拿的还是A进程的数据块,B进程拿的还是B进程的数据块不就没有完成进程间通信了吗?因此发送的必须是有类型的数据块,来确保进程间的通信。

消息队列相关命令:

ipcs -q 查看消息队列相关信息
ipcrm -q id号 删除id号消息队列

消息队列相关函数

msgget函数

功能:⽤来创建和访问⼀个消息队列
原型

int msgget(key_t key, int msgflg);

参数
key: 某个消息队列的名字
msgflg:由九个权限标志构成,它们的⽤法和创建⽂件时使⽤的mode模式标志是⼀样的
返回值:成功返回⼀个⾮负整数,即该消息队列的标识码;失败返回-1

msgctl函数

功能:消息队列的控制函数
原型

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

参数
msqid: 由msgget函数返回的消息队列标识码
cmd:是将要采取的动作,(有三个可取值)
在这里插入图片描述
返回值:成功返回0,失败返回-1

msgsnd函数

功能:把⼀条消息添加到消息队列中
原型

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

参数
msgid: 由msgget函数返回的消息队列标识码
msgp:是⼀个指针,指针指向准备发送的消息,
msgsz:是msgp指向的消息⻓度,这个⻓度不含保存消息类型的那个long int⻓整型
msgflg:控制着当前消息队列满或到达系统上限时将要发⽣的事情
msgflg=IPC_NOWAIT表⽰队列满不等待,返回EAGAIN错误。
返回值:成功返回0;失败返回-1

其中,1.消息结构在两⽅⾯受到制约:
⾸先,它必须⼩于系统规定的上限值;
其次,它必须以⼀个long int⻓整数开始,接收者函数将利⽤这个⻓整数确定消息的类型
2.消息结构参考形式如下:

    struct msgbuf {
    long mtype;
    char mtext[1];
    }

msgrcv函数

功能:是从⼀个消息队列接收消息
原型

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

参数
msgid: 由msgget函数返回的消息队列标识码
msgp:是⼀个指针,指针指向准备接收的消息,
msgsz:是msgp指向的消息⻓度,这个⻓度不含保存消息类型的那个long int⻓整型
msgtype:它可以实现接收优先级的简单形式
msgflg:控制着队列中没有相应类型的消息可供接收时将要发⽣的事
返回值:成功返回实际放到接收缓冲区⾥去的字符个数,失败返回-1

其中,msgtype=0返回队列第⼀条信息
msgtype>0返回队列第⼀条类型等于msgtype的消息 
msgtype<0返回队列第⼀条类型⼩于等于msgtype绝对值的消息,并且是满⾜条件的消息类型最⼩的消息
msgflg=IPC_NOWAIT,队列没有可读消息不等待,返回ENOMSG错误。
msgflg=MSG_NOERROR,消息⼤⼩超过msgsz时被截断
msgtype>0且msgflg=MSG_EXCEPT,接收类型不等于msgtype的第⼀条消息。

猜你喜欢

转载自blog.csdn.net/ETalien_/article/details/86427351