UNIX高级环境编程-.doc

上传人:bao****ty 文档编号:131568709 上传时间:2020-05-09 格式:DOC 页数:13 大小:155.50KB
返回 下载 相关 举报
UNIX高级环境编程-.doc_第1页
第1页 / 共13页
UNIX高级环境编程-.doc_第2页
第2页 / 共13页
UNIX高级环境编程-.doc_第3页
第3页 / 共13页
UNIX高级环境编程-.doc_第4页
第4页 / 共13页
UNIX高级环境编程-.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《UNIX高级环境编程-.doc》由会员分享,可在线阅读,更多相关《UNIX高级环境编程-.doc(13页珍藏版)》请在金锄头文库上搜索。

1、UNIX高级环境编10Time:2007-10-28 1:信号的实质软件中断 2:信号的值1 每种信号都被定义为一个正值2 没有一种信号的值是03 值=0,被定义成一种特殊的信号 空信号 3:产生信号的种类1 当用户按某些键时,会产生信号,例如在终端按键Delete产生终端信号(SIGINT)2 硬件产生的信号:例如0作除数,内存访问越界3 用kill函数发送的信号4 用户用Kill命令将信号发送给其他进程5 当检测到某个软件条件已经具备时,则发送信号给相应进程 4:硬件信号相关1 硬件异常一般由硬件检测到2 硬件检测到后,通知内核3 内核给相应的进程发送相应的信号(例如:终止信号) 5:系统

2、对信号的三种处理方式1 忽略此信号,大多数信号都采用此种方式2 按照系统默认处理,一般都是终止进程3 捕捉信号,执行特定的函数 6:详解信号1 SIGABRT:调用abort函数时产生此信号 进程异常终止2 SIGALRM:超过用alarm函数设置的时间时产生此信号3 SIGBUS:指示一个实现定义的硬件故障4 SIGCHLD:当一个进程终止或者停止时,SIGCHLD信号被送给其父进程。按照系统 默认,将忽略此信号。如果不想忽略此信号,则应该用wait或者waitpid 函数来捕捉该信号5 SIGCONT:作业控制信号,传送给处理停止状态但是需要继续运行的进程,如果 接受到此信号的进程处于停止

3、状态,则继续运行。否则默认动作是忽略6 SIGEMT:指示一个实现定义的硬件故障7 SIGFPE:此信号表示出现一个算术运算异常,例如:0作除数,浮点溢出8 SIGHUP:如果终端界面检测到一个连接断开,则将此信号送给与该终端相关的 控制进程(对话期首进程)9 SIGILL:此信号指示已执行一个非法硬件指令10SIGINT:但用户按终端键(一般采用delete或Ctrl+C),产生此信号11SIGIO:此信号指示一个异步I/O事件12SIGIOT:指示一个实现定义的硬件故障13SIGKILL:终止信号,是两个不能忽略信号之一,向管理员提供了终止某进程的 可靠方法14SIGPIPE:如果在读进程

4、已经终止时些管道,则产生此信号15SIGPWR:关于不间断电源(UPS)的一种信号16SIGQUIT:当用户在终端上按退出键时,产生此信号,并送至前台进程组中的所有 进程17SIGSTOP:作业控制信号,停止一个进程,此信号也不能被忽略18SIGSYS:指示一个无效的系统调用19SIGTERM:这是有kill命令发送的系统默认终止信号20SIGTRAP:指示一个实现的硬件故障21SIGSTP:交互停止信号,当用户在终端上按挂起键时,终端驱动程序产生此信号22SIGTTIN:当一个后台进程试图读控制终端时,终端驱动程序产生此信号23SIGTTOU:当一个后台进程试图写控制终端时,终端驱动程序产生

