目录
一、信号
信号是Linux进程间异步通信的唯一机制,用于通知进程一个特定的事件并强迫进程执行对应的处理程序,如用户在键盘上按crtl+c,内核会给当前控制台上正在运行的进程发送一个SIGINT的信号,进程收到该信号执行默认处理程序,即终止进程。在代码中信号是一组预定义的无符号整数,用两个字节来保存,所以最多是64个,执行kill -l命令会列出Linux支持的所有的信号,如下图:
其中前31个是继承自Unix的标准信号,其余的都是POSIX标准引入的扩展信号,叫做实时信号,两者区别如下:
1、当一个标准信号被阻塞时,后续发送给同一进程的同一信号则都会被丢弃。实时信号不会丢弃,而会进入一个待处理队列排队,同一类型信号按照发送的顺序处理。对不同类型的信号按照下列顺序处理:SIGILL(4),SIGTRAP(5),SIGBUS(7),SIGFPE(8),SIGSEGV(11), SIGSYS(31),其他标准信号(优先处理取值小的),实时信号。
2、标准信号传递到目标进程时没有携带任何信息,实时信号可以携带额外的如发送方相关的信息。
3、实时信号处理的优先级高于标准信号
4、实时信号没有明确的含义,由使用者自己来决定如何使用,标准信号有明确的含义和用途。
5、实时信号的默认都是结束当前的进程,标准信号有多种默认操作。
按照信号的用途可以分为以下几类:
1、进程控制,如SIGHUP挂机进程,SIGKILL强制终止进程,SIGTERM终止进程,SIGSTOP停止进程执行等
2、进程执行异常通知,如SIGILL非法指令,SIGABRT异常结束,SIGFPE浮点计算异常,SIGSEGV无效内存引用等
3、硬件错误通知,如SIGBUS总线错误,SIGSTKFLT协处理器栈错误,SIGPWR电源故障
4、跟踪进程执行,只有一个SIGTRAP
5、用户键盘操作通知,如SIGINT对应键盘的ctrl+c, SIGQUIT对应键盘的Ctrl+\,与SIGINT区别是会执行内存数据dump操作
6、定时通知,如SIGALRM,达到进程设置的时间后通知进程。
进程接收信号的本质是内核将该信号写入进程描述符中信号相关的字段中,进程处理信号有三种方法:
1、显示的忽略信号;
2、执行与信号相关的默认操作,默认操作取决于信号的类型,包含以下几种:Treminate(终止进程),Dump(终止进程并尽可能做核心转储),Ignore(忽略信号),Stop(停止进程执行,即把进程置为TASK_STOPPED状态),Continue(让TASK_STOPPED状态的进程继续执行)
3、调用自定义的信号捕获程序
信号如果不需要立即处理,可以阻塞信号,被阻塞的信号称为挂起信号(pending signal)。进程执行某个信号的处理程序时会自动阻塞该信号,即进程在处理完成前不会再接收同一信号,不会被同一信号中断,但是如果接收了其他信号则可能中