IPC -- 消息队列

来源:互联网 发布:张博士医考中心网络课 编辑:程序博客网 时间:2024/05/21 08:43
API介绍:
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