一、键值生成
(1)发送
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//int msgget(key_t key, int msgflg);
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
// ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
// int msgflg);
struct msgbuf {
long mtype;/*内容类型*/
char mtext[128];/*内容*/
};
int main()
{
//1.huoqu
struct msgbuf sendbuf={888,"this us message from quen"};
struct msgbuf readbuf;
key_t key;
key=ftok(".",'z');
printf("key=%x\n",key);
int msgId=msgget(0x1235,IPC_CREAT|0777);
if(msgId==-1)
{
printf("get que failuer\n");
}
msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
printf("send over\n");
msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),988,0);
printf("return from get:%s\n",readbuf.mtext);
return 0;
}
运行结果:
(2)接收
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//int msgget(key_t key, int msgflg);
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
// ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
// int msgflg);
struct msgbuf {
long mtype;/*内容类型*/
char mtext[128];/*内容*/
};
int main()
{
//1.huoqu
struct msgbuf readbuf;
key_t key;
key=ftok(".",'z');
printf("key=%x\n",key);
int msgId=msgget(0x1235,IPC_CREAT|0777);
if(msgId==-1)
{
printf("get que failuer\n");
}
//2.jieshou
msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),888,0);
printf("read from que:%s\n",readbuf.mtext);
struct msgbuf sendbuf={988,"thank you for reach"};
msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
return 0;
}
运行结果:
ftok函数:
键值生成:
key = ftok(".", 1);
"."为当前路径
后面的值是id值,写什么都可以,可以是数字,也可以是字符。
二、当队列用完之后,要干掉队列,要用到的API是msgctl
msgctl的参数:
第一个参数是队列id:msgid。
第二个参数是指令cmd: 最常用的是IPC_RMID,作用是把消息队列的链表从内核中移除。
第三个参数一般写NULL。
(1)发送:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//1.int msgget(key_t key, int msgflg);
//2.int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//3.ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
// int msgflg);
struct msgbuf {
long mtype; /*内容类型*/
char mtext[128];/* 内容*/
};
int main()
{
//1.获取
struct msgbuf sendbuf={888,"this us message from quen"};
struct msgbuf readbuf;
key_t key;//定义键值
key=ftok(".",'z');
printf("key=%x\n",key);
int msgId=msgget(0x1235,IPC_CREAT|0777);
if(msgId==-1)
{
printf("get que failuer\n");
}
msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
printf("send over\n");
//2.接受
msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),988,0);
printf("return from get:%s\n",readbuf.mtext);
msgctl(msgId,IPC_RMID,NULL);
return 0;
}
运行结果:
(2)接收
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//1.int msgget(key_t key, int msgflg);
//2.int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//3.ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
// int msgflg);
struct msgbuf {
long mtype;/*内容类型*/
char mtext[128];/*内容*/
};
int main()
{
//1.获取
struct msgbuf readbuf;
key_t key;//定义键值
key=ftok(".",'z');
printf("key=%x\n",key);
int msgId=msgget(0x1235,IPC_CREAT|0777);
if(msgId==-1)
{
printf("get que failuer\n");
}
//2.接受
msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),888,0);
printf("read from que:%s\n",readbuf.mtext);
struct msgbuf sendbuf={988,"thank you for reach"};
msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
msgctl(msgId,IPC_RMID,NULL);
return 0;
}
运行结果:
注释:
0777,对文件具有可读可写的权限
——@上官可编程