Linux信号详解:常见信号与用途

需积分: 3 0 下载量 63 浏览量 更新于2024-08-25 收藏 109KB PPT 举报
"常见信号及用途-第四章 LINUX信号" 在Linux系统中,信号是一种用于进程间通信的重要机制,它们提供了向进程发送通知的方式,告知进程有特定事件发生。信号可以由内核生成,也可以由其他进程通过`kill`函数发送。本章主要介绍了信号的相关概念、使用方式和处理方法。 1. **信号的概念** - 信号是软件通知,用来告知进程发生了特定事件。这些事件可以包括错误、用户交互或其他进程的请求。 - 进程可以通过三种方式使用信号:设置信号处理函数、阻塞信号以及发送信号给其他进程。 - 信号的生命周期包括生成、挂起和传递三个阶段。挂起的信号是在生成后但尚未传递给进程的状态。 2. **常见信号及其用途** - SIGHUP(1):通常由终端关闭引发,通知进程重新初始化或结束。 - SIGINT(2):来自键盘的中断信号,如Ctrl+C,通常用于终止程序执行。 - SIGQUIT(3):从键盘触发的退出信号,通常生成核心转储。 - SIGFPE(8):浮点运算异常,如除以零或非法运算。 - SIGKILL(9):强制结束进程,无法被捕获或忽略。 - SIGUSR1(10)、SIGUSR2(12):用户自定义信号,供应用程序使用。 - SIGALRM(14):进程的定时器到期时发送,常用于超时处理。 - SIGTERM(15):优雅地结束进程,进程可以捕获并执行清理操作。 - SIGCHLD(17):标识子进程的停止或结束,用于父进程管理子进程状态。 - SIGSTOP(19):无条件停止进程,类似于调试时的暂停。 3. **发送信号** - 使用`kill`函数向指定进程发送信号,参数`pid`是目标进程ID,`sig`是信号类型。 - `kill`函数的成功返回值是0,失败则返回-1,并设置`errno`。 - `pid`值的不同可以指定发送信号的目标,如向特定进程、进程组或所有进程发送。 例如,以下代码片段分别向进程ID为3423的进程发送SIGUSR1信号,以及向其父进程发送SIGTERM信号: ```c if(kill(3423, SIGUSR1) == -1) perror("Failed to send the SIGUSR1 signal"); if(kill(getppid(), SIGTERM) == -1) perror("Failed to kill parent"); ``` 4. **信号处理** - 进程可以注册信号处理函数,决定在接收到信号时如何响应。 - 可以使用`signal()`或`sigaction()`函数设置信号处理方式,包括默认行为、忽略信号或执行自定义函数。 - 阻塞信号可以使进程暂时不响应某个信号,直到解除阻塞。 信号是Linux系统中进程间通信的关键机制,允许进程对各种事件作出反应,包括错误处理、用户交互和进程管理。理解和熟练使用信号机制对于编写健壮的多进程应用程序至关重要。