15.7 进程间通信_消息队列

来源:互联网 发布:游戏源码提取软件 编辑:程序博客网 时间:2024/05/13 15:25

      消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。每个消息包含一个正长整型类型之段,一个非负长度以及实际数据字节(对应于长度)。

  • #include <sys/msg.h>
  • int msgget(key_t key, int flag);
  • int msgctl(int msgid, int cmd, struct msqid_ds *buf);
  • int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);

以上三个函数成功返回消息队列ID,出错返回-1

  • ssize_t msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);

返回值:若成功则返回消息的数据部分的长度,若出错则返回-1

      msgget用于打开一个现存队列或创建一个新队列。

      msgctl对队列执行多种操作,类似于ioctl函数。

      msgsnd将数据放到消息队列中。消息总是放在队列尾端。ptr指向一个长整型数,它包含了正的整型消息类型,在其后紧跟着消息数据的缓冲区。nbytes说明数据缓冲区的长度。参数flag的值可以指定为IPC_NOWAIT,这类似于文件I/O的非阻塞I/O标志。

      msgrcv从队列中取用消息。其ptr、nbytes、flag同msgsnd的一样意义。参数type可以指定想要哪一种消息:

  • type == 0 返回队列中的第一个消息。
  • type  >  0 返回队列中消息类型为type的第一个消息。
  • type  <  0 返回队列中消息类型值小于或等于type绝对值的消息,如果这种消息有若干个,则取类型值最小的消息。

type值非0用于以非先进先出次序读消息。

      msgrcv成功执行时,内核更新与该消息队列相关联的msqid_ds结构,以指示调用者的进程ID(msg_lrpid)和调用时间(msg_rtime),并将队列中的消息数(msg_qnum)减1。

 

原创粉丝点击