当前位置:首页 > 系统教程 > 正文

Linux进程信号终极指南 (从入门到实践)

Linux进程信号终极指南 (从入门到实践)

Linux进程信号终极指南 (从入门到实践) 进程信号 信号处理函数 信号集操作 sigaction函数 第1张

进程信号是Linux系统中一种重要的进程间通信机制,用于通知进程发生了异步事件。本文将带你全面了解信号的产生、处理、阻塞以及高级应用。

1. 信号基础概念

信号是一个软件中断,每个信号都有一个编号和默认处理动作。常见的信号如SIGINT(2)由Ctrl+C产生,SIGKILL(9)强制杀死进程。信号有三种处理方式:默认、忽略和自定义捕捉。

2. 信号产生方式

信号可通过终端按键、系统调用(如kill、raise)、软件条件(如alarm定时器)产生。例如,kill -9 PID发送SIGKILL信号。

3. 信号集与阻塞/未决

每个进程都有信号屏蔽字和未决信号集。通过信号集操作函数(sigemptyset, sigaddset等)可以设置要阻塞的信号。使用sigprocmask修改阻塞集,sigpending获取未决信号。

    sigset_t set;sigemptyset(&set);sigaddset(&set, SIGINT);sigprocmask(SIG_BLOCK, &set, NULL);  // 阻塞SIGINT  

4. 信号捕捉与sigaction函数

signal函数可注册信号处理函数,但推荐使用更强大的sigaction函数。它支持信号传递额外信息、自动重设等。

    struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT, &act, NULL);  

5. 可重入函数与volatile

信号处理函数中应调用可重入函数,避免使用全局变量。用volatile修饰全局变量可防止编译器优化,确保内存可见性。

6. SIGCHLD信号

子进程状态变化时,父进程会收到SIGCHLD信号。通过捕捉该信号,可以异步回收子进程,避免僵尸进程。

    void handler(int sig) {    wait(NULL);}signal(SIGCHLD, handler);  

掌握这些内容,你就对Linux进程信号有了全面深入的理解。多动手实践,才能更好地运用信号处理机制。