Linux进程信号是操作系统用于通知进程发生异步事件的机制,可以看作是一种软件中断。例如,当你在终端按下 Ctrl+C 时,内核会向前台进程发送 SIGINT 信号,默认终止进程。本文将带你从零理解信号的工作原理和用法。
想象你正在看书,手机闹钟响了——闹钟就是一种“信号”,它中断了你当前的动作,让你去处理“到时间了”这件事。在Linux中,信号处理函数就是你自己定义的“闹钟响后的动作”,你可以选择忽略、默认处理或自定义处理。
SIGINT (2):中断,通常由 Ctrl+C 产生。SIGTERM (15):终止信号,可被捕获并清理资源。SIGKILL (9):强制终止,不可被捕获或忽略。SIGALRM (14):定时器超时信号。这些信号在进程通信中也扮演重要角色,比如父子进程间可通过信号同步状态。
信号可以通过以下方式产生:
kill()、raise()、alarm()。当信号产生时,内核会在目标进程的信号pending集(未决信号集)中设置相应位,表示该信号已到达但尚未处理。如果进程当前信号阻塞了该信号,它会一直停留在pending状态,直到解除阻塞后才递送。
进程收到信号后有三种处理方式:
signal() 或 sigaction() 注册用户定义的信号处理函数,在函数中编写清理资源、记录日志等逻辑。每个进程都有一个信号屏蔽字,用于指定当前阻塞哪些信号。你可以使用 sigprocmask() 来修改它。当信号被阻塞时,即使产生了也不会立即处理,而是保持在pending状态。这是实现信号阻塞机制的关键,常用于避免临界区被信号中断。
#include #include #include void handler(int sig) { printf("捕获到信号 %d", sig);}int main() { signal(SIGINT, handler); // 自定义处理 SIGINT while(1) { printf("进程运行中..."); sleep(1); } return 0;} 运行后按 Ctrl+C,不再终止进程,而是打印消息。你可以通过 kill -TERM 测试其他信号。
Linux进程信号是系统编程的基础,理解它的产生、阻塞、处理能帮你编写更健壮的程序。信号也用于简单的进程通信,但传递信息量有限。希望本文让你对信号机制有了清晰认识,多写代码实践会掌握得更快!
—— 本文介绍了四个关键概念:Linux进程信号、信号处理函数、信号阻塞、进程通信 ——
本文由主机测评网于2026-02-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260225477.html