操作系统实验进程通信

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

实验报告

课程名称:操作系统

实验名称:进程通信

实验类型:

实验室名称:计算机应用实验室

实验报告撰写要求

一、实验前用预习报告纸撰写预习报告,预习报告包括以下内容

1.实验目的

2.实验用仪器设备、器材或软件环境

3.实验原理、方案设计、程序框图、预编程序等

4.实验过程中需要记录的实验数据表格

二、实验过程中,要认真观察,仔细记录

三、完成实验后用实验报告纸撰写实验报告,包括以下内容

1.仪器设备型号及编号

2.实验器材或软件环境

3.实验步骤、程序调试方法

4.实验数据处理及结果分析

5.实验中存在的问题

6.体会及思考题

四、报告撰写时,要求格式规范、书写整齐

预习报告□

报告成绩:指导教师审核(签名):年月日

实验二进程通信

一、实验目的

1.加深对各种进程通信基本工作原理的理解。

2.理解和掌握Linux系统中进程通信API的应用方法。

3.进一步认识进程软中断通信、管道通信和消息队列通信的实质。

4.分析、设计进程软中断通信的实现方法。

5.分析、设计进程的管道通信,实现父子进程的单机通信机制。

6.分析、设计进程的消息队列通信,实现客户机/服务器通信机制。

二、实验类型

设计性实验。

三、实验预备知识

1.阅读Linux进程通信技术(软中断、管道和消息队列)的使用方法。

2.阅读Linux系统中单机和多机通信技术,掌握各种通信技术API的基本应用方法。

四、实验内容

1.进程的软中断通信

【举例1】

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

child process 2 is killed by parent!

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

parent process is killed!

【程序】

#include

#include

#include

#include

void waiting(),stop();

int wait_mark;

main()

{

int p1,p2;

while((p1=fork())= =-1); /*创建进程p1*/

if(p1>0){

while((p2=fork())= =-1); /*创建进程p2*/

if(p2>0){

Printf(“parent run!\n”);

Printf(“p1=%d\n”,p1);

Printf(“p2=%d\n”,p2);

wait_mark=1;

getchar();

kill(p1,16); /*向p1发软中断信号16*/

kill(p2,17); /*向p2发软中断信号17*/

sleep(5); /*父进程睡眠5秒*/

wait(0); /*等待子进程结束,同步*/

wait(0); /*等待另一子进程结束,同步*/

lockf(stdout,1,0); /*标准输出加锁*/

printf(“parent process is killed!\n”);

lockf(stdout,0,0); /*标准输出解锁*/

exit(0); /*父进程终止*/

}else{

printf(“p2 run!\n”);

wait_mark=1;

signal(17,stop); /*接收父进程发来的软中断信号17,并转stop*/

waiting();

lockf(stdout,1,0); /*标准输出加锁*/

printf(“child process 2 is killed by parent!\n”);

lockf(stdout,0,0); /*标准输出解锁*/

exit(0); /*子进程p2终止*/

}

} else {

printf(“p1 run!\n”);

wait_mark=1;

signal(16,stop); /*接收父进程发来的软中断信号16,并转stop*/

waiting();

lockf(stdout,1,0); /*标准输出加锁*/

printf(“child process 1 is killed by parent!\n”);

lockf(stdout,0,0); /*标准输出解锁*/

exit(0); /*子进程p1终止*/

}

}

void waiting(){

printf(“waiting begin!\n”);

while(wait_mark!=0);

printf(“waiting end!\n”);

}

void stop(){

wait_mark=0;

printf(“signal stop!”);

}

【执行结果】

p1,p2和parent进程依次执行后,得到P1,P2的值为随机连续的值,按回车键输入中断信号后,通过signal()接收后,父进程向子进程发送信号,子进程p1,p2.parent进程依次结束,并打印相应的输出语句。

【分析原因】

先创建父进程,由父进程分别产生子进程p1和子进程p2,依次输出p1,p2,parent。随后用signal()接收给父进程中断信号,父进程通过kill()发信息给子进程,终止子进程,运行stop函数wait_mark=0;跳出waiting函数,输出parent process is killed!

【举例2】

在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),

相关文档
最新文档