消息队列也是一种进程间通信的方式,systemV 消息队列被大量使用
特点:
1.消息队列面向数据块
2.ipc生命周期不是随进程的(进程退出则退出),系统中若创建IPC,若不显式删除,则一直存在,是随内核的(用命令行删除或者重启系统)
3.消息类型队列和管道不同的就是它没有谁进谁出的规定,是半双工的
4.消息队列是操作系统提供的第三方进程,完成双向通信
消息队列
ftok函数
函数ftok把一个已存在的路径和一个整数标识转换成一个key_t 值,称为IPC键
返回值:
msgget函数
msgget函数 用于创建一个新的或者打开一个已经存在的消息队列,这个消息队列与key相对应。
key:函数ftok返回值或IPC_PRIVATE
msgflag:IPC_CREAT创建新的消息队列;IPC_EXCL表示若创建的消息队列已经存在,则错误返回
返回值
关于msgget的参数msgflg,IPC_CREAT标识当文件不存在时创建,IPC_EXCL表示当文件存在时出错返回。
关于msgctl 函数
msgctl函数对msqid标识的消息队列执行cmd操作
关于cmd
1.IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址
2.IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素值,这个值取自buf
3.IPC_RMID:从系统内核中移走消息队列
返回值
函数 msgsnd 和函数 msgrcv
msgsnd和msgrcv是linux系统中异步或进程间通信的一种机制。msgrcv从消息队列中读取消息,msgsnd将消息写入队列。
参数 msqid:消息队列的识别码
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可以定义的通用结构struct msgbuf{long mtype;/*消息类型,>0*/char mtext[1];/*消息文本*/};
msgsz消息大小
msgflg:控制函数行为标志(0表示忽略)
返回值
进程通信的实现:
server.c
client.c
comm.h
comm.c
ipcs -q查询消息队列
当server和client进程都退出后,这个消息队列仍存在,需要手动删除
ipcrm -q msqid