接收信号
进程可以通过设置信号处理函数来定制对信号的反应,而非接受内核默认处理。
signal 系统调用:signal(signum, handler) 是最简单的信号处理设置接口。handler 可以取三个值:
SIG_IGN:忽略该信号(SIGKILL和SIGSTOP不能被忽略)。SIG_DFL:使用默认行为(终止、忽略、暂停或继续)。- 自定义函数指针:设置用户定义的信号处理函数。
sigaction 系统调用:sigaction 是 signal 的更安全和更健壮的替代接口。它允许精确控制信号处理行为,包括设置信号屏蔽字、指定信号标志等。sigaction 是 POSIX 标准推荐使用的接口。
默认行为(常见信号):
SIGINT/SIGKILL/SIGSEGV/SIGTERM:终止进程。SIGCHLD:忽略。SIGSTOP/SIGTSTP:暂停进程。SIGCONT:继续已暂停的进程。
信号处理的特点:信号处理程序是异步执行的,可能在程序执行的任何时刻被调用。这带来了并发安全问题——信号处理程序不能调用非可重入函数(如 printf、malloc),否则可能导致数据结构和状态的破坏。