linux IPC -msg 消息队列
2013-04-28 00:00
441 查看
1.进程通信的方式:消息队列、 共享内存段 、信号量、管道、SOCKET等。
2.linux 下IPCS命令的作用:报告进程间通信设施状态-
ipcs -q查看消息队列,-m查看内存,-s查看信号量 -a查看上述所有信息
3.消息队列:msg
3.1 消息队列创建:int msgget(key_t key,IPC_CREAT|IPC_EXCL|(权限));//成功返回消息队列标识值
key_t 为消息队列关联值 : IPC_PRIVATE
IPC_CREAT,如果队列存在则打开,不存在则创建。
IPC_EXCL本身没什么用,和IPC_CREAT一起使用时,如果队列存在则返回错误-1
函数调用成功,则返回 消息队列标识值,错误时,返回不同值,如,已存在但没有权限打开,没有内存,已达到系统最大消息值,不存在但没有使用IPC_CREAT...
3.2 写消息到消息队列中
int msgsnd(int msqid,void * ptr,size_t nbytes ,int flags); //成功返回0
msqid 消息队列标识,ptr 消息结构指针,nbytes 消息长度,flags :0表示忽略。
ptr 指针,指向的是一个可定义的消息缓冲区,用来存储要发送和接收的消息。定义如下:
struct msgbuf
{
long mtype;//消息类型 >0
char mtext[1];//消息文本
}
3.3 从消息队列中读消息
ssize msgrcv(int msqid,void * ptr,size_t nbytes,long type,int flags);//成功返回接收到的消息数据长度。
nbytes 要接收的数据长度(应该是msgbuf中定义的数组大小+1),如果接收到的数据长度比nbytes大,则按照flags进行处理:
flags: IPC_NOWAIT 队列中没有要找到的消息时 出错返回。errno 为ENOMSG
o 函数阻塞
type :0 则从队列头中开始取消息 ,>0 则找到消息队列中消息类型为type在第一个取消息,<0 则返回消息类型小于等于type绝对值的最小值的第1条消息
3.4 操作消息队列 int msgctl(int msqid,int cmd,struct msqid_ds * buf);
buf 为cmd命令参数。
cmd: IPC_STAT 取消息队列中msqid_ds 数据
IPC_SET设置消息队列的msqid_ds 数据
IPC_RMID 删除消息队列
linux/msg.h 中定义,如下所示:
struct msqid_ds{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
...
...
};
--http://blog.csdn.net/renrenhappy/article/details/5862254
2.linux 下IPCS命令的作用:报告进程间通信设施状态-
ipcs -q查看消息队列,-m查看内存,-s查看信号量 -a查看上述所有信息
3.消息队列:msg
3.1 消息队列创建:int msgget(key_t key,IPC_CREAT|IPC_EXCL|(权限));//成功返回消息队列标识值
key_t 为消息队列关联值 : IPC_PRIVATE
IPC_CREAT,如果队列存在则打开,不存在则创建。
IPC_EXCL本身没什么用,和IPC_CREAT一起使用时,如果队列存在则返回错误-1
函数调用成功,则返回 消息队列标识值,错误时,返回不同值,如,已存在但没有权限打开,没有内存,已达到系统最大消息值,不存在但没有使用IPC_CREAT...
3.2 写消息到消息队列中
int msgsnd(int msqid,void * ptr,size_t nbytes ,int flags); //成功返回0
msqid 消息队列标识,ptr 消息结构指针,nbytes 消息长度,flags :0表示忽略。
ptr 指针,指向的是一个可定义的消息缓冲区,用来存储要发送和接收的消息。定义如下:
struct msgbuf
{
long mtype;//消息类型 >0
char mtext[1];//消息文本
}
3.3 从消息队列中读消息
ssize msgrcv(int msqid,void * ptr,size_t nbytes,long type,int flags);//成功返回接收到的消息数据长度。
nbytes 要接收的数据长度(应该是msgbuf中定义的数组大小+1),如果接收到的数据长度比nbytes大,则按照flags进行处理:
flags: IPC_NOWAIT 队列中没有要找到的消息时 出错返回。errno 为ENOMSG
o 函数阻塞
type :0 则从队列头中开始取消息 ,>0 则找到消息队列中消息类型为type在第一个取消息,<0 则返回消息类型小于等于type绝对值的最小值的第1条消息
3.4 操作消息队列 int msgctl(int msqid,int cmd,struct msqid_ds * buf);
buf 为cmd命令参数。
cmd: IPC_STAT 取消息队列中msqid_ds 数据
IPC_SET设置消息队列的msqid_ds 数据
IPC_RMID 删除消息队列
linux/msg.h 中定义,如下所示:
struct msqid_ds{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
...
...
};
--http://blog.csdn.net/renrenhappy/article/details/5862254
相关文章推荐
- 深入理解Linux进程间通信(IPC)-- 消息队列msg
- linux IPC-消息队列 的内核限制
- linuxIPC之消息队列
- linux ipc system v 消息队列源码
- Linux 进程间通信 (IPC) // 消息队列
- IPC主题一 :消息队列(msg)
- 【Linux】进程间通信(IPC)之消息队列详解及测试用例
- UNIX/Linux进程间通信IPC系列(四)消息队列
- 细说linux IPC(十):system V 消息队列
- linux下IPC之消息队列
- 细说linux IPC(九):posix消息队列
- Linux IPC实践(4) --System V消息队列(1)
- linux—进程通信IPC--system v-消息队列
- Linux_ msg 消息队列
- 消息队列(Message Queues)有关的数据结构 ipc_perm msgbuf msg msqid_ds
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
- Linux IPC实践(4) --System V消息队列(1)
- Linux编程实践----消息队列的演示(IPC)
- [linux系统编程]System V IPC 消息队列
- linux IPC之消息队列