Unix/Linux信号是操作系统中一种古老而强大的进程间通信方式。它用于通知进程发生了异步事件,是系统与进程、进程与进程之间交互的基础。本文将从零开始,带你深入理解信号的原理、触发方式以及响应机制,并通过实战代码加深印象。
信号本质上是软件中断,它预先定义了一组整数常量(如SIGINT、SIGTERM),每个常量对应一个特定的事件。当进程收到信号时,可能执行默认操作(如终止、忽略)或调用用户自定义的信号处理函数。常见的信号包括:SIGINT(终端中断,通常由Ctrl+C触发)、SIGKILL(强制终止)等。
信号机制由内核管理。每个进程的task_struct结构中维护了未决信号集(pending)和信号阻塞集(blocked)。当信号产生时,内核将对应位设置到pending中;在进程从内核态返回用户态时,检查pending并递送信号。信号的来源多样:硬件异常(如除零)、终端输入(Ctrl+C)、软件条件(如alarm超时)或其他进程通过Unix/Linux信号发送。
触发信号即发送信号。常用方法有:• 命令行:kill -9 PID• 系统调用:C语言中使用kill()、raise()函数。• 软件条件:调用alarm()或setitimer()产生SIGALRM信号。
进程对信号的响应有三种方式:1. 默认处理:由内核定义的默认动作(如终止、停止、忽略)。2. 忽略信号:进程可明确表示不处理某些信号(SIGKILL和SIGSTOP除外)。3. 自定义处理:通过signal()或sigaction()注册函数。当信号递送时,内核调用该函数,完成后返回进程继续执行。注意,信号处理过程中可能被其他信号中断,这需要信号处理函数是可重入的。
下面是一个简单的C程序,它注册了SIGINT的处理函数,当用户按下Ctrl+C时,打印消息并退出。
#include #include #include void handle_sigint(int sig) { printf("捕获到SIGINT信号(%d),程序退出。", sig); _exit(0);}int main() { // 注册信号处理函数 signal(SIGINT, handle_sigint); printf("按 Ctrl+C 发送信号..."); while(1) { pause(); // 等待信号 } return 0;} 编译运行:gcc signal_demo.c -o signal_demo && ./signal_demo,然后尝试Ctrl+C。这个例子展示了进程间通信中最基本的信号收发。
信号是Unix/Linux系统编程的必备知识。理解信号机制有助于编写健壮的异步事件处理代码。本文介绍了信号的原理、触发和响应,并通过实战演示了信号捕获。希望你能举一反三,探索更多如sigaction的高级用法。
本文由主机测评网于2026-02-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260226963.html