qidao123.com技术社区-IT企服评测·应用市场
标题:
消息队列的函数接口
[打印本页]
作者:
莱莱
时间:
2025-5-5 17:48
标题:
消息队列的函数接口
ipcmk下令
此下令可以创建ipc对象
ipcmk -Q //用于创建消息队列
复制代码
msgget()函数
此函数可以获得之前创建的消息队列的标识符
int msgget(key_t key,int msgflg)
//key:指的是要创建的消息队列的key键值,键值类型key_t其实在内核源码中指的是int类型
//msgflg:创建消息队列的标志
//其中IPC_CREAT指的是如果消息队列不存在则创建,IPC_EXCL指的是如果消息队列存在则表示函数调用失败。
//也可以指定消息队列的权限,权限设置为0644即可
//ret:成功返回消息队列的标识符,失败返回-1
复制代码
ftok函数
此函数可以生成IPC对象的键值key
key_t ftok(const char *pathname,int proj_id)
//pathname;文件路径
//proj_id:项目id由用户指定,是非0值,1-255
//ret:成功返回键值key,失败返回-1
//notice:文件路径和项目id一样则返回的键值一样
复制代码
msgsend函数
该函数可以向指定的消息队列发送消息
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//msgid指的是消息队列的标识符
//msgp指的是一个指向struct msgbuf类型的结构体指针,该结构体中有两个成员,其中一个成员mtype指的是消息类型,必须是一个大于0的正整数,另一个成员mtext指的是消息正文,类型可以是数组或者其他结构。
//msgsz指的是消息正文的大小,按字节计算,当然msgsz的值必须是非负整数,可以设置为0,表示消息正文的长度为0。
//msgflg指的是消息队列的标志,如果该标志设置为IPC_NOWAIT,则表示不阻塞,此时如果待写入的消息的长度大于消息队列剩余空间,则直接返回并报错。
//notice:消息队列默认的属性是阻塞的,也就是当待写入的消息的长度大于消息队列剩余空间时,默认阻塞,直到消息队列的容量足够容纳时会解除阻塞。
复制代码
msgrcv函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//msgqid指的是MSG对象的标识符ID
//msgp指的是存放消息的缓存地址,该地址下存储的是struct msgbuf结构体。
//msgsz指的是存放消息的缓存的大小,按照字节计算,如果消息正文的大小大于用户设置的缓存大小,则根据msgflg是否为MSG_NOERROR进行判断,如果msgflg设置为MSG_NOERROR ,则可以读取对应字节的消息,如果msgflg没有设置,则无法读取消息并报错。
//msgtyp指的是要接收消息的类型,在调用msgsnd函数时构造的消息结构体中有该成员的值。
//等于0:指的是不区分类型,直接读取MSG中的第一个消息。
//大于0:读取类型为指定msgtyp的第一个消息(若msgflg被配置了MSG_EXCEPT则读取除了类型为msgtyp的第一个消息)
//3)小于0:读取类型小于等于msgtyp绝对值的第一个具有最小类型的消息。例如当MSG对象中有类型为3、1、5类型消息若干条,当msgtyp为-3时,类型为3的第一个消息将被读取。
//msgflg指的是接收消息选项,如果msgflg设置为0,指的是默认接收模式,在MSG中无指定类型消息时阻塞。
//IPC_NOWAIT:指的是非阻塞接收模式,当MSG中没有指定类型消息时直接退出函数
//MSG_EXCEPT :指的是读取除msgtyp之外的第一个消息。
//MSG_NOERROR:如果待读取的消息尺寸比msgsz大只返回msgsz部分,其余部分丢弃
复制代码
msgctl函数
该函数实现获取消息队列的属性信息、设置消息队列的属性信息、删除消息队列等操作。
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
//msgqid指的是MSG对象的标识符ID
//cmd指定操作符
//buf存储信息的结构体
struct msqid_ds {
struct ipc_perm msg_perm; /* Ownership and permissions */
time_t msg_stime; /* Time of last msgsnd(2) */
time_t msg_rtime; /* Time of last msgrcv(2) */
time_t msg_ctime; /* Time of last change */
unsigned long __msg_cbytes; /* Current number of bytes in
queue (nonstandard) */
msgqnum_t msg_qnum; /* Current number of messages
in queue */
msglen_t msg_qbytes; /* Maximum number of bytes
allowed in queue */
pid_t msg_lspid; /* PID of last msgsnd(2) */
pid_t msg_lrpid; /* PID of last msgrcv(2) */
};
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4