1、实 验 报 告( 2013 / 2014 学年 第 1 学期)课程名称 操作系统原理实验名称 实验 2:进程间通信实验时间 2013 年 10 月 10 日指导单位 软件工程系指导教师 杨 健学生姓名 班级学号学院(系) 软件工程系 专 业 计算机软件与服务外包0实验名称 实验 2:进程间通信 指导教师 杨健实验类型 验证 实验学时 2 实验时间一、 实验目的1了解 Linux 中的信号,熟悉 Linux 系统中进程之间软中断通信的基本原理。2Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,学习如何利用消息缓冲队列进行进程间的通信,并加深对消息通信机制的理解。二、实验
2、环境(实验设备)Windows 2000 + VMWare + RedHat Linux 8三、实验内容1编写程序:用 fork()创建两个子进程,再用系统调用 signal()让父进程捕捉键盘上来的中断信号(即按c 键) ;捕捉到中断信号后,父进程用系统调用 kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息,然后终止:Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!2分析利用软中断通
3、信实现进程同步的机制。3消息的创建,发送和接收。4使用系统调用 msgget(),msgsnd(),msgrev() ,及 msgctl()编制消息的发送和接收程序。5server.c 程序后台运行, client.c 程序前台运行,server.c 先于 client.c 运行。程序代码#include #include #include void waiting( ),stop( );int wait_mark;main( )int p1,p2,stdout;while(p1=fork( )= =-1); /*创建子进程 p1*/if (p10)while(p2=fork( )= =-1)
4、; /*创建子进程 p2*/if(p20)wait_mark=1;signal(SIGINT,stop); /*接收到c 信号,转 stop*/waiting( );1kill(p1,16); /*向 p1 发软中断信号 16*/kill(p2,17); /*向 p2 发软中断信号 17*/wait(0); /*同步*/wait(0);printf(“Parent process is killed!n“);exit(0);elsewait_mark=1;signal(17,stop); /*接收到软中断信号 17,转 stop*/waiting( );lockf(stdout,1,0);pr
5、intf(“Child process 2 is killed by parent!n“);lockf(stdout,0,0);exit(0);elsewait_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);void waiting( )while(wait_mark!=0);void stop( )wait_mark=0;#include#in
6、clude#include#include2#include#define MSGKEY 75struct msgformlong mtype;char mtext256;main()struct msgform msg;int msgqid,pid,*pint;msgqid=msgget(MSGKEY,0777);pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,msgrcv(msgqid,printf(“client:receive from pid %dn“,*pint);exit(0);#incl
7、ude#include#include#include#include#define MSGKEY 75struct msgformlong mtype;char mtext256;main()struct msgform msg;int msgqid,pid,*pint;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(;)msgrcv(msgqid,pint=(int*)msg.mtext;3pid=*pint;printf(“server:receive from pid %dn“,pid);msg.mtype=pid;*pint=getpid();msg
8、snd(msgqid,4四、实验小结(针对实验内容逐项小结实验中发现的问题、自己的解决方法、心得体会等)这次程序相比于上次实验,难度稍有点大,程序也复杂了,通过对此次实验的学习,了解了 linux 系统中的信号,熟悉了进程之间软中断通信的基本原理。信号本质:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过 POSIX 实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。进程用 kill( )向一个进程或一组进程发送一个信号;当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断另外,最重要的是学会了 kill()函数和 signal()函数的调用,当然在实验中也遇到了很多问题,不过好在同学的帮忙下都得到了解决。五、指导教师评语成 绩 批阅人 日 期