信号的概念
信号(signal)是向进程发送的软件通知,通知进程有事件发生。引发信号的事件发生时,信号就被生成(generate)了。进程根据信号采取行动时,信号就被传递(deliver)了。信号的寿命(lifetime)就是信号的生成和传递之间的时间间隔。已经生成但还未被传递的信号被称为挂起(pending)的信号。在信号生成和信号传递之间可能会有相当长的时间。传递信号时,进程必须在处理器上运行。
信号生成时所采取的动作取决于那个信号当前使用的信号处理程序和进程信号掩码(process signal mask)。信号掩码中包含一个当前被阻塞信号(blocked signal)的列表。阻塞一个信号很容易和忽略一个信号混淆起来。被阻塞的信号不会像被忽略的信号一样被丢弃。如果一个挂起信号被阻塞了,那么当进程解除了对那个信号的阻塞时,信号就会被传递出去。程序通过调用sigprocmask改变它的进程信号掩码来阻塞一个信号,而通过调用sigaction将信号处理程序设置为SIG_IGN来忽略一个信号。
信号的类型
每个信号都有一个以SIG开头的符号名。信号的名字都定义在signal.h中,任何一个使用了信号的C程序中都要包含这个文件。信号的名字都是某个大于0的小整数的宏定义。下表中描述了必须的POSIX信号,并列出了它们的默认行为。有两个信号SIGUSR1和SIGUSR2是提供给用户使用的,没有预先指定的用途。
信号 | 描述 | 默认行为 |
---|---|---|
SIGABRT | 进程放弃 | 与实现有关 |
SIGALRM | 报警时钟 | 为正常终止 |
SIGBUS | 访问了内存对象中的未定义部分 | 与实现有关 |
SIGCHLD | 子进程被终止、停止或继续 | 忽略 |
SIGCONT | 如果进程被停止了,本信号继续 | 继续 |
SIGFPE | 算术计算中出现了被零除的错误 | 与实现有关 |
SIGHUP | 在控制终端或进程上挂起或终止 | 非正常终止 |
SIGINT | 交互终端提示信号(通常是Ctrl-C) | 非正常终止 |
SIGKILL | 终止(不能被捕获或忽略) | 非正常终止 |
SIGPIPE | 向一个没有读程序的管道写入 | 非正常终止 |
SIGQUIT | 交互终端终止:信息转储(通常为Ctrl-L) | 与实现有关 |
SIGSEGV | 无效的内存引用 | 与实现有关 |
SIGSTOP | 执行停止(不能被捕捉或忽略) | 停止 |
SITTERM | 终止 | 非正常终止 |
SIGTSTP | 终端停止 | 停止 |
SIGTTIN | 后台进程试图进行读操作 | 停止 |
SIGTTOU | 后台进程试图进行写操作 | 停止 |
SIGURG | 在套接字上有高带宽数据 | 忽略 |
SIGUSR1 | 用户定义的信号1 | 非正常终止 |
SIGUSR2 | 用户定义的信号2 | 非正常终止 |