在Linux系统编程中,Linux信号是一种非常重要的进程间通信机制。它本质上是一个软件中断,用来通知进程发生了异步事件。你可以把它想象成生活中的“红绿灯”——信号告诉进程“该停下来了”或者“有数据到了”。本文将从零开始,带你彻底搞懂信号、中断以及kill函数、alarm函数等核心工具。
信号是Linux/Unix系统响应某些条件而产生的事件。进程可以忽略信号(除SIGKILL和SIGSTOP外)、捕捉信号并执行自定义处理函数,或者执行默认操作(如终止进程)。常见的信号有SIGINT(Ctrl+C)、SIGSEGV(段错误)等。
中断分为硬件中断和软件中断。硬件中断由CPU外部设备(如键盘、网卡)触发,直接报告给CPU;而信号是一种软件中断,由内核或进程产生,在用户态处理。两者的共同点是都能打断程序的正常执行流,但信号更灵活,是进程间通信的基本手段之一。
信号的来源可以是硬件异常、终端操作或系统调用。下面重点介绍四个最常用的信号发送函数:
int kill(pid_t pid, int sig);kill(getpid(), sig);unsigned int alarm(unsigned int seconds);其中alarm函数常用于实现超时控制,比如网络连接等待。
进程可以通过信号处理函数改变信号的默认行为。最简单的是signal()函数,但更推荐使用sigaction(),因为它更可靠。
#include #include #include void handler(int sig) { printf("捕获信号 %d", sig);}int main() { signal(SIGINT, handler); // 按Ctrl+C触发handler alarm(5); // 5秒后发送SIGALRM raise(SIGUSR1); // 向自身发送SIGUSR1 while(1) pause(); return 0;} 上述代码展示了信号处理的基本流程:自定义函数、注册信号、触发信号。你可以看到kill函数在这里没有直接使用,但raise()实际上是它的特例。
假设我们想等待用户输入,但最多等5秒:
#include #include #include void timeout(int sig) { printf("超时!程序结束"); _exit(0);}int main() { signal(SIGALRM, timeout); alarm(5); char buf[100]; printf("请在5秒内输入:"); fgets(buf, sizeof(buf), stdin); alarm(0); // 取消定时器 printf("输入:%s", buf); return 0;} 这里alarm函数的妙用是:若5秒内无输入,内核发送SIGALRM,触发timeout函数终止进程。
高级编程中还需要掌握信号集操作(sigset_t)和信号阻塞(sigprocmask),它们允许进程临时“屏蔽”某些信号,等到解除屏蔽后再处理。这是实现临界区保护的重要技巧。
本文从Linux信号的基本概念出发,对比了硬件中断与软件中断的区别,详细剖析了kill函数、raise、abort以及alarm函数的用法,并通过代码演示了信号处理的完整流程。信号是Linux异步事件编程的基石,掌握它将为你后续学习多线程、网络编程打下坚实基础。
—— 第二十一弹完结,下一弹将讲解信号的高级特性:实时信号与sigqueue。
本文由主机测评网于2026-02-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260225047.html