微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程间通信之:消息队列

进程间通信之:消息队列

时间:09-13 来源:互联网 点击:

ey*/

if((key=ftok(.,'a'))==-1)

{

perror(ftok);

exit(1);

}

/*创建消息队列*/

if((qid=msgget(key,IPC_CREAT|0666))==-1)

{

perror(msgget);

exit(1);

}

printf(Openqueue%d\n,qid);

while(1)

{

printf(Entersomemessagetothequeue:);

if((fgets(msg.msg_text,BUFFER_SIZE,stdin))==NULL)

{

puts(nomessage);

exit(1);

}

msg.msg_type=getpid();

/*添加消息到消息队列*/

if((msgsnd(qid,msg,strlen(msg.msg_text),0))0)

{

perror(messageposted);

exit(1);

}

if(strncmp(msg.msg_text,quit,4)==0)

{

break;

}

}

exit(0);

}

以下是消息队列接收端的代码:

/*msgrcv.c*/

#includesys/types.h>

#includesys/ipc.h>

#includesys/msg.h>

#includestdio.h>

#includestdlib.h>

#includeunistd.h>

#includestring.h>

#defineBUFFER_SIZE512

structmessage

{

longmsg_type;

charmsg_text[BUFFER_SIZE];

};

intmain()

{

intqid;

key_tkey;

structmessagemsg;

/*根据不同的路径和关键字产生标准的key*/

if((key=ftok(.,'a'))==-1)

{

perror(ftok);

exit(1);

}

/*创建消息队列*/

if((qid=msgget(key,IPC_CREAT|0666))==-1)

{

perror(msgget);

exit(1);

}

printf(Openqueue%d\n,qid);

do

{

/*读取消息队列*/

memset(msg.msg_text,0,BUFFER_SIZE);

if(msgrcv(qid,(void*)msg,BUFFER_SIZE,0,0)0)

{

perror(msgrcv);

exit(1);

}

printf(Themessagefromprocess%d:%s,msg.msg_type,msg.msg_text);

}while(strncmp(msg.msg_text,quit,4));

/*从系统内核中移走消息队列*/

if((msgctl(qid,IPC_RMID,NULL))0)

{

perror(msgctl);

exit(1);

}

exit(0);

}

以下是程序的运行结果。输入“quit”则两个进程都将结束。

$./msgsnd

Openqueue327680

Entersomemessagetothequeue:firstmessage

Entersomemessagetothequeue:secondmessage

Entersomemessagetothequeue:quit

$./msgrcv

Openqueue327680

Themessagefromprocess6072:firstmessage

Themessagefromprocess6072:secondmessage

Themessagefromprocess6072:quit

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top