Linux为实现信号处理提供了比较多的接口,看似纷杂,但理清信号的关系后还是很有条理的。主要分为以下四组,怎么发送一个信号,收到一个信号后做什么样的处理,主动等待一个信号的发生,对特定信号只记录是否发生供以后再处理;四组的API如下(不考虑多线程):
发送信号 kill, alarm, arise;
安装信号 signal, sigaction;
等待信号 sigsuspend, sigwait,pause;
阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask;
发送信号, kill, alarm, arise
这是唯一一组由信号发送方调用的API,其中alarm, arise都是给自己进程产生信号,而kill是可以从一个进程发送一个信号到另一个进程,因为信号的接收方一般都不做权限检查,所以发送方要有权限给的接收方发送信号信号才能被发送,要不然我就可以写个非法程序,直接使用kill给进程1发送一个SIGKILL信号的话,你的系统基本也就OVER了。这个权限检查的指导原则按我的理解是,发送方的有效用户是否有权限给接收方的实际用户发送信号来决定。因为,当你运行一个seteuid程序,这个程序运行时的euid可能不再是ruid了,但是你仍然可以kill它。arise()的实现我猜就是用kill(getpid(), signo)来实现。另外系统内核检测到一些异常或是状态改变时也会给进程发送信号,如SIGINTR,SIGCHILD等等。
安装信号, signal, sigaction
这组API是决定收到一个信号号的处理方法。如果不显示的安装一个信号的处理方法,系统都有对应的默认处理方法,大多数都是直接终止程序本身. 在richard stevens的APUE中说signal的信号处理需要重新安装信号处理方法,但我在FC5下测试,不重新安装也是可以的,并且正在进行信号处理时,发送一个信号过去,该信号也不会丢失,只是暂时阻塞,等前面的信号处理完后再处理。当然当正在信号处理时发送多个信号过去,信号处理完后,可能传递一个信号过去,其它的信号会丢失。至于直接使用signal安装信号,等信号处理完后是否会重启被该信号中断的慢速系统调用,我没有测试,不得而知。 当然你可以使用sigaction来安装信号,并显示的指明restart标志,这样被该信号中断的系统调用就会自动重启。sigaction这个API更复杂,功能也更多灵活,可以随意定制,通过siginfo_t的结构,可以得到很多信号相关的信息。我猜现在的linux的signal都是用sigaction封装来实现的。跟sigaction相比,signal简单多了,没理由不用它,当然,你得保证signal的语义不会对你的程序造成冲突。
等待信号 pause, sigsuspend, sigwait
这组API都是等待信号的发生,可以根据程序的实际需求来选取。pause只要接收到信号就会返回,sigsuspend跟sigwait都是只等待某些特定的信号发生,但sigsuspend是把参数里的信号集给阻塞,而sigwait一般是先调用sigprocmask把所有的信号都阻塞,然后再等待sigwait参数里指定的信号。通常sigwait用在多线程程序里,主线程把所有信号都mask掉,然后不同的线程用sigwait来等待自己感兴趣的信号。
阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask
这一组API最多也最简单,前面五个API都是对信号集的操作,用它用得到一个你想要的信号集后就可以调用sigprocmaks的设置程序的信号掩码了。
另外, siglongjmp, sigsetjmp是安全的在信号处理程序里跑转的两个接口。
最后一些跟信号处理程序里的一些注意事项
1、因为信号会中断慢速的系统调用,所以当系统调用失败时,一定要检查失败原因,当被信号中断时做出重启系统调用的动作;
2、因为信号处理有异步性,所以任何在信号处理程序里调用了不具可重入性的函数都要小心了。这里的不具可重入性的函数据括了系统调用跟自己定义的函数。
3、在信号处理程序里任何可能导致对全局变理的修改也要小心了,一个经常被人忽视的就是在信号处理程序里调用了一个系统调用后可能导致errno的修改。
转:http://blog.csdn.net/guosha/article/details/2943615
分享到:
相关推荐
`linux-sig.rar_linux sig 10`这个压缩包文件可能包含了多个不同版本的Linux信号处理示例代码,方便学习者了解和研究如何在C语言或其他支持的编程语言中处理这些信号。 首先,我们要理解什么是信号。信号是Linux...
Linux信号编程是操作系统领域的重要组成部分,特别是在开发服务器端软件或者进行系统级编程时,理解并掌握信号机制至关重要。本资源“Linux信号编程课件与实验代码.rar”提供了一个全面学习和实践Linux信号处理的...
Linux信号是进程间通信(IPC)的一种机制,它允许一个进程向另一个进程发送异步通知。Linux信号在进程控制中的应用非常广泛,既可以通过信号传递信息,又能在一定程度上控制进程的操作。本文将详细探讨Linux信号在...
### Linux信号详解 #### 一、引言 在Linux系统中,信号是一种进程间通信机制,主要用于异步通知进程发生了某种事件。通过本篇文章,我们将详细介绍Linux中的信号及其作用。 #### 二、信号概述 Linux信号是操作...
### Linux信号专题笔记 #### Linux信号基本概念 Linux信号是一种软件中断机制,它允许系统对特定事件做出反应。这些事件可以是程序错误、外部请求或者是系统级别的改变。当发生这样的事件时,系统会向进程发送一个...
总的来说,Linux信号机制为进程间的交互提供了灵活的方式,通过设置信号处理函数,可以定制化程序对不同事件的响应。信号处理不仅可以用于进程间的通信,也可以用于内部程序控制,如异常处理、定时器等。了解和熟练...
Linux系统中的信号量处理涉及进程间通信的一种机制,允许一个进程在执行中被中断,响应另一个进程或终端发送的信号。信号提供了一种异步的软件中断方式,使得应用程序可以在接收到特定信号时,做出相应的处理。 ...
Linux信号机制是操作系统内核中用于进程间通信和异常处理的一种机制。它允许一个进程向另一个进程发送消息,这些消息可以是关于特定事件的通知,或者是请求执行特定操作的命令。在Linux系统中,信号机制是基于POSIX...
【Linux信号】是操作系统Linux中进程间通信的一种基础机制,它允许进程向其他进程发送简短的通知,通常用于处理异步事件。信号不携带数据,而是携带特定含义,如SIGABORT表示进程异常终止,SIGALRM则表示超时警告。...
理解并熟练掌握Linux信号机制对于进行系统级编程至关重要。 信号是操作系统向进程发送的一种消息,它可能由内核生成,也可能由另一个进程产生。当进程接收到一个信号时,它可以选择忽略该信号,或者按照预设的行为...
本文实例讲述了linux下基于C语言的信号编程方法。分享给大家供大家参考。具体如下: #include #include #include #include #include void sig_handler(int sig_no, siginfo_t *info, void *ctext){ printf...
【Linux信号】是操作系统提供的一种进程间通信机制,主要用于通知进程发生了特定事件。信号是软件中断,不携带数据,仅用于触发进程响应。在Linux环境下,我们可以通过`kill`和`killall`命令来发送不同类型的信号。 ...
在Linux中,信号有特定的名称,如SIGABRT(程序异常终止)、SIGALRM(闹钟信号)等,这些名称以SIG开头。在头文件`<signal.h>`中,每个信号都被定义为正整数的信号编号。例如,SIGINT对应于用户按下DELETE键时的中断...
本篇文章将深入探讨Linux信号机制,包括其基本概念、主要函数如`signal`和`sigaction`的使用方法,以及相关实例。 首先,信号是内核向进程传递信息的一种机制,它可以用来中断进程的正常执行,或者通知进程发生了...
### Linux C++ 信号通信开发资料 #### 一、引言 在计算机程序设计领域,尤其是在基于Linux或Unix系统的环境中,进程间的通信是一项至关重要的技术。信号(signal)作为进程间通信(IPC)的一种机制,其作用是允许一个...
`handler`可以设置为`SIG_IGN`以忽略信号,或者设置为`SIG_DFL`让内核执行默认操作。 信号处理函数的使用是Linux编程中的关键部分,它允许程序员在特定事件发生时采取行动,如数据保存、资源释放等。通过自定义的...
Linux操作系统中的信号机制是进程间通信的一个重要组成部分,它源于早期的Unix系统,并在Linux中得到广泛使用。信号是通知进程异步事件发生的一种方式,这些事件可能包括硬件异常、程序错误或者用户交互。在Linux中...
本篇主要介绍Linux信号的基本概念,以及如何在C语言中使用信号函数进行处理。 一、Linux信号概念 1. **信号类型**:Linux定义了多种标准信号,如SIGINT(Ctrl+C,用于中断程序)、SIGTERM(软杀掉进程)、SIGKILL...
### Linux下C语言编程——信号处理 #### 一、引言 在Linux环境下,C语言是一种非常重要的开发工具,尤其在系统级编程方面。信号处理是C语言编程中不可或缺的一部分,它涉及到进程间的通信机制以及如何让程序能够...