linux系统信号处理理解
SIGHUP 1 在控制终端上检测到挂断或控制线程死亡是
SIGINT 2 交互注意信号是
SIGQUIT 3 交互中止信号是
SIGILL 4 检测到非法硬件的指令是
SIGTRAP 5 从陷阱中回朔否
SIGABRT 6 异常终止信号是
SIGEMT 7 EMT 指令否
SIGFPE 8 不正确的算术操作信号是
SIGKILL 9 终止信号是
SIGBUS 10 总线错误否
SIGSEGV 11 检测到非法的内存调用是
SIGSYS 12 系统call的错误参数否
SIGPIPE 13 在无读者的管道上写是
SIGALRM 14 报时信号是
SIGTERM 15 终止信号是
SIGURG 16 IO信道紧急信号否
SIGSTOP 17 暂停信号是
SIGTSTP 18 交互暂停信号是
SIGCONT 19 如果暂停则继续是
SIGCHLD 20 子线程终止或暂停是
SIGTTIN 21 后台线程组一成员试图从控制终端上读出是
SIGTTOU 22 后台线程组的成员试图写到控制终端上是
SIGIO 23 允许I/O信号否
SIGXCPU 24 超出CPU时限否
SIGXFSZ 25 超出文件大小限制否
SIGVTALRM 26 虚时间警报器否
SIGPROF 27 侧面时间警报器否
SIGWINCH 28 窗口大小的更改否
SIGINFO 29 消息请求否
SIGUSR1 30 保留作为用户自定义的信号1是
SIGUSR2 31 保留作为用户自定义的信号是
注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。 另外,我再做一些补充,产生RST响应以至于系统发出SIGPIPE信号,应该分为两种情况:
1. 客户端到服务端之间网络断掉,或者服务端断电等,物理连接断掉了,这种情况下客户端不会退出,send函数正常执行,不会感觉到自己出错。因为由于物理网络断开,服务端不会给客户端回应错误消息,没有RST响应,自然也不会产生SIGPIPE信号。但是当服务端再恢复正常的时候,对客户端send来的消息会产生RST响应,客户端就收到SIGPIPE信号了,程序退出,但是这时send函数是能够返回 -1的。可以进行异常处理。
2.客户端到服务端的网络能通,服务程序挂掉,客户端程序会马上退出,因为服务端能正常返回错误消息,客户端收到,SIGPIPE信号就产生了。