不要使用linux的信号
除非必要,不要使用linux的信号做任何事情。因为这套工具的使用非常容易出错,对开发人员的基础知识和经验要求较高。
不要处理SIGSEGV
除非必要,不要处理SIGSEGV。处理错误会导致进程段错误后进入处理段错误的死循环。
不要处理SIGCHLD
除非必要,不要处理SIGCHLD。处理错误会产生僵尸进程。
不要处理SIGCONT
除非必要,不要处理SIGCONT。Systemd在正常退出时会连续发SIGCONT和SIGTERM,处理的不好会导致收不到SIGTERM。
信号处理函数中不应该有复杂的业务逻辑
信号处理函数中不应该有复杂的业务逻辑处理,因为信号处理会占用当前线程的运行时,如果当前运行时与信号处理的逻辑之间有冲突,就容易导致死锁。最常见的情况是当前线程正在分配内存,信号处理函数中也有分配内存的操作,这时当前线程就会死锁。信号处理函数中最好是就改一下标志位,然后以可重入的方式通知负责处理信号的线程,让信号处理线程去做详细的处理。
为什么你不应该使用信号?
Linux信号分为可靠信号和不可靠信号。大多数常用的信号都是不可靠信号。不可靠信号其实就是多个信号同时到来后没有队列机制,没有及时处理的不可靠信号都会被系统丢弃。Linux系统虽然提供了一套机制来可靠地处理不可靠信号,但是该机制的使用和调试比较复杂,建议还是尽量避免连续收信号的情况。如果一定要使用,请搜索sigprocmask和sigpending的用法。