进程通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;