【记录】system v ipc(2) 消息队列
来源:互联网 发布:奴婢知奴婢知错跪罚 编辑:程序博客网 时间:2024/05/16 12:25
消息队列类似有名管道,也是用于进程间传递数据,由于有类型的区分可以细分出不同的进程写入的数据。
使用步骤:
1、先自定义一个包含long类型变量的结构体
2、使用ftok创建一个key_t变量
3、使用msgget()创建一个消息队列
4、使用msgsnd()/msgrcv()发送接收数据
(5、使用msgctl()删除队列)
int msgget(key_t, int flag)
key:ftok()生成的key值
flag:操作消息队列的标志,与open()类似,”IPC_CREAT|0666“表示以0666权限(rw-rw-rw-)创建或打开消息队列
返回值:消息队列的id,错误返回-1
int msgsnd(int msgid, const void *msgp, size_t size, int flag )
msgid:msgget生成的id
msgp:自定义的结构体,包含要发送的数据
size:发送数据大小
flag:0表示发送完才返回值,IPC_NOWAIT(数值为2048)表示开始发送便返回值
返回值成功0,失败-1
int msgrcvr(int msgid, void *msgp, size_t size, long msgtype, int flag )
msgid:msgget生成的id
msgp:自定义的结构体地址,储存要接收的数据
size:接收数据大小
msgtype:消息的类型,也就是结构体变量中long变量的数值,只有符合的才会接收
flag:0表示直到接收到否则一直阻塞,IPC_NOWAIT(数值为2048)表示没有值便返回ENOMSG
返回值成功返回接收到的消息长度,失败-1
例子:
发送端:
#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>struct person{long type;int age;char sex;char name[16];};struct person initking(struct person king){king.type = 9;king.age = 49;king.sex = 'f';snprintf(king.name, 16, "Peter");return king;}int main(void){key_t key;key = ftok(".", 201);int msgid;if((msgid = msgget(key, IPC_CREAT|0666)) == -1){perror("msgget error");exit(1);}struct person king;king = initking(king);if(msgsnd(msgid, &king, sizeof(struct person), 0) == -1){perror("sendmsg error");exit(1);}return 0;}
接收端:
#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>struct person{long type;int age;char sex;char name[16];};int main(void){key_t key;key = ftok(".", 201);int msgid;if((msgid = msgget(key, IPC_CREAT|0666)) == -1){perror("msgget error");exit(1);}struct person *king = malloc(sizeof(struct person));if(msgrcv(msgid, king, sizeof(struct person), 9, 0) == -1){perror("sendmsg error");exit(1);}printf("name = %s\nage = %d\nsex = %c\n", king->name, king->age, king->sex);msgctl(msgid, IPC_RMID, NULL);return 0;}
编译
cc msglist_revc.c -o msglist_revccc msglist_send.c -o msglist_send
运行结果zsmd@ubuntu:~/sys_cmd/systemv$ ./msglist_send zsmd@ubuntu:~/sys_cmd/systemv$ ./msglist_revc name = Peterage = 49sex = f注意:自定义的结构体中long type,“type“变量名可以随意改变,接收时最好使用指针保存接收的数据,否则容易段错误。
- 【记录】system v ipc(2) 消息队列
- 消息队列(system V IPC)
- Linux IPC实践(5) --System V消息队列(2)
- Linux IPC实践 --System V消息队列(2)
- Linux IPC实践(5) --System V消息队列(2)
- IPC之System V 消息队列 (代码实现)
- 细说linux IPC(十):system V 消息队列
- linux ipc system v 消息队列源码
- Linux ipc------System V消息队列
- System V IPC & POSIX IPC(一):消息队列
- Linux C编程--进程间通信(IPC)5--System V IPC 机制1--消息队列
- Linux C编程--进程间通信(IPC)5--System V IPC 机制1--消息队列
- System V消息队列(2)
- 消息队列(System V)
- XSI IPC——System V消息队列
- [linux系统编程]System V IPC 消息队列
- Linux IPC实践(4) --System V消息队列(1)
- Linux IPC实践(6) --System V消息队列(3)
- 我的网站
- Java的多态
- 学习一下
- 对象内存布局 (10)
- CentOS 安装配置
- 【记录】system v ipc(2) 消息队列
- 对象内存布局 (11)
- 【PHP SDK for OpenStack/Rackspace APIs】入门指南
- 全部后台进程简介
- Android中资源文件夹res/raw和assets的使用
- 还在使用vc6.0吗??vs2010吧
- 一个ImageView和Handler的例子
- 安装 SCOM
- C++中的 namespace