IPC -- 消息队列
来源:互联网 发布:张博士医考中心网络课 编辑:程序博客网 时间:2024/05/21 08:43
API介绍:
ftok函数不多说了 ,就是返回一个key
1. int msgget(key_t key, int msgflg);
第一个参数是ftok返回的key值,
第二个参数是标识位,IPC_CREAT,根据key值创建一个新的消息队列,返回这个消息队列的描述符;
如果有和key相关的消息队列存在,返回这个消息队列的描述符;
返回值是消息队列的描述符;
2. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
第一个参数是消息队列描述符,表示你要向哪个消息队列发消息,
第二个参数是一个结构体指针
struct msgbuf {
long mtype; 发送的类型,必须大于0;
char mtext[1]; 发送的内容;自定义数组
第四个参数是0或者IPC_NOWAIT ,如果为0,当消息队列满了时,他会等待消息队列空闲,
如果是IPC_NOWAIT 消息队列满了时 它会报错 EAGIAN;
3. ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
第一个参数是消息队列的描述符,表示要接收哪个消息队列的消息。
第二个参数是 一个结构体指针,和msgsnd里面的第二个参数的结构体一样,
第三个参数是 结构体中 mtest[]数组的容量大小,
会阻塞,直到有相同类型的消息出现,如果是IPC_NOWAIT,则不会阻塞,直接返回空消息。
返回值是接收到的消息的大小;
4.int msgctl(int msqid, int cmd, struct msqid_ds *buf);
第一个参数是消息队列的描述符;
第二个参数是指令,表示要对这个消息队列执行什么命令,一般用到IPC_STAT,IPC_RMID。
接收端代码:
运行结果:
ftok函数不多说了 ,就是返回一个key
1. int msgget(key_t key, int msgflg);
第一个参数是ftok返回的key值,
第二个参数是标识位,IPC_CREAT,根据key值创建一个新的消息队列,返回这个消息队列的描述符;
如果有和key相关的消息队列存在,返回这个消息队列的描述符;
msgflg为:IPC_CREAT|IPC_EXCL时,表示如果有和key相关的消息队列存在,返回错误代码;创建失败。
返回值是消息队列的描述符;
2. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
第一个参数是消息队列描述符,表示你要向哪个消息队列发消息,
第二个参数是一个结构体指针
struct msgbuf {
long mtype; 发送的类型,必须大于0;
char mtext[1]; 发送的内容;自定义数组
};
这个数组需要自己定义的,但第一个参数必须是long类型的变量;
第三个参数是结构体中 mtext[]数组内容的大小。第四个参数是0或者IPC_NOWAIT ,如果为0,当消息队列满了时,他会等待消息队列空闲,
如果是IPC_NOWAIT 消息队列满了时 它会报错 EAGIAN;
3. ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
第一个参数是消息队列的描述符,表示要接收哪个消息队列的消息。
第二个参数是 一个结构体指针,和msgsnd里面的第二个参数的结构体一样,
第三个参数是 结构体中 mtest[]数组的容量大小,
第四个参数是要接收的消息的类型,即和msgsnd函数的第二个参数中定义的mtype一致;这个参数可以是负数,
表示 |msgtyp| 小于绝对值的所有类型都接收。如:msgtyp=-2,则接收类型为1,2的所有消息。
第五个参数也是表示 msgrcv行为的标识位,如果是0,表示当消息队列里面没有要接收的类型的消息时,会阻塞,直到有相同类型的消息出现,如果是IPC_NOWAIT,则不会阻塞,直接返回空消息。
返回值是接收到的消息的大小;
4.int msgctl(int msqid, int cmd, struct msqid_ds *buf);
第一个参数是消息队列的描述符;
第二个参数是指令,表示要对这个消息队列执行什么命令,一般用到IPC_STAT,IPC_RMID。
第三个参数是一个结构体指针 当获取消息队列的信息时会用到,如果是删除消息队列,这个参数置为空。
发送端代码:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h>void err(char *p){ perror(p); exit(0);}int main(){ key_t key = ftok(".",888); if(key == -1) err("ftok"); int msgid = msgget(key,IPC_CREAT|0660); if(msgid == -1 ) err("msgget"); struct msg{ long mtype; char buf[1024]; }; struct msg m; m.mtype=2; strcpy(m.buf,"I'm coming! "); if(msgsnd(msgid,(const void *)&m,strlen(m.buf),IPC_NOWAIT) == -1) err("msgsnd"); printf("buf = %s\n",m.buf);}
接收端代码:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h>void err(char *p){ perror(p); exit(-1);}int main(){ key_t key = ftok(".",888); if(key == -1) err("ftok"); int msgid=msgget(key,IPC_CREAT|0660); if(msgid == -1) err("msgget"); struct msg{ long mtype; char buf[1024]; }; struct msg m; msgrcv(msgid,(void*)&m,1024,2,IPC_NOWAIT); printf("buf = %s\n",m.buf);}
运行结果:
1 0
- linux IPC-消息队列
- linux IPC-消息队列
- IPC-msg 消息队列
- Linux IPC- 消息队列
- IPC之消息队列
- IPC-消息队列
- 【IPC】Posix消息队列
- IPC之消息队列
- ipc--消息队列
- IPC -- 消息队列
- linux IPC--消息队列
- IPC 消息队列 msg
- boost ipc 消息队列
- IPC之消息队列
- IPC之消息队列
- IPC-消息队列
- IPC-消息队列
- IPC--消息队列
- Java 序列化
- 图像FFT
- 微信端开发H5页面的时候,audio标签在苹果机上无法进行自动播放
- angular2时间控件datepicker的使用
- java
- IPC -- 消息队列
- 在linux下,修改mysql的用户密码。
- Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
- 如何求解前n个正整数k次方的和的一般公式?
- Windows多线程
- 技术中的哲学(二)
- MySQL中的变量定义
- 【Android尺寸单位】px、in、mm、pt、dp/dip、sp
- 树结构练习——判断给定森林中有多少棵树(并查集)