信号
信号是软件中断。提供了一种处理异步事件的方法。例如当用户在终端输入中断键(ctrl+c),会向前台进程发送一个中止信号SIGINT,以此来中止一个进程。
信号通常以SIG3个字符开头作为命名,例如SIGABRT是夭折信号;当进程调用abort函数时发出这种信号。SIGALARM是闹钟信号,由alarm函数设定的定时器超时后将产生这种信号。
几种常见的信号类型:
①当用户在终端输入某些键时,引起终端产生相应的信号。例如按下DELETE键或者Ctrl+C键将产生中断信号SIGINT。该信号用于停止一个失去控制的程序。
②硬件产生信号,区别于硬件中断。例如发生除0,引用无效地址。这些事件由硬件检测到,通知内核,然后内核向正在执行的进程产生相应的信号。
③进程调用kill(2)函数可以将任意信号发送给另外一个进程。但是其限制是接收信号进程和发送信号进程的所有者相同。或者发送该信号的进程为超级用户root
④当检测到某种软件条件发生,应向有关进程产生信号。例如SIGURG (网络链接上传来带外的数据)、SIGPIPE(在管道的读进程已结束,一个进程在写管道)以及SIGALRM(进程设定的定时器超时)
信号处理动作
①忽略此信号。大部分信号采取这种方式被处理,但SIGKILL和SIGSTOP这两种信号不能被忽略:因为它们是内核和超级用户使得进程终止或者停止的可靠方法。另外,如果引用错误的内存地址等异常产生的信号也不该被忽略,否则造成程序运行行为未定义。
②捕捉信号。应用程序必需提供一个函数,使得当相应的信号发生时,该事件能够按照定义被处理。例如如果捕获到SIGCHLD信号(子进程已经终止),那么此信号处理函数很可能调用waitpid获得子进程的进程ID和它的终止状态。
执行系统默认动作。值得注意的是,对于大多数信号的默认动作,是终止该进程,
函数signal
void (*signal(int signo,void