美文网首页
[Linux进程间通信]消息队列

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

作者: longtzw | 来源:发表于2013-09-21 16:48 被阅读0次

    消息队列是消息的链接表,存放在内核中并由消息队列标识符标识
    每条消息由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进程间通信]消息队列

          本文链接:https://www.haomeiwen.com/subject/tkfqtttx.html