首页 > 其他分享 >System V消息队列

System V消息队列

时间:2023-02-05 02:44:19浏览次数:29  
标签:返回 IPC 队列 System int 消息 msg

概述:消息队列是进程通信的一种方式。

头文件:

#include<sys/types.h>
#include<sys/msg.h>

一、创建或打开一个消息队列

int msgget(key_t key, int msgflg);

参数 key 是一个键,用于生成唯一的标识符。可由 IPC_PRIVATE或 ftok() 生成.

参数 msgflg 是权限位和下面这些位组成:

  • IPC_CREAT:如果你要与指定的key对应的消息队列,那么就创建一个新队列。
  • IPC_EXCL:同时设置了 IPC_CREAT 并且 key 已经存在,那么调用失败返回EEXIST。

返回值:成功返回消息队列的标识符,它是消息队列的句柄。失败返回-1和设置error。

二、发送消息

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

参数msgid是消息队列的标识符。

参数msgp是一个void*类型,可以传入任何结构的指针,msgp指向需要发送的消息的数据结构。这个数据结构定义如下:

struct mymsg
{
    long mtype;//消息类型
    char mtext[];//消息内容,长度和结构任意,无需是一个字符数组
}

参数msgsz指定mymsg.mtext部分的字节数。

参数msgflg是一组标记的位掩码,用于控制msgsnd()的操作,目前只定义了一个IPC_NOWAIT,作用是执行非阻塞的发送操作。

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

三、接收消息

ssize_t msgrcv(int msgid, void *msgp, size_t maxmsgsz, long msgtyp, int msgflg);

参数msgid和msgp与前面的意思相同。

参数maxmsgsz表示mymsg.mtext的最大可用空间。

参数msgtyp:读取消息的顺序无需跟发送的顺序一致,可以根据msgtyp的值来选择消息。

  • 0:删除消息队列的第一条消息并将其返回给调用进程。
  • 大于0:将消息队列第一条mtype等于msgtyp的消息删除并将其返回给调用进程。
  • 小于0:将等待消息当成优先队列来处理,队列 mytype 最小并且其值小于或等于 msgtyp 的绝对值的第一条消息会被删除并返回给调用者。

参数msgflg是一个位掩码,它的值通过将下列标记的零个或多个取or来确定。

  • IPC_NOWAIT:执行一个非阻塞接收
  • MSG_EXCEPT:msgtyp大于0时才起作用,将消息队列中第一条 mtype 不等于 msgtyp 的消息删除并将其返回给调用者

MSG_NOERROR:默认情况 mtext 大小超过了 maxmsgsz ,则会调用失败。指定了该标志则会把 mtext 截断为 maxmsgsz 字节。然后返回给调用者,被截取的数据丢失

返回值:成功返回消息内容的字节数,失败返回-1并设置error

四、控制操作

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

参数cmd指定在消息队列上执行的操作,其取值是下列值的一个:

  • IPC_RMID:立即删除消息队列对象及其关联的msqid_ds数据结构。队列中的所有剩余消息都会丢失,所有被阻塞的读者和写者进程会立即醒来。msgsnd()和msgrcv()会失败并返回错误EIDRM。这个操作会忽略传递给msgctl()的第三个参数。
  • IPC_STAT:将与这个消息队列关联的msqid_ds数据结构的副本放到buf指向的缓冲区中。
  • IPC_SET:用buf指向的缓冲区的值更新与这个消息队列关联的msqid_ds数据结构中被选中的字段。

返回值:成功返回0,失败返回-1并设置error

五、消息队列关联数据结构

struct msqid
{
    struct ipc_perm msg_perm;     /* Ownership and permissions  */
    time_t          msg_stime;    /* Time of last msgsnd() */
    time_t          msg_rtime;    /* Time of last msgrcv() */
    time_t          msg_ctime;    /* Time of last change */
    unsigned long   _msg_cbytes;  /* Number of bytes in queue */
    msgqnum_t       msg_qnum;     /* Number of messages in queue */
    msglen_t        msg_qbytes;   /* Maximum bytes in queue */
    pid_t           msg_lspid;    /* PID of last msgsnd() */
    pid_t           msg_lrpid;    /* PID of last msgrcv() */
}

 

标签:返回,IPC,队列,System,int,消息,msg
From: https://www.cnblogs.com/ekux127/p/17085789.html

相关文章