在于都apue的消息队列部分时,发现书中并没有相关的实例,这里自己写了一个简单的小例子,加深对消息队列的理解,子进程从终端读取消息传入消息队列,
父进程,读取消息队列中的消息,并打印到终端。
-
#include "apue.h"
-
#include <sys/msg.h>
-
#include <sys/ipc.h>
-
struct mymesg{ //定义消息结构
-
long mtype; //消息类型
-
char mtext[512]; //消息实际数据
-
};
-
int
-
main(void)
-
{
-
struct mymesg mesg;
-
int pid;
-
int mesgno;
-
mesg.mtype=1;
-
int running=1;
-
ssize_t m;
-
key_t key;
-
if((key=ftok("megqueue.c",'a'))==-1)//使用ftok生成创建消息队列要使用的key,注意第一个参数必须是一个现存文件的路径
-
printf("ftok error\n");
-
if((mesgno=msgget(key,IPC_CREAT|S_IRUSR|S_IWUSR))==-1)//创建消息队列
-
printf("creat message queue error\n");
-
printf("messgae no:%d\n",mesgno);//输出消息队列标示符
-
if((pid=fork())<0)
-
printf("fork error\n");
-
else if(pid==0) //子进程从终端读取消息传入消息队列
-
{
-
while(running)
-
{
-
if(fgets(mesg.mtext,512,stdin)!=NULL)
-
{printf("%s\n",mesg.mtext); msgsnd(mesgno,&mesg,521,0);}
-
else
-
{
-
printf("getmsg error\n");
-
break;
-
}
-
}
-
}
-
else //父进程,读取消息队列中的消息,并打印到终端
-
{
-
while((m=msgrcv(mesgno,&mesg,512,0,MSG_NOERROR))!=-1)
-
printf("parent:%s\n",mesg.mtext);
-
printf("over\n");
-
}
-
exit(0);
-
}
运行结果:
注意CTRL+C结束进程后,消息队列并没有删除
阅读(2765) | 评论(0) | 转发(0) |