您的位置:首页 > 其它

进程通信之消息队列

2018-03-28 17:04 239 查看
消息队列

消息队列就是存放消息(数据)的链表,这个链表由内核维护,并且由一个消息队列的标识符标识。

消息发送者可以指定消息发送的类型,接受这也可以依据类型来接受。接受者按照特定类型遵循先进先出的原则。

当进程试图给一个满的队列发送消息时,它会被阻塞;同样的,当进程试图从一个空的队列读消息时也会被阻塞。

但当一个进程试图读取某一个特定类型的消息,但没有这类型的消息而失败时,不会被阻塞。

消息队列相关函数

msgget函数

原型

int msgget(key_t key,int msgflg)


功能

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

参数:

key:某个消息队列的名字

msgflg:由九个权限标志构成,他们用法和创建文件时使用的mode模式标志一样

返回值

成功返回一个非负数,即改消息队列的标识码;失败返回-1

msgctl函数

原型

int msgctl(int msqid,int cmd,struct msqid_ds* buf)


功能

消息队列的控制函数

参数

msqid:由msgger函数返回的消息队列标识码  cmd:是将要采取的动作(有三个可取值)

IPC_STAT-把msqid_ds结构中的数据设置为消息队列的当前关联值

IPC_SET-在进城由足够的权限的前提下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值

IPC_RMID-删除消息队列

返回值

成功返回0,失败返回1

msgsnd函数

原型

int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg)


参数

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

msgp:是一个指针,指针指向准备发送的消息

msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型

msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情

msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误。

返回值

成功返回0;失败返回-1

msgrcv函数

原型

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);


功能

是从一个消息队列接收消息

参数

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

msgp:是一个指针,指针指向准备接收的消息

msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型

msgtype:它可以实现接收优先级的简单形式

msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事

返回值

成功返回实际放到接收缓冲区里去的字符个数,失败返回-1

ftok函数

原型

key_t ftok(const char* pathname,int proj_id)


功能

生成一个key_t类型的数据,如果参数相同则生成的数据相同

参数:

pathname:路径名

proj_id:8进制数

返回值

返回key_t类型的数据

相关命令

ipcs -q
:显示IPC资源

ipcrm -q
:手动删除IPC资源

消息队列特点

消息队列是一个消息的链表,其具有特定的优先级

消息队列的生命周期随内核

消息的传输面向数据报

消息队列是全双工通信

可以通过消息类型有选择的接受消息

代码实现

消息队列代码实例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息