linux中的c语言编程消息传递系统.doc
操作系统第五次实验
张焓
实验名称:
项FH消息队列通信
实验目的:
服务进程奴有一个,接收个客户进程以消息形式发出的14题,接收键盘输入作为回答, 再以消息形式送给提问的程序。
各客户进程接收键盘输入作为问题,以消息形式发给服务进程,等待接收服务进程发来 的回答消息,再开始下-?轮的循环。
程序不停执行,直到用户川ctrl+c杀死进程
程序不停执行,过到用户键入end,进程结朿执行
实验方法
(1>首先编写客广进程:妲含需要用到的头文件,并定义结构体msgform作为报文结构
用于存放报文:
^include
#include
^include
#lnclude
#include
struct msgform
"long ntype; char ntext[256];
};
作一些定义及声明:
tnt nain()
{
struct nsgforn nsg; tnt runnlng=l;
Int pid;
tnt nsgqid=-1,reval=-1; char buffer[256];
创建消息队列,并添加必要的错误处理,标识码1234:
nsgqld=nsgget((key_t)1234,0666|IPC_CREAT); if(nsgqid==-l)
{
printf(Mnsg create error!!\n"); exU(EXIT-FAILURE);
}
接收消息队列中的报文,添加必要的错误处理,并在屏幕打印接收到的报文消息, 为了方便观察,我们在这甩顺带显示一下进程的pid。另外,在a情况下此段程序如阁,在 b情况卜,将 部分的 符去掉即可:
pid=getpid(); nsg.ntype = 0; while(running)
If(nsgrcv(nsgqid > &nsg,256,ife)==-l)
{
prlntf("client:nsg receive error!!\nM); extt(EXIT-FAILURE);
}
prlntf("client:receive fron pid Xd you write:Xs\nM,pld,nsg.ntext);
//if(strncnp(nsg.ntextf ”end”, 3) == 0)
//running =6;
}
清空并删除消息队列,并且添加必要的错误处理:
Iif(nsgctl(nsgqid,IPC_RMID,0)==-1)
prlntf(Mnsgctl failed\nM); exit(EXIT^FAILURE);
I }
如整个程序正常运行,则退出进程:
extt(EXIT_SUCCESS);
,
编写服务进程:包含需耍用到的尖文件,并定义结构体msgform作为报文结构用于
存放报文(同⑴):
#include
^Include
#tnclude
井include
#tnclude|
struct nsgforn
{
long ntype; char ntext[256];
};
⑻在服务进程中启动客户进程:
int nain()
{
int child;
If((child=fork())==0)
{
execlp(H./clientM,(char*) 6);
}
作一些定义及声明:
struct nsgforn nsg; int running=l; int pld;
int nsgqld=-1f reval=-1; char buffer[256];
创建消息队列,并添加必要的错误处理,标识码1234:
nsgqld=nsgget((key^t)1234,0666 丨IPC^CREAT); if(nsgqid==-l)
{
printf(wnsg create error!!\n"); extt(EXIT FAILURE);
} '
从键盘输入一组字符串,存入临吋的字符串数组作为报文内容,并定义报文类型。 为方便观察,在屏幕打印服务进程接收到的信总的报文消思,为了方便观察,我们在这里顺 带显示一下进程的pid:
pid=getpid();
nsg.ntype=0;
while(runnlng)
{
printf(wenter:w);
fgets(Guffer\2S6,st(Hn);
prtntf(Hserver:receive ftor pid Xd you write:Xs\nM,pidfbuffer);
strcpyCnsg.ntext,buffer);
nsg.ntype=l;
将报文写入到消息队列中的,添加必耍的