信号机制实现【2014最新操作系统原理课程设计】_第1页
信号机制实现【2014最新操作系统原理课程设计】_第2页
信号机制实现【2014最新操作系统原理课程设计】_第3页
信号机制实现【2014最新操作系统原理课程设计】_第4页
信号机制实现【2014最新操作系统原理课程设计】_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、* 实践教学实践教学*兰州理工大学兰州理工大学计算机与通信学院2007 年秋季学期操作系统原理操作系统原理课程设计课程设计题 目: 信号机制实现 专业班级: 计通基地班 姓 名: 学 号: 指导教师: 成 绩: _ 目目 录录摘摘 要要.3正正 文文.61. 设计思想.62. 算法用到的主要数据结构.83. 相关的各模块的伪码算法.94. 调试分析和测试结果.105. 源程序.11总总 结结.14参考文献参考文献.15致致 谢谢.153摘摘 要要操作系统被建立在用户和系统硬件之间,接受用户命令,从而组织硬件完成相应功能,以满足用户要求。进程是操作系统上程序的执行过程。程序通过进程得以执行。然而

2、,程序并不是孤立的,复杂的问题,可以使用不同程序去解决,即不同的进程去协作完成。由此产生了进程通信的概念。信号机制作为进程通信的一个基本方法,在进程通信中占有重要地位。虽然其机制有些陈旧,但在操作系统中仍然起着不可替代的作用,又被称为软中断. 在本程序中,父进程创建两个子进程,再用 kill()向两个子进发出中断信号,子进程 P1 和 P2 接到信号后,用 exit(0)函数正常终止自我进程(向父进程发SIGINT 信号) 。父进程的 wait()函数收到子进程的 SIGINT 信号后,对子进程作适当处理后(资源回收)后返回本进程。因为父进程有两个子进程,所以需要两个 wait()函数来等待子

