随内核持续
键值
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(char *pathname, char proj)
pathname 文件名
proj 项目名, 不为0即可
返回文件名对应的键值
打开消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgget(key_t key, int msgflg)
key: 键值, 由ftok获得-->key参数为IPC_PRIVATE则创建新消息队列
msgflg: 标志位
IPC_CREATE 创建新的消息队列
IPC_EXCL 与IPC_CREAT一同使用, 如果消息队列已经存在, 则返回错误
IPC_NOWAIT 非阻塞
返回值: 返回与key对应的消息队列描述字
发送消息
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgsnd(int msqid, strcut msgbuf *msgp, int msgsz, int msgflg)
struct msgbuf{
long mtype;//消息的类型
char *mtext;//消息数据的首地址
}
接收消息
#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgrcv(int msqid, strcut msgbuf *msgp, int msgsz, long msgtyp, int msgflg)
//从msgid代表的消息队列中读取一个msgtyp类型的消息
//存储在msgp指向的msgbuf结构中, 队列中这条消息将被删除
示例
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
struct msg_buf
{
int mtype;
char data[255];
};
int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;
key=ftok("/tmp/2",'a');
printf("key =[%x]\n",key);
msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应*/
if(msgid==-1)
{
printf("create error\n");
return -1;
}
msgbuf.mtype = getpid();
strcpy(msgbuf.data,"test haha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
if(ret==-1)
{
printf("send message err\n");
return -1;
}
memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
if(ret==-1)
{
printf("recv message err\n");
return -1;
}
printf("recv msg =[%s]\n",msgbuf.data);
}