linux队列命令 linux查看队列管理器( 四 )


10.22tcpdump:监听网络流量 / 398
第11章 Linux系统管理命令 / 407
11.1lsof:查看进程打开的文件 / 407
11.2uptime:显示系统的运行时间及负载 / 411
11.3free:查看系统内存信息 / 411
11.4iftop:动态显示网络接口流量信息 / 413
11.5vmstat:虚拟内存统计 / 415
11.6mpstat:CPU信息统计 / 419
11.7iostat:I/O信息统计 / 420
11.8iotop:动态显示磁盘I/O统计信息 / 423
11.9sar:收集系统信息 / 425
11.10chkconfig:管理开机服务 / 430
11.11ntsysv:管理开机服务 / 433
11.12 setup:系统管理工具 / 434
11.13ethtool:查询网卡参数 / 436
11.14mii-tool:管理网络接口的状态 / 437
11.19rpm:RPM包管理器 / 443
11.20yum:自动化RPM包管理工具 / 446
top命令
第12章 Linux系统常用内置命令 / 450
12.1Linux内置命令概述 / 450
12.2Linux内置命令简介 / 450
12.3Linux常用内置命令实例 / 452
Linux系统编程—消息队列消息队列本质上是位于内核空间的链表 , 链表的每个节点都是一条消息 。每一条消息都有自己的消息类型,消息类型用整数来表示,而且必须大于 0 。每种类型的消息都被对应的链表所维护:
其中数字 1 表示类型为 1 的消息 , 数字2、3、4 类似 。彩色块表示消息数据,它们被挂在对应类型的链表上 。
值得注意的是,刚刚说过没有消息类型为 0 的消息,实际上,消息类型为 0 的链表记录了所有消息加入队列的顺序,其中红色箭头表示消息加入的顺序 。
无论你是发送还是接收消息,消息的格式都必须按照规范来 。简单的说,它一般长成下面这个样子:
所以,只要你保证首4字节(32 位 linux 下的 long)是一个整数就行了 。
举个例子:
从上面可以看出,正文部分是什么数据类型都没关系,因为消息队列传递的是 2 进制数据,不一定非得是文本 。
msgsnd 函数用于将数据发送到消息队列 。如果该函数被信号打断,会设置 errno 为 EINTR 。
参数 msqid:ipc 内核对象 id
参数 msgp:消息数据地址
参数 msgsz:消息正文部分的大?。ú话⒗嘈停?
参数 msgflg:可选项
该值为 0:如果消息队列空间不够,msgsnd 会阻塞 。
IPC_NOWAIT:直接返回,如果空间不够,会设置 errno 为 EAGIN.
返回值:0 表示成功 , -1 失败并设置 errno 。
msgrcv 函数从消息队列取出消息后,并将其从消息队列里删除 。
参数 msqid:ipc 内核对象 id
参数 msgp:用来接收消息数据地址
参数 msgsz:消息正文部分的大?。ú话⒗嘈停?
参数 msgtyp:指定获取哪种类型的消息
msgtyp = 0:获取消息队列中的第一条消息
msgtyp0:获取类型为 msgtyp 的第一条消息,除非指定了 msgflg 为MSG_EXCEPT,这表示获取除了 msgtyp 类型以外的第一条消息 。
msgtyp0:获取类型 ≤|msgtyp|≤|msgtyp| 的第一条消息 。
参数 msgflg:可选项 。
如果为 0 表示没有消息就阻塞 。
IPC_NOWAIT:如果指定类型的消息不存在就立即返回,同时设置 errno 为 ENOMSG
MSG_EXCEPT:仅用于 msgtyp0 的情况 。表示获取类型不为 msgtyp 的消息
MSG_NOERROR:如果消息数据正文内容大于 msgsz,就将消息数据截断为 msgsz
程序 msg_send 和 msg_recv 分别用于向消息队列发送数据和接收数据 。
msg_send 程序定义了一个结构体 Msg,消息正文部分是结构体 Person 。该程序向消息队列发送了 10 条消息 。
msg_send.c
程序 msg_send 第一次运行完后 , 内核中的消息队列大概像下面这样:

推荐阅读