【Linux】进程间通信 ----- 消息队列(IPC资源)

system V消息队列

消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法,每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值,消息队列也有管道⼀样的不⾜,就是每个消息的最⼤⻓度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有⼀个上限(MSGMNI)。消息队列也是ipc资源。IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核。

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:是将要采取的动作,(有三个可取值)

命令

说明
IPC_STAT 把msqid_ds结构中的数据设置为消息队列的当前关联值
IPC_SET 在进程有足够权限的前提下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值
IPC_RMID 删除消息队列

返回值:成功返回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的第⼀条消息。

查看和删除消息队列:

ipcs -q查看共享内存相关信息
ipcrm -q (shmid)删除shmid标识号的共享内存

 

你可能感兴趣的:(Linux)