关键词:Linux信号机制、信号捕捉、SIGCHLD信号、僵尸进程处理
在Linux操作系统中,信号(Signal)是一种异步通知机制。你可以把它想象成手机上的“APP推送通知”。当某个事件发生时,系统给进程发送一个信号,进程停下手中的活去处理这个信号,然后再回来继续工作。
常见的信号包括:Ctrl+C产生的SIGINT(终止进程)、SIGKILL(强制杀死进程)等。
默认情况下,信号都有其预定义的行为。但我们可以通过信号捕捉来自定义这些行为。在Linux中,最常用的函数是 signal() 或功能更强大的 sigaction()。
#include <stdio.h>#include <signal.h>void my_handler(int sig) { printf("捕捉到信号:%d,但我现在不想退出!\n", sig);}int main() { // 捕捉 SIGINT 信号 (Ctrl+C) signal(SIGINT, my_handler); while(1); return 0;} 当你在终端按下 Ctrl+C 时,进程不会直接退出,而是执行我们自定义的 my_handler 函数。这就是信号捕捉的基本流程。
这是本文的重头戏。SIGCHLD信号 是当子进程终止、停止或继续运行时,内核向其父进程发送的信号。
wait() 家族函数,子进程就会变成僵尸进程(Zombie Process),占用系统资源。为了防止僵尸进程的产生,我们可以在捕捉到 SIGCHLD 信号的函数中循环调用 waitpid()。这样,当任何一个子进程结束时,父进程都会被通知并释放子进程的 PCB(进程控制块)。
#include <sys/wait.h>void catch_child(int sig) { // 使用 WNOHANG 避免在没有子进程退出时阻塞 while (waitpid(-1, NULL, WNOHANG) > 0) { printf("成功回收了一个子进程\n"); }}// 在main函数中注册信号捕捉signal(SIGCHLD, catch_child); 通过本文的学习,我们了解了 Linux信号机制 的基本概念,掌握了 信号捕捉 的方法,并深入探讨了如何利用 SIGCHLD信号 优雅地处理 僵尸进程处理 问题。信号机制是系统编程的基石,掌握它将让你在开发高性能服务器程序时游刃有余。
本文由主机测评网于2026-04-02发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260432870.html