进程通信

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

操作系统实验二

课程名称计算机操作系统实验名称进程间通信

实验

类型

验证

设计

综合

创新

【实验目的】

实验目的:

UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉LINUX支持的信号量机制、管道机制、消息通信机制及共享存储区机制。

本实验一共有四个部分:

(一)信号量机制实验

实验要求:

⑴、运行程序并分析结果。

⑵、如果把signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。

⑶、该程序段前面部分用了两个wait(0),为什么?

⑷、该程序段中每个进程退出时都用了语句exit(0),为什么?

(二)进程的管道通信实验

实验要求:运行程序并分析结果。

(三)消息的发送与接收实验

(四)共享存储区通信

实验要求:运行程序,并分析运行结果。

【实验内容】

(一)信号量机制实验

1、编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:Child process 1 is killed by parent!

Child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止:

Parent process is killed!

2、修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。

(二)进程的管道通信实验

1、编制一段程序,实现进程的管道通信。使用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:

Child 1 is sending message!

Child 2 is sending message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

(三)消息的发送与接收实验

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

①为了便于操作和观察结果,编制二个程序client.c 和server.c,分别用于消息的发送与接收。

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

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

④注意:二个程序分别编辑、编译为client 与server。执行。

(四)共享存储区通信

1、编制一长度为1k的共享存储区发送和接收的程序。

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

②server 端建立一个key 为75 的共享区,并将第一个字节置为-1,作为数据空的标志。等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,进行处理。然后再次把它的值设为-1,如果遇到的值为0,则视为为结束信号,取消该队列,并退出server。server 每接收到一次数据后显示“(server)received”。

③client 端建立一个key 为75 的共享区,当共享取得第一个字节为-1 时,server 端空闲,可发送请求。client 随即填入9 到0。期间等待 server 端的再次空闲。进行完这些操作后,client 退出。client 每发送一次数据后显示“(client)sent”。

④父进程在server 和client 均退出后结束。

【实验环境】(含主要设计设备、器材、软件等)

实验环境在实验结果截图上标明

【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)(一)信号量机制实验

1、源代码:

#include

#include

#include

void waiting();

void stop();

int wait_mark;

main()

{

int p1,p2;

//signal(SIGINT,stop); //stop--ctrl c signal

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

if(p1>0)

{

signal(SIGINT,stop);

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

if(p2>0)

{

signal(SIGINT,stop);

wait_mark=1;

waiting(0); //waiting(0);

kill(p1,10);

kill(p2,12);

wait();

wait();

printf("parent process is killed!\n");

//exit(0);

}

else

{

wait_mark=1;

signal(12,stop);

waiting();

lockf(1,0,0);

//exit(0);

}

}

else

{

wait_mark=1;

相关文档
最新文档