进程通信之消息队列
2018-03-28 17:04
239 查看
消息队列
消息队列就是存放消息(数据)的链表,这个链表由内核维护,并且由一个消息队列的标识符标识。
消息发送者可以指定消息发送的类型,接受这也可以依据类型来接受。接受者按照特定类型遵循先进先出的原则。
当进程试图给一个满的队列发送消息时,它会被阻塞;同样的,当进程试图从一个空的队列读消息时也会被阻塞。
但当一个进程试图读取某一个特定类型的消息,但没有这类型的消息而失败时,不会被阻塞。
消息队列相关函数
msgget函数
原型
功能
用来创建和访问一个消息队列
参数:
key:某个消息队列的名字
msgflg:由九个权限标志构成,他们用法和创建文件时使用的mode模式标志一样
返回值
成功返回一个非负数,即改消息队列的标识码;失败返回-1
msgctl函数
原型
功能
消息队列的控制函数
参数
msqid:由msgger函数返回的消息队列标识码 cmd:是将要采取的动作(有三个可取值)
IPC_STAT-把msqid_ds结构中的数据设置为消息队列的当前关联值
IPC_SET-在进城由足够的权限的前提下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值
IPC_RMID-删除消息队列
返回值
成功返回0,失败返回1
msgsnd函数
原型
参数
msgid:由msgget函数返回的消息队列标识码
msgp:是一个指针,指针指向准备发送的消息
msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情
msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误。
返回值
成功返回0;失败返回-1
msgrcv函数
原型
功能
是从一个消息队列接收消息
参数
msgid: 由msgget函数返回的消息队列标识码
msgp:是一个指针,指针指向准备接收的消息
msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgtype:它可以实现接收优先级的简单形式
msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事
返回值
成功返回实际放到接收缓冲区里去的字符个数,失败返回-1
ftok函数
原型
功能
生成一个key_t类型的数据,如果参数相同则生成的数据相同
参数:
pathname:路径名
proj_id:8进制数
返回值
返回key_t类型的数据
相关命令
消息队列特点
消息队列是一个消息的链表,其具有特定的优先级
消息队列的生命周期随内核
消息的传输面向数据报
消息队列是全双工通信
可以通过消息类型有选择的接受消息
代码实现
☛消息队列代码实例
消息队列就是存放消息(数据)的链表,这个链表由内核维护,并且由一个消息队列的标识符标识。
消息发送者可以指定消息发送的类型,接受这也可以依据类型来接受。接受者按照特定类型遵循先进先出的原则。
当进程试图给一个满的队列发送消息时,它会被阻塞;同样的,当进程试图从一个空的队列读消息时也会被阻塞。
但当一个进程试图读取某一个特定类型的消息,但没有这类型的消息而失败时,不会被阻塞。
消息队列相关函数
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资源
消息队列特点
消息队列是一个消息的链表,其具有特定的优先级
消息队列的生命周期随内核
消息的传输面向数据报
消息队列是全双工通信
可以通过消息类型有选择的接受消息
代码实现
☛消息队列代码实例
相关文章推荐
- Linux C 进程间的IPC通信 之 消息队列(1)
- 进程间的通信---消息队列
- 进程通信2——消息队列
- 关于进程通信的消息队列相关函数
- linux进程通信之消息队列
- linux进程通信之消息队列
- Linux进程通信之消息队列
- Linux进程通信之POSIX消息队列
- 【linux高级环境编程学习笔记四】消息队列进程通信
- 【进程通信】消息队列简单例子
- linux先进程通信 管道方式和消息队列
- linux进程通信——消息队列(相互通信)
- linux进程通信---消息队列
- 消息队列不同进程之间通信
- Liunx进程间IPC通信—消息队列
- 多进程编程:Perl与C进程间的消息队列通信
- UNIX/LINUX编程学习之进程通信--消息队列
- linux消息队列进程通信
- Linux进程间的通信方式:运用消息队列通信
- Linux进程通信 消息队列