实验五信号处理new

上传人:xins****2008 文档编号:110551688 上传时间:2019-10-30 格式:DOC 页数:4 大小:61KB
返回 下载 相关 举报
实验五信号处理new_第1页
第1页 / 共4页
实验五信号处理new_第2页
第2页 / 共4页
实验五信号处理new_第3页
第3页 / 共4页
实验五信号处理new_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《实验五信号处理new》由会员分享,可在线阅读,更多相关《实验五信号处理new(4页珍藏版)》请在金锄头文库上搜索。

1、实验五 信号处理魏陈强 23020092204168 谢思发 230200922041741、 实验要求 本实验要求利用可靠信号机制解决信号处理时可能出现的时间窗口,以及非局部转移等问题,将学习使用sigaction,alarm,sigpending,sigsetjmp和siglongjmp等函数解决在处理信号时遇到的问题。在程序清单1-8的基础上进行修改。可以直接利用系统shell(在cs8是bash):execl(“/bin/sh”, “sh”, “-c”, buf, (char *) 0);这样程序sigtest就具有系统shell的全部功能。如果命令带“-t”选项,则在创建执行上面函数

2、的子进程之前,必须设置闹钟;在子进程结束之后,必须将闹钟清零。2、 实验思路 因为需要使用闹钟,所以实验需要处理两个信号:SIGALRM和SIGQUIT。如果当前程序正在执行用户命令,则信号处理函数必须“杀死”用户命令进程:kill(pid, SIGKILL);/ pid为用户命令进程的ID对于信号SIGQUIT还有一种可能:正在接收用户输入的命令串。此时需要放弃当前输入,重新开始接收输入。解决方法可能需要使用非局部转移机制。如果这两个信号同时发生,或者在处理信号SIGALRM时产生信号SIGQUIT(或者反过来),那么应当如何处理?无论如何,如果同时存在多个未决信号,系统总是一个信号处理完了

3、,再处理下一个信号,但是在处理完全部未决信号之前,不会返回被中断的函数或系统调用。因此合理的处理方法是,无论上述两个信号哪个先处理,另一个未决信号就应该忽略(清除未决信号);在处理其中一个信号时,屏蔽另一个信号(如果发生,就是未决信号)。3、 程序代码#include apue.h#include #include static voidsig_int(int);/* our signal-catching function */static void sig_alrm(int);static volatile pid_t pid;static sigjmp_buf jmpbuf;Sigfun

4、c *signal(int signo , Sigfunc *func);intmain(int argc,char *argv)charbufMAXLINE;/* from apue.h */intstatus,time;time=0;if(argc =3) if(strcmp(argv1,-t)=0) time=atoi(argv2); else err_sys(input error); printf(% ); /if (time)/alarm(time);if (signal(SIGQUIT, sig_int) = SIG_ERR)err_sys(signal error);if (s

5、ignal(SIGALRM, sig_alrm) = SIG_ERR)err_sys(signal error);sigsetjmp(jmpbuf,1);printf(% );/* print prompt (printf requires % to print %) */ if(time) alarm(time);while (fgets(buf, MAXLINE, stdin) != NULL) if (bufstrlen(buf) - 1 = n)bufstrlen(buf) - 1 = 0; /* replace newline with null */if (pid = fork()

6、 0) err_sys(fork error); else if (pid = 0) /* child */execl(/bin/sh,sh,-c,buf,(char *)0);err_ret(couldnt execute: %s, buf);exit(127);/* parent */waitpid(pid, &status, 0);pid =0;alarm(0);printf(% );exit(0);Sigfunc *signal(int signo , Sigfunc *func)struct sigaction act,oact;act.sa_handler = func;sigem

7、ptyset (& act.sa_mask);act.sa_flags = 0;if (signo = SIGALRM)/act.sa_mask|=SIGQUIT;#ifdef SA_RESTARTact.sa_flags|=SA_RESTART;#endifif (sigaction(signo , &act,&oact)0)kill(pid,SIGKILL);elseprintf (n);siglongjmp (jmpbuf,1);if(sigemptyset(&pendmask)0) err_sys(sigemptyset error);if (sigpending(&pendmask)

8、0)kill(pid,SIGKILL);if(sigemptyset(&pendmask)0) err_sys(sigemptyset error);if (sigpending(&pendmask)0)err_sys(sigpending error);if (sigismember(&pendmask,SIGQUIT)signal(SIGQUIT,SIG_IGN);signal(SIGQUIT,sig_int); siglongjmp(jmpbuf,1);4、 实验结果 按ctrl+以后:5、 实验心得 本次实验感觉比较难,需要对信号很了解,主要是处理SIGALRM和SIGQUIT信号同时发生的时候应该如何处理。合理的做法是当处理其中一个信号的时候,应该屏蔽另一个信号,其中处理SIGALRM信号的时候,使用act.sa_mask|=SIGQUIT屏蔽信号SIGQUIT,不过对于“|”老是报错,目前还没查找出原因,只能暂时将该句注释。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号