/* 收发方式:Client()每发送一条消息,Server()就接收一条 */
/* 此方法不能保证一定能同步。对于不同速度的机器,如果没有其他耗时的进程,可以调整sleep的时间值而获得同步。*/
//msg.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75 /* 通信双方约定的队列关键字*/
struct msgform /* 消息结构 */
{ long mtype; /* 消息类型 */
char mtext[1030]; /* 消息正文 */
}msg;
int msgqid; /* 消息队列描述符 */
void Client()
{ int i; /* 局部变量i,消息类型(表示第几条消息)*/
msgqid=msgget(MSGKEY,0777); /* 创建消息队列, 访问权限为777 */
for(i=10;i>=1;i--)
{ msg.mtype=i; /* 指定消息类型 */
printf("(client %d) sent.\n",i); /* 打印消息类型 */
msgsnd(msgqid,&msg,1024,0);
/* 发送消息msg到msgqid消息队列,可以先把消息正文放到msg.mtext中*/
sleep(1); /* 等待接收。比较加上这一句和不加这一句的结果 */
}
exit(0);
}
void Server()
{ /* 获得关键字对应的消息队列描述符 */
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
do {
msgrcv(msgqid,&msg,1030,0,0); /* 从msgqid队列接收消息msg */
printf("(server %d)received.\n",msg.mtype); /* 打印消息类型 */
}while(msg.mtype!=1); /* 消息类型为1时,释放队列*/
msgctl(msgqid,IPC_RMID,0); /* 删除消息队列 */
exit(0);
}
void main()
{ int i;
while((i=fork())==-1); /* 创建子进程 */
if(!i) Server(); /* 子进程Server */
else
{ while((i=fork())==-1); /* 创建子进程 */
if(!i) Client(); /* 子进程Client */
}
wait(0); /* 等待子进程结束 */
wait(0); /* 等待子进程结束 */
}