?
使用消息队列完成两个进程间的通信?
#include <myhead.h>
//定义一个发送消息的结构体
struct msgbuf
{
long mtype; //消息类型
char mtext[1024]; //消息正文大小
};
//宏定义正文大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
//1.创建key值
key_t key = ftok("/",'k');
if(key == -1)
{
perror("key create error");
return -1;
}
//key已经创建
printf("key = %#x\n",key);
//2.创建消息队列
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1)
{
perror("msgget error");
return -1;
}
printf("msgid = %d\n",msgid); //输出消息队列id号
struct msgbuf buf; //定义一个接收消息类型的变量
//创建进程
pid_t pid = -1;
pid =fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
//3.子进程从消息队列接收消息
buf.mtype=1;
while(1)
{
//将消息从消息队列中读取出来
msgrcv(msgid,&buf,SIZE,0,1);
//将读取的消息打印出来
printf("收到的消息:%s\n",buf.mtext);
//判断退出条件
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
//4.删除消息队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}
exit(EXIT_SUCCESS);
}
}else
{
while(1)
{
//输入消息内容
printf("请输入您要发送的消息内容:");
fflush(stdout);
scanf("%s",buf.mtext);
//将消息放入消息队列中
msgsnd(msgid,&buf,SIZE,0);
printf("发送成功\n");
//判断退出条件
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
waitpid(-1,NULL,WNOHANG);
}
}
return 0;
}
ubunt
#include <myhead.h>
//定义一个发送消息的结构体
struct msgbuf
{
long mtype; //消息类型
char mtext[1024]; //消息正文大小
};
//宏定义正文大小
#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
//1.创建key值
key_t key = ftok("/",'k');
if(key == -1)
{
perror("key create error");
return -1;
}
//key已经创建
printf("key = %#x\n",key);
//2.创建消息队列
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1)
{
perror("msgget error");
return -1;
}
printf("msgid = %d\n",msgid); //输出消息队列id号
struct msgbuf buf; //定义一个接收消息类型的变量
//创建进程
pid_t pid = -1;
pid =fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid > 0)
{
//3.子进程从消息队列接收消息
buf.mtype = 2;
while(1)
{
//将消息从消息队列中读取出来
msgrcv(msgid,&buf,SIZE,0,2);
//将读取的消息打印出来
printf("收到的消息:%s\n",buf.mtext);
//判断退出条件
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
//4.删除消息队列
if(msgctl(msgid,IPC_RMID,NULL)==-1)
{
perror("msgctl error");
return -1;
}
exit(EXIT_SUCCESS);
}
}else
{
while(1)
{
//输入消息内容
printf("请输入您要发送的消息内容:");
fflush(stdout);
scanf("%s",buf.mtext);
//将消息放入消息队列中
msgsnd(msgid,&buf,SIZE,0);
printf("发送成功\n");
//判断退出条件
if(strcmp(buf.mtext,"quit")==0)
{
break;
}
waitpid(-1,NULL,WNOHANG);
}
}
return 0;
}
ubu
?
?