[Linux进程间通信]消息队列

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识
每条消息由3部分组成:消息类型+消息长度+实际数据
每条新消息总是放在队列尾部

用于描述消息队列的结构体为struct msqid_ds

打开一个现存队列或创建一个新队列

int msgget(key_t key, int flag)
成功返回消息队列ID,出错返回-1

操作消息队列

int msgctl(int msqid, int cmd, struct msgid_ds *buf)
成功返回0,出错返回-1
  • 参数cmd说明对由msqid指定的队列要执行的命令,命令类型如下:
    • IPC_STAT 取此队列的msqid_ds结构,存放至buf
    • IPC_SET 根据buf中的值,设置此队列的msqid_ds
    • IPC_RMID 从系统中删除此消息队列以及仍在队列中的数据

将数据放到消息队列中

int msgsnd(int msqid, const void *ptr, 
       size_t nbytes, int flag)
成功返回0,出错返回-1
  • 参数ptr指向有消息类型和实际数据组成的结构体
  • 参数nbytes代表消息长度
  • 参数flag可以指定为IPC_NOWAIT,这使得当消息队列满或队列中的数
    据总量超过系统限制时msgsnd立即出错返回EAGAIN,若未指定则会
    阻塞

从消息队列中取消息

ssize_t msgrcv(int msqid, void *ptr, size_t nbytes, 
           long type, int flag)
成功返回消息的数据部分的长度,出错返回-1
  • 参数ptr指向存放取出消息的缓存区

  • 参数nbytes说明缓存区的大小,若返回消息大于nbytes,而且在flag中
    设置了MSG_NOERROR,则该消息会别截短且不通知我们消息被
    截短了,截去的部分会被丢弃

  • 参数type指名想要哪一种消息

    • type == 0 返回队列中的第一个消息
    • type > 0 返回队列中类型为type的第一个消息
    • type < 0 返回队列中消息类型值小于或等于type绝对值的消息
      如果这种消息有若干个,则返回消息类型值最小的
  • 参数flag值为IPC_NOWAIT,可以使操作不阻塞

你可能感兴趣的:([Linux进程间通信]消息队列)