林桦 發表於 2025-5-5 15:21:00

消息队列的函数接口

<h1 id="ipcmk命令">ipcmk命令</h1>
<p>此命令可以创建ipc对象</p>
<pre><code>ipcmk -Q        //用于创建消息队列
</code></pre>
<h1 id="msgget函数">msgget()函数</h1>
<p>此函数可以获得之前创建的消息队列的标识符</p>
<pre><code>int msgget(key_t key,int msgflg)
//key:指的是要创建的消息队列的key键值,键值类型key_t其实在内核源码中指的是int类型
//msgflg:创建消息队列的标志
//其中IPC_CREAT指的是如果消息队列不存在则创建,IPC_EXCL指的是如果消息队列存在则表示函数调用失败。
//也可以指定消息队列的权限,权限设置为0644即可
//ret:成功返回消息队列的标识符,失败返回-1
</code></pre>
<h1 id="ftok函数">ftok函数</h1>
<p>此函数可以生成IPC对象的键值key</p>
<pre><code>key_t ftok(const char *pathname,int proj_id)
//pathname;文件路径
//proj_id:项目id由用户指定,是非0值,1-255
//ret:成功返回键值key,失败返回-1
//notice:文件路径和项目id一样则返回的键值一样
</code></pre>
<h1 id="msgsend函数">msgsend函数</h1>
<p>该函数可以向指定的消息队列发送消息</p>
<pre><code>struct msgbuf {
               long mtype;       /* message type, must be &gt; 0 */
               char mtext;    /* 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:消息队列默认的属性是阻塞的,也就是当待写入的消息的长度大于消息队列剩余空间时,默认阻塞,直到消息队列的容量足够容纳时会解除阻塞。
</code></pre>
<h1 id="msgrcv函数">msgrcv函数</h1>
<pre><code>ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//msgqid指的是MSG对象的标识符ID
//msgp指的是存放消息的缓存地址,该地址下存储的是structmsgbuf结构体。
//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部分,其余部分丢弃
</code></pre>
<h1 id="msgctl函数">msgctl函数</h1>
<p>该函数实现获取消息队列的属性信息、设置消息队列的属性信息、删除消息队列等操作。</p>
<pre><code>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) */
         };
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3626997/202505/3626997-20250505184658247-1352132084.png" alt="image" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/lradian/p/18860144
頁: [1]
查看完整版本: 消息队列的函数接口