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