信号是软中断,大多数的重要的应用程序需要处理信号。信号为处理异步事件提供看方法:用户在终端键入中断键,来停止一个程序,或者说是下一个的程序在管道中过早地终止。POSIX标准提供了可靠的规则,我们将要讨论的是这种情况。先熟悉一般的信号和每个信号的作用。随后,我们将了解早期实现中出现的错误。
所有的信号都有一个以SIG开头的名称,比如说:SIGABRT是中断信号,当一个程序调用abort时会产生这个信号。
SIGALRM信号是一个警告信号,当定时器被alarm函数设置的时间到点时产生。linux支持31个不同的信号。所有的信号都在signal.h文件中定义
没有信号的数值是0,因为在kill函数中还有更重要的用途,POSIX.1称之为空白信号。
简要介绍产生信号的条件:
a ctrl+c或者delete键都会导致一个正在运行的程序终止,产生的是SIGINT信号。
b 硬件的异常也会产生信号:除以0、非法的内存引用等等。这些情况都是被硬件检测到的,最终通知内核。内核将会产生信号来通知
在此时刻运行的程序。当一个进程运行非法的内存引用时会产生SIGSEGV信号。
kill函数允许一个进程向其他的进程或者进程组发送信号,这就需要我们是超级用户,有root权限。
软件环境也会产生信号,比如说:SIGURG(当带外数据到达了网络连接)、SIGPIPE(当一个进程向已经关闭的管道中写入数据)
SIGALRM(当程序设置的定时器已经到了)
信号时典型的异步事件的例子。信号时随机产生的,进程不能简单地测试一个变量值来判断是否产生了信号,反而,进程必需要向内核“什么情况下信号发生,接下来应该怎样做”
当信号发生时我们可以要求内核做以下三件事中的一件,我们称为信号的配置、或者说是信号的处理行为:
1 忽略信号。大多数的信号是被忽略的,但是这两个SIGKILL and SIGSTOP不能被忽略的,它们给kernel和超级用户准确的方法来停止和杀死任何的进程。
2 捕获信号。一般是告诉内核不管什么时候信号发生了都需要调用一个函数来处理。SIGKILL and SIGSTOP信号是不能被捕捉的。
3 执行默认的行为。每个信号都有默认的应用行为,值得注意的是一般默认的行为是终止进程。
core文件的使用:
用来调试进程在终止的时候的状态,core文件的生成是UNIX操作系统的一个特征。尽管不是POSX的特点
SIGCHLD(SIGCLD)无论什么时候一个进程终止或者停止了,SIGCHLD信号将会被发送给父进程。默认状态下,该信号被忽略,这样当父进程在子进程状态发生改变的时候需要被
通知的话,那么它需要捕捉该信号。通常的处理时调用wait函数来获取子进程的PID和终止状态。
SIGHUP若控制终端接口检测到连接中断,它会发送信号。
最简单的信号函数是:void*signal (int signo, void (*func) (int))) (int)
Sigaction
Sigpending
Sigqueue
Sigprocmask
Sigsuspend
Siginterrupt
Sigsetops
Signalfd: 创建一个文件来接收信号,返回文件描述符fd