ftok函数
系统建立IPC通讯,(消息队列、信号量和共享内存)时必须指定一个ID值。通常情况下,该ID值通过ftok函数得到。
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int id);
pathname:指定的文件名(已经存在),一般使用当前目录
id:子序号。虽然是int类型,但是只是用8bits(1-255)。
msgget函数
//创建或打开消息队列:成功返回队列ID,失败返回-1
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
key:函数返回值或IPC_PRIVATE
msgflg:IPC_CREAT创建新的消息队列
msgsnd和msgrcv函数
msgget函数:添加信息,成功返回0,失败返回-1
msgrcv函数:读取信息,成功返回消息数据的长度,失败返回-1
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:消息队列识别码(ID值)
msgp:指向信息缓冲区的指针,此位置用来暂时存储发送和接收,的消息,是一个用户可定义的通用结构
msgsz:消息的大小
msgflg:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
msqid:消息队列识别码(ID值)
msgp:指向信息缓冲区的指针,此位置用来暂时存储发送和接收,的消息,是一个用户可定义的通用结构
msgsz:消息的大小
msgtyp:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。
type == 0,返回队列中的第一个信息;
type > 0,返回队列中消息类型为type的第一个信息;
type < 0,返回队列中消息类型值小于或等于type绝对值的消息,如果有多个,则取类型值最小的信息。
msgflg:该参数是控制函数行为的标志,这里取值为0,表示忽略,如要用请自行查阅相关资料。
msgctl函数
控制消息队列,成功返回0,失败返回-1
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msqid:消息队列识别码(ID值)
cmd:
IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID:从系统内核中移走消息队列。
buf:这里设置为NULL,不做改变
/*********************读取代码*********************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf readBuf;
struct msgbuf sendBuf={999,"Thank you for respond"};
key_t key;
key = ftok(".",1);
printf("key = %x\n",key);
int getId=msgget(key,IPC_CREAT|0777);
if(getId == -1){
printf("get que failed\n");
}
msgrcv(getId,&readBuf,sizeof(readBuf.mtext),888,0);
printf("read from que:%s\n",readBuf.mtext);
msgsnd(getId,&sendBuf,strlen(sendBuf.mtext),0);
msgctl(getId,IPC_RMID,NULL);
return 0;
}
/*********************发送代码*********************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
long mtype;
char mtext[128];
};
int main()
{
struct msgbuf sendBuf = {888,"this is message que"};
struct msgbuf readBuf;
key_t key;
key = ftok(".",1);
printf("key = %x\n",key);
int getId=msgget(key,IPC_CREAT|0777);
if(getId == -1){
printf("get que failed\n");
}
msgsnd(getId,&sendBuf,strlen(sendBuf.mtext),0);
msgrcv(getId,&readBuf,sizeof(readBuf.mtext),999,0);
printf("%s\n",readBuf.mtext);
msgctl(getId,IPC_RMID,NULL);
return 0;
}