XSIPC(消息队列,信号,和共享内存)
消息队列提供一种从一个进程向另一进程发送数据块的方法;每个数据块都有自己的类型,与管道不同的的是,消息队列是基于消息的,而管道是基于字节流的;
//comm.h
#ifndef _COMM_H_
#define _COMM_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
#define PATHNAME "."
#define PROJ_ID 0x6664
#define SERVER_TYPE 1
#define CLIENT_TYPE 2
struct msgbuf
{
long mtype;
char mtext[1024];
};
int creatMsgQueue();
int sendMsg();
int rsvMsg();
int destoryMsg();
#endif
#include"common.h"
int commQueue(int flag)
{
key_t _key= ftok(PATHNAME,PROJ_ID);
if(_key<0)
{
perror("ftok");
return -1;
}
int msgid=msgget(_key,flag);
if(msgid<0)
{
perror("msgget");
return -1;
}
return msgid;
}
int creatMsgQueue()
{
return commQueue(IPC_CREAT|IPC_EXCL|0666);
}
int getMsgQueue()
{
return commQueue(IPC_CREAT);
}
int sendMsg(int msgid,int who,char* msg)
{
struct msgbuf buf;
strcpy(buf.mtext,msg);
buf.mtype=who;
if(msgsnd(msgid,&buf,1024,0)<0)
{
perror("msgsnd");
return -1;
}
return 0;
}
int rsvMsg(int msgid,int who,char* out)
{
struct msgbuf buf;
if(msgrcv(msgid,(void *)&buf,1024,who,0)<0)
{
perror("msgrcv");
return -1;
}
strcpy(out,buf.mtext);
return 0;
}
//没有销毁的代码;
//server.c
int main()
{
char buf[1024];
int msgid=creatMsgQueue();
while(1)
{//xian du zai xie
rsvMsg(msgid,CLIENT_TYPE,buf);
printf("%s\n",buf);
printf("enter data ");
ssize_t s=read(0,buf,sizeof(buf)-1);
if(s>0)
{
buf[s-1]=0;
sendMsg(msgid,SERVER_TYPE,buf);
}
}
}
int main()
{
char buf[1024];
int msgid=getMsgQueue();
// printf("%d",msgid);
while(1)
{//xian xie zai du
buf[0]=0;
printf("enter data ");
fflush(stdout);
ssize_t s=read(0,buf,sizeof(buf)-1);
if(s>0)
{
buf[s-1]=0;
sendMsg(msgid,CLIENT_TYPE,buf);
}
//char bufrcv[1024];
rsvMsg(msgid,SERVER_TYPE,buf);
printf("%s",buf);
}
}
使用ipcs -q可以查看消息队列;
使用ipcrm -q 可以删除消息队列;