信号是一种进程间通信的方法,它应用于异步事件的处理。信号的实质是一种软中断,它被发送给一个正在被执行的进程以通知进程有某一特定事件发生了。
一、信号含义
信号拥有自己特定的名字,均以SIG开始,它们在头文件中被定义为一个正整数,这些正整数被称为信号编号(signal number)。
以下为各个信号的具体含义:
- SIGHUP:当终端发现断线情况时发送给与控制终端相连的控制进程的信号,或控制进程运行结束时发出的信号。它通常用来通知守护进程重新读取系统配置文件。
- SIGINT:进程中断信号,可以用来中断一个正在运行的进程。通常是从终端输入的中断指令,如Ctrl+C键或Delete键。
- SIGQUIT:用于中断前台进程组中的所有进程的信号。由终端输入的退出指令Ctrl+\所产生。这一信号在终端进程的同时,还将产生一个core文件。
- SIGILL:执行非法硬件指令时产生的错误。
- SIGTRAP:跟踪陷阱信号。
- SIGIOT:I/O错误信号。
- SIGBUS:系统总线错误时产生的信号。
- SIGFPE:浮点运算中发生溢出错误时产生的信号。
- SIGKILL:可用于终止任何一个进程的信号,只能由系统管理员发出,是不可捕捉和被忽略的信号之一。
- SIGUSR1:用于用户自定义的预留信号。可由用户在应用程序中自行定义。
- SIGSEGV:使用非法内存地址所产生的信号。
- SIGUSR2:同SIGUSR1。
- SIGPIPE:当对一个读进程已经运行结束的管道执行写操作时产生的信号。
- SIGALRM:由alarm函数设定的时间段终止时,会产生此信号。
- SIGTERM:调用kill(1)命令时缺省产生的信号。
- SIGCHLD:当一个子进程结束或中断时,用于通知其父进程的信号。必要时,父进程可以通过这一信号来了解子进程的状态变化及结束状态等信息。但在大多数情况下,这一信号将被忽略。
- SIGCONT:是使已被中断的进程继续执行的信号。当此信号为某一特定进程产生后,如果此时该进程并没有被中断,将不会有任何操作发生;但如果该进程是一中断了的进程,即使SIGCONT信号被阻塞或被忽略,此进程也将会继续进行。
- SIGSTOP:中断进程的信号。它是一个作业信号,同时也是不可被捕捉和被忽略的信号之一。
- SIGTSTP:交互式的中断信号。通常是在输入中断键Ctrl+Z时,由终端驱动器所产生。
- SIGTTIN:当一个后台进程需要从终端读取数据时,终端驱动器产生的信号。当读取数据的进程忽略或阻塞这个信号,或者读取数据的进程所在的进程组是孤立进程组时,信号不会产生,并且读操作会发生错误返回,将errno置EIO。
- SIGTTOU:当一个后台进程需要向终端写入数据时,终端驱动器产生的信号。当写入数据的进程忽略或阻塞这个信号,或者写数据的进程所在的进程组是孤立进程组时,信号不会产生,并且写操作会发生错误返回,将errno置EIO。与SIGTTIN不同的是,进程可以选择对控制终端进行后台写。如果后台写不被允许则同SIGTTIN信号一样。
- SIGURG:套接字上出现出现紧急情况时产生的信号。
- SIGXCPU:超出CPU时间限制时产生的信号。
- SIGXFSZ:超出文件大小时产生的信号。
- SIGVTALRM:虚拟定时器报警信号。
- SIGPROF:Profiling定时器报警信号。
- SIGWINCH:终端窗口改变时产生的信号。
- SIGIO:表示某个特定文件描述符上可以进行I/O操作的信号。
- SIGPWR:电源失效信号。
- SIGABRT:调用abort函数时产生的信号,将会使进程非正常结束。
- SIGEMT:实现性定义硬件错误发生时产生的信号。
二、信号的处理
信号是用于处理异步事件的发生的。在一个进程执行过程中,如果有信号被发送到该进程,则该进程将按预先设定好的处理方法进行相应处理。总体上来讲,当信号发生时,进程所采取的处理方法可以分为两种:
- 捕捉信号。当某个信号被发送到一个正在运行的进程时,该进程及对此特定信号注册相应的信号处理函数,以完成所需处理。也就是说,在编写程序代码时,对需要进行捕捉处理的信号给出相应的处理程序代码。一旦接收到此信号,则通知系统调用相应信号处理函数做出处理。对应于每一个信号,系统中都有相应的缺省处理函数(通常为终止进程)。可以设定进程在信号发生时使用缺省处理函数进行处理。
- 忽略信号。当不希望接收到的信号对进程的执行产生影响,而让进程继续进行时,可以忽略该信号。进程将继续进行而不对信号进行任何处理。