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);
}
运行结果: