实验三linux进程信号通信



《实验三linux进程信号通信》由会员分享,可在线阅读,更多相关《实验三linux进程信号通信(12页珍藏版)》请在装配图网上搜索。
1、单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,实验三,linux,进程信号通信,一、实验目的,了解,linux,中的信号,熟悉,linux,系统中进程之间软中断信号的基本原理。,二、实验内容,1,、编写程序:用,fork(),创建两个子进程,再用系统调用,signal(),让父进程捕捉键盘上来的中断信号(按,^c,键);捕捉到中断信号后,父进程用系统调用,kill(),向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息,然后
2、终止:,,,child process1 is killed by parent!,,child process2 is killed by parent!,,父进程等待两个子进程终止后,输出如下的信息后终止:,,parent process is killed!,,2.,分析利用软中断通信实现进程同步的机制。,,3,、写出例,2,中的实验结果,并作适当的分析。,三、实验指导,1,、,kill(),系统调用,,系统调用格式:,int kill(pid,sig),,参数定义:,int pid,sig;,,其中,,pid,是一个或一组进程的标识符,参数,sig,是要发送的软中断信号。,,(,1,)
3、,pid>0,时,核心将信号发送给进程,pid.,,(2)pid=0,时,核心将信号发送给与发送进程同组的所有进程。,,(,3,),pid=-1,时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。,2,。,signal(),系统调用,,预置对信号的处理方式,允许调用进程控制软中断信号。,,系统调用格式:,,signal(sig,function),,参数定义:,,signal(sig,function),,int sig;,,void(*func)();,,其中,,sig,用于指定信号的类型,,sig,为,0,则表示没有收到任何信号,余者如下表所示:,,值,名字,说明,
4、01,SIGHUP,挂起(,hangup),02,SIGINT,中断,当用户从键盘按,^c,时,03,SIGQUIT,退出,当用户从键盘按,quit,键时,04,SIGILL,非法指令,05,SIGTRAP,跟踪陷阱,启动进程,跟踪代码的执行。,06,SIGIOT,IOT,指令,06,SIGEMT,EMT,指令,07,SIGFPE,浮点运算溢出,08,SIGKILL,杀死。终止进程,。。。,,,16,SIGUSR1,用户自定义信号,1,17,SIGUSR2,用户自定义信号,2,,18,SIGCLD,某个子进程死,19,SIGPWR,电源故障,function:,在该进程中的一个函数地址,,,在
5、核心态返回用户态时,,,它以软中断信号的序号作为参数调用该函数,,,对除了信号,sigkill,sigtrap,sigpwr,以外的信号,,,核心自动地重新设置软中断信号处理程序的值为,SIG_DFL,,一个进程不能捕获,SIGKILL,信号,.,,,function,解释如下,:,,(1)function=1,时,,,进程对,sig,类信号不理睬,,,即屏蔽了该类信号,;,,,(2)function=0,时,,,缺省值,,,进程在收到,sig,信号后应终止自已,;,,,(1)function,为非,0,,非,1,类整数时,,function,的值即作为信号处理程序的指针,.,3.lockf(
6、),系统调用,,用作锁定文件的某些段或者整个文件,.,,系统调用格式,:lockf(files,function,size),,参数定义,:,,int lockf(files,function,size),,int files,function;,,long size;,,其中,:files,是文件描述符,;function,是锁定和解锁,;1,表锁定,,0,表解锁,.size,是锁定或解锁的字节数,,,为,0,,表示从文件的当前位置到文件尾,.,5,、参考程序(例,1,),#include,,#include,,#include,,void waiting (),stop();,,int w
7、ait_mark;,,main(),,{,,int p1,p2,stdout;,,signal(SIGINT,stop); /*,接收到,^c,信号,,,转,stop*/,,while((p1=fork())==-1); /*,创建子进程,P1*/,,if(p1>0),,{,,while((p2=fork())==-1); /*,创建子进程,p2*/,,if(p2>0),,{,,wait_mark=1;,,sleep(5); /*,接收到,^c,信号,,,转,stop*/,,waiting();,kill(p1,16); /*,向,p1,发软中断信号,16*/,,kill(p
8、2,17); /*,向,p2,发软中断信号,17*/,,wait(0); /*,同步*,/,,wait(0);,,printf("parent process is killed!\n");,,exit(0);,,},,,else,,{,,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);,
9、,},,},else,,{,,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);,,},,},,void waiting(),,{ while (wait_mark!=0); },,void stop(),,{ wait_mark=0; },另一个信号机构方法的例子:(例,2,),#include
10、,,#include,,main(),,{int status;,,pid_t pid;,,void func();,,signal(SIGUSR1,func);,,If(pid=fork()),,{ printf("parent:will send signal.\n");,,kill(pid,SIGUSR1);,,wait(,,printf(“status=%d: parent finished.\n“,status);},,else,,{sleep(10);,,printf("child :signal is received.\n");,,exit(0);},,},,void func(),,{printf(“it is signal processing function.\n");},,,,,问:此例屏幕上显示的结果是什么?为什么?,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。