1、消息队列的创建与销毁
原则:谁打开,谁关闭;谁创建,谁释放。
被动端,进行消息队列的创建和销毁
msqid = msgget( key, 0600|IPC_CREAT ) ;//创建
flag = msgctl( msqid, IPC_RMID,NULL) ;//销毁
主动端,无需创建和销毁。
2、命令删除消息队列
我们在做测试时,被动端是while死循环,不断的接收消息,
while外才会销毁消息,(正常情况下,应该放在信号处理函数中)
当我们ctlr+c结束该循环时,则导致并未执行msgctl操作,导致消息队列并未被删除掉。
此时可以通过命令删除:
ipcs -->查看 消息队列、共享内存、信号量的情况
ipcs -q ---->查看消息队列的情况。
key msqid owner perms used-bytes messages
0x00000000 65536 zjkf 666 1024 2
如上, perms ---》permistion 权限的意思,对应msgget( key, 0600|IPC_CREAT )
ipcrm -q msgid //删除消息队列
ipcrm 命令
用途
删除消息队列、信号集、或者共享内存标识。
语法
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]
描述
ipcrm 命令删除一个或更多的消息队列、信号量集或者共享内存标识。
标志
-m SharedMemory ID 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。
-M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
-q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。
-Q MessageKey 删除由关键字 MessageKey 创建的消息队列标识和与其相关的消息队列和数据结构。
-s SemaphoreID 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。
-S SemaphoreKey 删除由关键字 SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。
msgctl、shmctl 和 semctl 子例程提供了删除操作的细节。标识和关键字可以用 ipcs 命令找到。
ulimit -a 查看 消息队列的大小,
ulimit -q 消息队列新的大小 //修改消息队列的大小。
3、消息大小
msgsnd()和msgrcv()中消息的大小,都需要减去mtype的大小。
4、消息类型
mtype一定要有,且>0.其他数据自定义;作用:区分不同的数据包类型。
消息类型名自定义,