天天看点

Linux IPC实践(4) --System V消息队列(1)

   消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机);

   每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值.

   消息队列也有管道一样的不足: (1)每个消息的最长字节数的上限(MSGMAX); (2)系统中消息队列的总条数也有一个上限(MSGMNI); (3)每个消息队列所能够保存的总字节数是有上限的(MSGMNB) .

查看系统限制

   cat /proc/sys/kernel/msgmax  #最大消息长度限制

   cat /proc/sys/kernel/msgmnb  #消息队列总的字节数

   cat /proc/sys/kernel/msgmni  #消息条目数

Linux IPC实践(4) --System V消息队列(1)

管道 vs. 消息队列

管道

消息

流管道

有边界

先进先出

可以后进先出

消息队列在内核中的表示

Linux IPC实践(4) --System V消息队列(1)

消息在消息队列中是以链表形式保存的, 每个节点的类型类似如下:

msgget

功能:用来创建和访问一个消息队列

参数:

  key: 某个消息队列的名字

  msgflg:由九个权限标志构成,如0644,它们的用法和创建文件时使用的mode模式标志是一样的(但是消息队列没有x(执行)权限)

返回值:

  成功返回消息队列编号,即该消息队列的标识码;失败返回-1

msgget调用关系图

Linux IPC实践(4) --System V消息队列(1)
Linux IPC实践(4) --System V消息队列(1)

msgctl函数

功能:获取/设置消息队列的信息

   msqid: 由msgget函数返回的消息队列标识码

   cmd:是将要采取的动作(见下)

cmd:将要采取的动作(有三个可取值),分别如下:

Linux IPC实践(4) --System V消息队列(1)

附-查看系统中的IPC对象

     ipcs

   删除消息队列

     ipcrm -q [msqid]

  或  ipcrm -Q [key] #如果key不等于0的话

继续阅读