1.消息队列实现进程间的通信
服务端
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
typedef struct{
long msgtype; //消息类型
char data[1024]; //消息正文
}Msg;
#define SIZE sizeof(Msg)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建key值
int key;
if(-1==(key=ftok("/",'k'))){
ERR_MSG("ftok error");
return -1;
}
//创建消息队列
int msgid;
if(-1==(msgid=msgget(key,IPC_CREAT|0664))){
ERR_MSG("msgget error");
return -1;
}
//向消息队列中发送信息
Msg msg={.msgtype=1};
while(1){
printf("请输入消息内容>>>");
fgets(msg.data,sizeof(msg.data),stdin);
msg.data[strlen(msg.data)-1]=0;
//将消息发送到消息队列
if(-1==msgsnd(msgid,&msg,SIZE,0)){
ERR_MSG("msgsnd error");
return -1;
}
//退出
if(!strcmp(msg.data,"quit")){
break;
}
}
return 0;
}
客户端
#include <myhead.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
typedef struct{
long msgtype; //消息类型
char data[1024]; //消息正文
}Msg;
#define SIZE sizeof(Msg)-sizeof(long)
int main(int argc, const char *argv[])
{
//创建key值
int key;
if(-1==(key=ftok("/",'k'))){
ERR_MSG("ftok error");
return -1;
}
//创建消息队列
int msgid;
if(-1==(msgid=msgget(key,IPC_CREAT|0664))){
ERR_MSG("msgget error");
return -1;
}
//从消息队列中取数据
Msg msg;
while(1){
//接收信息
if(-1==msgrcv(msgid,&msg,SIZE,0,0)){
ERR_MSG("msgrcv error");
return -1;
}
printf("rcv:%s\n",msg.data);
//退出
if(!strcmp(msg.data,"quit")){
break;
}
}
//删除消息队列
msgctl(msgid,IPC_RMID,NULL);
return 0;
}