int msgget(key_t key, int msgflg)
函数功能:在内核中开辟一块消息队列空间,返回值返回该消息队列空间对应的msqid,msqid用来操作该空间
形参列表:
key:内核层中分配空间的索引
0/IPC_PRIVATE :分配一块私有的消息队列空间(系统随机分配)
key值 :根据key值分配一块指定的消息队列空间
msgflg:对消息队列空间的操作方式/权限
IPC_CREAT :创建消息队列 (如果key=0,不需要IPC_CREAT也能创建空间)
IPC_EXCL :空间检测 (检测消息队列空间是否存在)
<如果消息队列已存在,跳过创建,直接使用>
一般用法:IPC_CREAT | 0764
返回值:
成功:创建的消息队列对应的msqid --> 操作消息队列空间必须使用msqid
失败:-1
key值作为内核层分配空间的索引,每一个key值对应一块固定的空间。key值不变,空间固定!
key值类似于注册码,是一串很大的整型数据。
它是通过一个文件名和一个整型数据结合生成的! 文件名和整型数据都没有意义,仅仅是生成key值的基数!
key值生成的函数: ftok();
key_t ftok(const char *pathname, int proj_id);
函数功能:利用pathname和proj_id合成一个key值。返回值返回
形参列表:
pathname:文件名 (存在)
proj_id:整型数据
返回值:
成功:生成的key值
失败:-1
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函数功能:往消息队列中发送消息
形参列表:
msqid:消息队列空间的操作节点 --> 指向要操作的消息队列空间
msgp:消息结构体指针 --> 指向要发送的消息
struct s_msg{ /*msgp定义的参照格式*/
long type; /* 必须大于0,消息类型 */
char mtext[256]; /*消息正文,可以是其他任何类型*/
} msgp;
msgsz:消息内容的长度 --> 消息正文长度 (实际发送的消息内容长度)
msgflg:对消息队列空间的操作方式
IPC_NOWAIT:非阻塞的发送
0:阻塞发送 (正常模式)
返回值:
成功:0
失败:-1
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
函数功能:从消息队列中接收一条消息
形参列表:
msqid:消息队列msqid --> 指向要操作的消息队列空间
msgp:结构体指针 --> 指向存放接收到的消息的缓存区
msgsz:最多接收多少个字节的消息内容
msgtyp:接收消息的类型 (指定能够接收什么类型的消息)
< 0 :接收在msgtyp绝对值范围内的最小的消息类型的第一个消息
= 0 :接收消息队列中第一个消息 (任何类型)
> 0 :接收msgtyp类型的第一个消息 对应msgsnd中的msgp.type 。
msgflg:对消息队列空间的操作方式
0:阻塞接收、接收指定类型的消息、消息长度大于能接收上限,消息不接收,返回错误码
IPC_NOWAIT:非阻塞的接收
MSG_EXCEPT:接收消息队列中除了msgtyp类型之外的任何类型的第一个消息
(必须msgtyp>0,才能使用该宏)
MSG_NOERROR:如果消息长度大于能接收消息的最大长度,接收能接收的前面部分,后面部分丢弃
返回值:
成功:实际接收的消息内容字节数
失败:-1