


单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,实验三,linux,进程信号通信,一、实验目的,了解,linux,中的信号,熟悉,linux,系统中进程之间软中断信号的基本原理二、实验内容,1,、编写程序:用,fork(),创建两个子进程,再用系统调用,signal(),让父进程捕捉键盘上来的中断信号(按,^c,键);捕捉到中断信号后,父进程用系统调用,kill(),向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息,然后终止:,,,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,),pid>0,时,核心将信号发送给进程,pid.,,(2)pid=0,时,核心将信号发送给与发送进程同组的所有进程3,),pid=-1,时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程signal(),系统调用,,预置对信号的处理方式,允许调用进程控制软中断信号系统调用格式:,,signal(sig,function),,参数定义:,,signal(sig,function),,int sig;,,void(*func)();,,其中,,sig,用于指定信号的类型,,sig,为,0,则表示没有收到任何信号,余者如下表所示:,,值,名字,说明,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:,在该进程中的一个函数地址,,,在核心态返回用户态时,,,它以软中断信号的序号作为参数调用该函数,,,对除了信号,sigkill,sigtrap,sigpwr,以外的信号,,,核心自动地重新设置软中断信号处理程序的值为,SIG_DFL,,一个进程不能捕获,SIGKILL,信号,.,,,function,解释如下,:,,(1)function=1,时,,,进程对,sig,类信号不理睬,,,即屏蔽了该类信号,;,,,(2)function=0,时,,,缺省值,,,进程在收到,sig,信号后应终止自已,;,,,(1)function,为非,0,,非,1,类整数时,,function,的值即作为信号处理程序的指针,.,3.lockf(),系统调用,,用作锁定文件的某些段或者整个文件,.,,系统调用格式,: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 wait_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(p2,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);,,},,},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,,#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");},,,,,问:此例屏幕上显示的结果是什么?为什么?,。