开放大学在线学习搜题
当前位置:首页 > 真题试卷

问题

广东开放大学操作系统原理与应用(本)实操作业三:进程间通信

发布时间:2025-03-15   作者:广东开放大学   浏览:0

广东开放大学操作系统原理与应用(本)实操作业三:进程间通信

按照文件“实验三 进程间通信.pdf”的要求,完成程序的运行,分析产生结果的原因,以文件的形式提交运行结果截图以及原因分析(一个文件中)。


实验三:进程间通信

实验简介:此次实验主要是了解消息通信以及共享存储区通信。实验目标:

(1)了解消息通信。

(2)了解共享存储区通信。

实验内容:

(1)消息的创建,发送和接收

使用系统调用 msgget( ), megsnd( ), msgrev( )及msgctl()编制一长度为 1K 的消息发送和接收的程序。(2)共享存储区的创建,附接和断接使用系统调用 shmget(),sgmat(),smgdt(),shmctl()编制一个长度为 1K 的消息发送和接收的程序。

实验所需基础:

操作系统:Linux RHEL 6.0

实验是否需要联网:否

实训步骤:

步骤一:消息通信

(1) 为了便于操作和观察结果,用一个程序为“引子”,先后fork( )两个子进程,SERVER 和 CLIENT,进行通信。(2) SERVER 端建立一个 Key 为 75 的消息队列,等待其他进程发来的消息。当遇到类型为 1 的消息,则作为结束信号,取消该队列,并 退 出 SERVER 。 SERVER 每 接 收 到一个消息后显示一句

“(server)received”。

(3) CLIENT 端使用 Key 为 75 的消息队列,先后发送类型从10到 1 的消息,然后退出。最后的一个消息,既是SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent”。(4) 父进程在 SERVER 和 CLIENT 均退出后结束。〈程序〉

#include

#include

#include

#include

#define MSGKEY 75 /*定义关键词 MEGKEY*/

struct msgform /*消息结构*/

{

long mtype;

char mtexe[1030]; /*文本长度*/

}msg;

int msgqid,i;

void CLIENT( )

{

int i;

msgqid=msgget(MSGKEY,0777|IPC_CREAT);

for(i=50;i>=1;i--)

{

msg.mtype=i;

printf("(client)sent\n");

msgsnd(msgqid,&msg,1024,0); /*发送消息msg 入msgid消息队列*/

}

exit(0);

}

void SERVER( )

{

msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*由关键字获得消息队列*/do

{

msgrcv(msgqid,&msg,1030,0,0); /*从队列 msgid 接受消息msg*/

printf("(server)receive\n");

}while(msg.mtype!=1); /*消息类型为1 时,释放队列*/msgctl(msgqid, IPC_RMID,0);

exit(0);

}

void main()

{

while ((i=fork())==-1);

if(!i) SERVER();

while ((i=fork())==-1);

if(!i) CLIENT();

wait(0);

wait(0);

}

步骤二:共享存储区通信

(1)为了便于操作 和观察结果,用一个程序为“引子”,先后fork( )两个子进程,SERVER 和 CLIENT,进行通信。(2)SERVER 端建立一个 KEY 为 75 的共享区,并将第一个字节置为-1.作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它的值设为-1。如 果 遇 到 的 值 为 0, 则 视 为 结 束 信号, 取消该队列, 并退出SERVER.SERVER 每接 收到一次数据后显示”(server)received”。(3)CLIENT 端建立一个为 75 的共享区,当共享取得第一个字节为-1 时, Server 端空闲,可发送请求。CLIENT 随即填入9 到0。期间等待Server端再次空闲.进行完这些操作后, CLIENT退出。CLIENT每发送一次数据后显示”(client)sent”。(4)父进程在 SERVER 和 CLIENT 均退出后结束。<程序>

#include

#include

#include

#define SHMKEY 75 /*定义共享区关键词*/

int shmid,i;

int *addr;

void CLIENT()

{

int i;

shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT);

/* 获取共享区,长度 1024,关键词 SHMKEY */

addr=shmat(shmid,0,0); /*共享区起始地址为addr*/for(i=9;i>=0;i--)

{

while(*addr!= -1);

printf("(client)sent\n"); /*打印(client)sent*/*addr=i; /*把i 赋给addr*/

}

exit(0);

}

void SERVER()

{

shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享区*/

addr=shmat(shmid,0,0); /*共享区起始地址为addr*/

do

{

*addr=-1;

while(*addr == -1);

printf("(server)received\n%d",*addr); /*服务进程使用共享区*/

} while(*addr);

shmctl(shmid,IPC_RMID,0);

}

void main()

{

while ((i=fork())==-1);

if(!i) SERVER();

while ((i=fork())==-1);

if(!i) CLIENT();

wait(0); wait(0); }



您可能感兴趣的试题