操作系统实验4

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四进程通信(二消息通信)

一、实验目的

熟悉管道通信,了解管道内数据的读取与写入过程;

学会创建管道、使用管道,实现父子进程间的通信;

熟悉各种管道通信时使用的函数;

熟悉共享内存的概念;

学会使用函数创建共享内存段,熟悉操纵共享内存的四个系统调用;

熟悉Linux下进程通信中的消息通信机制;

学会使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一定长度的消息的发送和接收程序。

二、实验内容

任务:

(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况。

(2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。

①为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。

②SERVER端建立一个Key为学号末3位的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER 每接收到一个消息后显示一句“(server)received”。

③CLIENT端使用key为学号末3位的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”。

④父进程在SERVER和CLIENT均退出后结束。

三、代码及运行结果分析

(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况。

1.程序1

代码:

#include

#include

#include

#define MSGKEY 204

struct msgform

{

long mtype;

char mtext [256];

}msg;

int msgqid;

main ()

{

int i ,pid, *pint;

extern cleanup();

for (i=0;i<20;i++)

signal (i,cleanup);

msgqid=msgget (MSGKEY,0777|IPC_CREAT);

for (;;)

{

msgrcv (msgqid,&msg,256,1,0);

pint=(int*)msg. mtext;

pid=*pint;

printf ("server:receive from pid %d\n",pid); msg.mtype=pid;

*pint=getpid();

msgsnd (msgqid,&msg,sizeof(int),0) ;

}

}

cleanup()

{

msgctl (msgqid,IPC_RMID,0);

exit();

}

后台运行程序1结果:

用ipcs命令查看:

2.程序2

代码:

#include

#include

#include

#define MSGKEY 204

struct msgform

{

long mtype;

char mtext [256];

};

main()

{

struct msgform msg;

int msgqid,pid, *pint;

msgqid=msgget(MSGKEY,0777);

pid=getpid();

pint=(int*)msg.mtext;

*pint=pid;

msg.mtype=1;

msgsnd(msgqid,&msg,sizeof(int),0);

msgrcv(msgqid,&msg,256,pid,0);

printf("client:receive from pid%d\n",*pint); }

运行程序2并用ipcs命令查看:

分析:后台运行程序1,在程序1中,msgget (MSGKEY,0777|IPC_CREAT)函数用于建立与顾客进程相同的消息队列,若指定的关键字消息队列不存在,msgflg&IPC_CREAT为真,则为他建立一个新的消息队列; msgflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。使用msgrcv (msgqid,&msg,256,1,0);且msgtyp=>0时,则接收消息队列中类型为msgtyp的第一个消息大小为256字节的消息,使用msgsnd (msgqid,&msg,sizeof(int),0);发送一个消息到相关的消息队列上,接着运行程序2,在程序2中,通过msgqid=msgget(MSGKEY,0777);建立消息队列,通过msgsnd(msgqid,&msg,sizeof(int),0);往msgqid发送消息msg,使用msgrcv(msgqid,&msg,256,pid,0);接收来自服务进程的大小为256字节的消息,两个程序运行后先后输出服务进程的pid32321和客户进程的pid32159。

(2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。

相关代码:

#include

#include

相关文档
最新文档