3、进程的结束。 关关 键键 字字信号,软中断,父进程,子进程,stop(),waiting(),fork(),signal(),exit()4前前 言言1.1.信号的基本概念信号的基本概念 每个信号都对应一个正整数常量(称为 signal number,即信号编号。定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一种模拟,故在早期的 UNIX

4、 版本中又把它称为软中断。 信号与中断的相似点:信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; (3)都在处理完毕后返回到原来的断点;(4)对信号或中断都可进行屏蔽。信号与中断的区别:信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。 信号机制具有以下三方面的功能:信号机制具有以下三方面的功能: (1)发送信号的程序用系统调用 kill( )实现;

5、 (2)接收信号的程序用 signal( )来实现对处理方式的预置; (3)收受信号的进程按事先的规定完成对相应事件的处理。 2 2信号的发送信号的发送 信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程就此结束。一个进程可能在其信号域中有多个位被置位,代表有多种类型的信号到达,但对于一类信号,进程却只能记住其中的某一个。进程用 kill( )向一个进程或5一组进程发送一个信号。在本程序中,使用 16 SIGUSR1 用户自定义信号 1 和 17 SIGUSR2 用户自定义信号 2 分别向子进程 1、2 发送信号

6、。即 kill(p1,16)和kill(p2,17) 。3 3对信号的处理对信号的处理 当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行: (1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回; (2)进程收到软中断后便退出(function=0);(3)执行用户设置的软中断处理程序。6正正 文文1.1. 设计思想设计思想学生通过该题目的设计过程,可以掌握信

7、号的发送与接收的原理、软件开发方法并提高解决实际问题的能力。使用系统调用 kill(),wait(),signal(),及 fork()编制一个通过信号完成进程通信,在接受信号后进程完成相应功能的程序。 (1)为了便于操作和观察结果 ,用一个程序作为 “引子”,先后fork()两个子进程 , 使用信号 ”SIGINT”进行通信。 (2)程序运行产生父进程使用signal()捕捉信号 Ctrl+C(即C) 然后用 kill()向子进程发送 SIGINT 并使用 wait()等待子进程结束,然后打印“parent killed“并退出。 (3)fork()建立两个子进程 ,等待其父进程发来的消息。

8、当遇到SIGINT 信号时 ,则作为结束信号 , 子进程打印 :“child process1 killed by parent并结束退出。 涉及的系统调用:1. kill( )向指定进程发送信号。2. signal( ) 捕捉信号并在捕捉到相应信号后调用函数。3.wait( ) 中断进程执行,等待子进程结束停止等待继续进程的执行。4.fork( ) 创建进程的系统调用。2.2. 算法用到的主要数据结构(采用类算法用到的主要数据结构(采用类 c c 语言定义)语言定义)1、kill( )系统调用格式int kill(pid,sig)参数定义int pid,sig; 其中,pid 是一个或一组进

9、程的标识符,参数 sig 是要发送的软中断信号。 (1)pid0 时,核心将信号发送给进程 pid。 (2)pid=0 时,核心将信号发送给与发送进程同组的所有进程。7 (3)pid=-1 时,核心将信号像广播般传送给系统内所有进程。2、signal( )预置对信号的处理方式,允许调用进程控制软中断信号。系统调用格式signal(sig,function)头文件为#include 参数定义signal(sig,function)int sig;void (*function) ( )函数说明:signal()会依参数 sig 指定的信号编号来设置该信号的处理函数。当指定信号到达时就会跳转到参数

10、 function 指定的函数执行。如果参数function 不是函数指针,则必须是下列两个常数之一:SIG_IGN 忽略参数 sig 指定的信号SIG_DFL 将参数 sig 指定的信号重设为核心预设的信号处理方式。其中 sig 用于指定信号的类型,sig 为 0 则表示没有收到任何信号, 其中SIGINT(值是 02)表示中断,当用户从键盘按c 键或break 键时,则会产生此信号。function:该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号 SIGKILL,SIGTRAP 和 SIGPWR 以外的信号,核心自动地重新设置软中断信号处理程

11、序的值为 SIG_DFL,一个进程不能捕获 SIGKILL 信号。function 的解释如下:(1)function=1 时,进程对 sig 类信号不予理睬,亦即屏蔽了该类信号;(2)function=0 时,缺省值,进程在收到 sig 信号后应终止自己;(3)function 为非 0,非 1 类整数时,function 的值即作为信号处理程序的指针。3、wait( ) 等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回。系统调用格式:i

12、nt wait(status)int *status; 其中,status 是用户空间的地址。它的低 8 位反应子进程状态,为 0 表8示子进程正常结束,非 0 则表示出现了各种各样的问题;高 8 位则带回了 exit( )的返回值。exit( )返回值由系统给出。核心对 wait( )作以下处理:(1)首先查找调用进程是否有子进程,若无,则返回出错码;(2)若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执行时间上,并释放子进程的进程表项;(3)若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。4、exit( )终止

13、进程的执行。系统调用格式: void exit(status) int status; 其中,status 是返回给父进程的一个整数,以备查考。为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX 利用 exit( )来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条 exit( ),使子进程自我终止。exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。 如果调用进程在执行 exit( )时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。核心须为 exit( )完成以下操作:(1)关闭软中断(2)回收资源(3)写记帐信息(4

14、)置进程为“僵死状态”5、lockf( )用作锁定文件的某些段或整个文件。系统调用格式: int lockf(feles,function,size) int files,function; long size;其中,files 是文件描述符;function 是锁定和解锁,1 表示锁定,0 表示解锁;size 是锁定和解锁的字节数,若用 0,表示从文件的当前位置到文件尾。6、fork()函数用于创建一个新进程(子进程) 。其调用格式为: Int fork( );其中返回 int 取值意义如下:正确返回:等于 0,创建子进程,从子进程返回 ID 值。9错误返回:等于-1,创建失败。3.3. 相

15、关的各模块的伪码算法相关的各模块的伪码算法1)创建子进程 1 和 2 并它们接受软中断信号main()int p1,p2;if(p1=fork() /*创建子进程 p1*/if(p2=fork() /*创建子进程 p2*/wait_mark=1;signal(SIGINT,stop); /*接收到c 信号,转 stop*/waiting();kill(p1,02); /*向 p1 发软中断信号 02*/ kill(p2,02); /*向 p2 发软中断信号 02*/ wait(0); /*等待子进程 1 结束的信号*/wait(0); /*等待子进程 2 结束的信号*/printf(paren

16、t process is killed!n);exit(0); /*父进程结束*/elsewait_mark=1;signal(SIGINT,stop); /*等待进程 2 被杀死的中断号 02*/waiting();lockf(1,0,0);printf(child process2 is killed by parent!n);lockf(1,0,0);10exit(0);elsewait_mark=1;signal(SIGINT,stop); /*等待进程 1 被杀死的中断号 02*/waiting(); lockf(1,0,0);printf(child process1 is kil

17、led by parent!n);lockf(1,0,0);exit(0);2)定义 waiting()函数 void waiting() while(wait_matk!=0);3)定义 stop()函数 void stop( ) while(wait_mark=0);4.调试分析调试分析和测试结果和测试结果11父进程用系统调用 kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:child process1 is killed by parent!child process2 is killed by parent! parent process is kille

18、d!5 5、源程序(带注释):、源程序(带注释):4. #include 5. #include 6. #include 7. #include 8. int waite; 9. void stop()10. 11. waite=0; 12. 13. static void waiting()14. 1215. while(waite=1); 16. 17. main()18. 19. int p1,p2; 20. while(p1=fork()=-1); /*创建子进程 p1*/21. if(p10)22. 23. printf(Child 1 is create !n); 24. whil

19、e(p2=fork()=-1); /*创建子进程 p2*/25. if(p20)26. 27. printf(Child 2 is create !n); 28. printf(Please press ctrl+Cn); 29. waite=1; 30. signal(SIGINT,stop); /*接收到c 信号转 stop*/31. waiting(); 32. kill(p1,16); /*向 p1 发软中断信号 16*/33. kill(p2,17); /*向 p2 发软中断信号 17*/34. wait(0); /*同步*/35. wait(0); /*同步*/36. printf

20、(nParent process is killed !n); 1337. exit(0); 38. 39. else40. 41. waite=1; 42. signal(SIGINT,stop); 43. waiting(); 44. printf(nChild process2 is killed by parent !n); 45. exit(0); 46. 47. 48. else49. 50. waite=1; 51. signal(SIGINT,stop); 52. waiting(); 53. printf(nChild process1 is killed by parent !n); 54. exit(0); 55. 56. 14总总 结结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.在这两周的操作系统课程设计中, 我感受很深,使我明白只有彻底掌握知识才能把理论和知识牢固结合起来。由于以前没有接触过 UNIX/LINUX,也不知道如何使用 vi 编辑器,所以在调程序的时候翻阅了大量的资料。虽然很辛苦,但是可以学到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计我懂得了理论与实际相结合

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论