广东开放大学操作系统原理与应用(本)实操作业三:进程间通信
按照文件“实验三 进程间通信.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); }
评论0