Linux信号捕捉是进程间通信和异常处理的核心机制。对于初学者来说,理解信号如何被捕获并自定义处理,是编写健壮Linux程序的关键。本文将用最通俗的语言,带你从零掌握信号捕捉的方方面面。
信号是Linux系统用来通知进程发生了某种事件的一种软件中断。比如你按下Ctrl+C,内核就会向前台进程发送SIGINT信号,默认终止进程。但很多时候,我们希望进程在收到信号时执行一些清理工作,或者忽略某些信号——这就是信号处理函数的作用。
Linux提供了两种主要方式来设定信号处理行为:简单但古老的signal(),以及强大且符合POSIX标准的sigaction函数。对于新手,我们推荐直接学习sigaction(),因为它更可控、更安全。
#include #include #include void handler(int sig) { write(STDOUT_FILENO, "捕获到SIGINT,但我不退出!", 28);}int main() { struct sigaction sa; sa.sa_handler = handler; // 指定信号处理函数 sigemptyset(&sa.sa_mask); // 清空信号掩码 sa.sa_flags = 0; // 使用默认标志 // 用sigaction注册SIGINT的处理 sigaction(SIGINT, &sa, NULL); while(1) { printf("程序运行中,按Ctrl+C试试..."); sleep(2); } return 0;} 上面的例子中,我们通过sigaction函数将SIGINT绑定到自定义的handler(),这样进程就不会终止,而是打印一条消息后继续运行。注意sa_mask字段可以设置一个信号掩码,表示在handler执行期间,暂时阻塞哪些额外信号,防止嵌套干扰。
信号处理函数中只能调用“异步信号安全函数”(async-signal-safe),比如write()、_exit(),绝对不能调用printf()、malloc()等不可重入函数。这是因为信号可能在任意时刻打断主程序,如果主程序正好在执行malloc,再次调用malloc会导致堆损坏。
通过sigprocmask()或sigaction()的sa_mask,我们可以设置进程的信号掩码,临时阻塞某些信号。当信号被阻塞时,它不会丢失,而是变成“未决”状态,直到掩码解除后再递送给进程。这对于防止竞争条件非常有用。
掌握Linux信号捕捉不仅让你能写出更稳定的守护进程,也是深入理解操作系统异步事件的基石。记住:生产环境中尽量使用sigaction函数,明确管理信号掩码,并在信号处理函数中保持简洁。现在,打开你的终端,动手运行上面的例子,试着修改信号类型,观察程序行为变化吧!
※ 本文关键词:Linux信号捕捉、sigaction函数、信号处理函数、信号掩码 —— 希望这篇教程对你有帮助。
本文由主机测评网于2026-03-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260330066.html