- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
南邮Linux-第7章讲述
第7章 Linux信号 郑谦益 韩京宇 7.1信号概述 进程拥有系统中的多种资源,各进程间除了共享内核外,所拥有的其他诸多资源彼此独立。 例如,进程拥有独立的用户地址空间和打开的文件描述符表等,一个进程不能直接访问其他进程的用户地址空间,也不能读写其他进程打开的文件。 7.1信号概述 实际应用中,一个系统或子系统通常由多个进程协同完成,各进程间往往需要通信,例如,传送数据、共享数据、同步控制和通知事件发生等。 为了满足这些要求,Linux内核实现了对信号、管道和IPC的支持。 7.1信号概述 信号是内核与进程间通信的一种方式。内核为每个进程定义了多种信号,并定义了这些信号的处理方式。用户也可根据需要对信号的处理方式进行重新定义。 7.1信号概述 信号是进程间异步通信的方式。 7.1信号概述 常见的几类信号API 信号的定义(signal, sigaction) 发送信号(kill,raise) 定时器(sleep, alarm) 7.2 Linux信号 (1) 用户(硬中断) 当用户在键盘上输入Ctrl+C或Ctrl+\等特殊字符组合时,终端驱动程序将通知内核产生信号,发送至相应的进程。 (2) 内核(软中断) 内核在执行过程中,遇到非法指令和浮点数溢出等情况时,将产生相应的信号,并发送至对应的进程。 (3) 进程(软中断) 一个进程调用kill函数向另一个进程发送信号,进行进程间通信。 7.2 Linux信号 信号的处理方式 通常,Linux为每个信号定义了缺省的处理方式,不同信号的处理方式不尽相同,这些处理方式包括忽略信号和终止进程等. 但用户可根据自身需要,对信号的处理方式进行重新定义。 7.2 Linux信号 内核在接收到信号后,未必马上对信号进行处理,而是选择在适当的时机,例如在中断、异常或系统调用返回时,在将控制权切换至进程之际,处理所接收的信号。 对于用户进程,进程在收到信号后,暂停代码的执行,保存当前的运行环境,转而执行信号处理程序,在信号处理结束后,恢复中断点的运行环境,按正常流程继续执行。 7.2 信号的重定义 void (*signal(int signum,void(* handler)(int)))(int); 作用:重新定义信号的处理方式 参数含义: signum 需设置的信号 handler 信号的处理方式 (1)SIG_DFL 默认信号处理 (2)SIG_IGN 忽略信号 (3)Handler 新信号处理函数 7.3 信号的定义 int main() { signal(SIGINT,SIG_IGN); for(::); return 0; } 7.3 信号的定义 main() { void f(int); int i; signal( SIGINT, f ); for(i=0; i5; i++ ){ printf(hello\n); sleep(1); } } void f(int signum) { printf(hello Linux \n); } 7.3信号的定义 信号处理函数 用户定义的信号处理函数运行在用户空间,进程运行在用户空间中的任意点时,都可能被信号处理函数中断。因此,信号的处理是异步的。为了避免因异步信号处理导致对共享数据操作的不一致性,在设计信号处理函数时应遵守一定编码规则,在信号处理函数中应使用可重入函数。 7.3信号的定义 可重入函数 可重入函数是指一个可以被多个任务调用的函数,为了满足这一要求,在函数中不能使用全局变量或静态局部变量,因为它们的生存周期不会因为函数的结束而结束,而是要到整个进程的结束而消失,这样,就有可能被多个任务异步存取造成数据的不完整性。 在信号处理函数中应避免使用下列不可重入函数: 1) 函数体内使用了静态的数据结构; 2) 函数体内调用了malloc()或者free()函数; 3) 函数体内调用了标准I/O函数。 7.4发送信号 kill(pid_t pid,int signo) 向进程发送信号 pid0 进程ID为pid的进程 pid=0 同一个进程组的进程 pid0 pid!=-1 进程组ID为 -pid的所有进程 pid=-1 除发送进程自身外,所有进程ID大于1的进程 调用成功返回 0,否则,返回 -1。 7.5计时器 在Linux系统中,时钟用来计算系统运行的时间,记录每个进程使用CPU的时间,调度器可根据这些信息决定何时切换进程。有时,应用程序需要延迟一段时间后继续运行,可使用sleep函数实现延时功能。例如,程序7-9使进程延迟10秒后继续运行。 7.5计时器 #includesignal.h
文档评论(0)