5、此信号24SIGURG:此信号通知进程已经发生了一个紧急情况,例如,在网络通信中,接到 非规定波特率的数据时,此信号可选择性的产生25SIGUSR1:这是用户自定义的信号,可用于应用程序26SIGUSR2:这是用户自定义的信号,可用于应用程序 7:算术异常举例1 处以02 浮点溢出 8:两个不能忽略的信号1 SIGKILL2 SIGSTOP这样提供了可以终止进程的安全手段 9:UPS不间断电源供电系统10:signal函数1 函数原型:void* signal(int signo, void (*fun)(int) (int)2 头文件:#include 3 作用:注册某一信号到特定处理函数4

6、 参数:signo:要注册的信号void (*fun)(int):处理函数5 返回值:void*,返回以前此信号的处理函数的地址11:signal函数中第二参数值的情况1 SIG_IGN:表示忽略此信号2 SIG_DFL:表示按照系统的默认方式处理3 void :指出处理函数的地址12:STG_ERR, SIG_IGN和SIG_DFL的定义1 #define SIG_IGN(void (*)(int) 12 #define SIG_DFL(void (*)(int) 03 #define STG_ERR(void (*)(int) -113:信号处理程序示例#include #include

7、void my_signal(int) ;int main()if ( signal(SIGUSR1, my_signal) = SIG_ERR )printf(“Error occurred when catching SIGUSR1 nn”) ;elseprintf(“SIGUSR1 has been registered! nn”) ;if ( signal(SIGUSR2, my_signal) = SIG_ERR )printf(“Error occurred when catching SIGUSR2 nn”) ;elseprintf(“SIGUSR2 has been regis

8、tered! nn”) ;while (1) ;return 0 ;void my_signal(int signo)if (signo = SIGUSR1)printf(“received signal : SIGUSR1 nn”) ;else if (signo = SIGUSR2)printf(“received singal : SIGUSR2 nn”) ;elseprintf(“error! nn”) ;return ;/*-操作过程-*/14:为什么当程序后台执行时,不会对中止键(例如:Ctrl+C)反应?当程序变为后台程序时,系统会设置忽略中止信号,这样当按下中止键时,不会影响到

9、后台程序的执行15:条件捕捉的形式int sig_int() ;/ 当SIGINT信号设置为不忽略时,才捕捉他们if ( signal(SIGINT, SIG_IGN) != SIG_IGN )signal(SIGINT, sig_int() ;16:注意执行exec函数,exec函数会把原来设定要捕捉的信号都更改为默认动作,其他信号的状态不变,这样做的原因是:exec执行程序会在原来空间上生成一个新的程序,捕捉原来的信号没有任何意义17:注意当一个进程调用fork之后,其子进程继承父进程的信号处理方式,因为子进程在开始时复制了父进程存储图像,所以信号捕捉函数的地址在子进程中是有意义的18:早

10、期的“中断的系统调用”如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行,该系统调用返回出错,其error 设置 为 EINTR注意:这里我们必须区分系统调用和函数,当信号来时,被中断的是系统调用而不是函数19:怎么解决“中断的系统调用”?显式地处理,代码如下:again:if ( (n=read(fd, buff, BUFSIZE) 可再入函数:在执行时,允许中断,然后返回2 不可再入函数:由于函数中存在(例如:全局数据结构),执行时不允许在函数 执行时被中断21:不可再入函数不可再入的可能原因1 函数中使用一些全局数据结构2 函数中调用malloc或者

11、free3 它们是标准I/O函数,标准I/O库的实现很多都利用了全局数据结构22:在信号处理程序中不能调用不可再入函数的原因:例如:已知getpwnam函数是不可再入函数,因为它使用全局数据结构,当在主函数main 调用getpwnam后,调用信号处理程序,而在信号处理程序中调用getpwnam,这时 就会出现问题,因为此时调用getpwnam函数把覆盖main中调用getpwnam函数中 使用的全局数据结构23:在信号处理程序中可以调用的可再入函数24:信号处理程序中通用的规则保存errno值1 即使在信号处理程序中调用可再入函数,由于一个进程只有一个errno值,假设在信号处理程序中调用r

12、ead函数,在read函数中对errno进行了重新设置2 重新复制errno,就会对原来设置的errno值产生了覆盖3 通用规则:在信号处理程序中,先备份errno,等到处理程序结束时,应该再返回25:SIGCHLD和wait函数1 子程序状态发生改变2 产生SIGCHLD信号3 用wait或者waitpid函数获得子进程状态26:举例:在信号处理程序中调用不可重入函数#include #include #include static void my_alarm(int) ;/ 信号处理程序int main(void)struct passwd *ptr ;signal(SIGALRM, my_alarm) ;alarm(1) ;for ( ; ; )if ( (ptr=getpwnam(“stevens”) = NULL )printf(“getpwnam error! nn”) ;if ( (strcmp(ptr-pw_name, “steven”) != 0 )printf(“return value corrupted! nn”) ;return 0 ;static void my_alarm(int signo)struct passwd *rootptr ;printf(“in signal handle! nn”) ;if ( (rootp

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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