Linux信号:进程使用的三个方面

需积分: 3 0 下载量 64 浏览量 更新于2024-08-25 收藏 109KB PPT 举报
"进程可以使用信号来处理不同的事件,包括指定信号处理函数、阻塞信号以及向其他进程发送信号。信号是一种软件通知机制,用于告知进程发生了特定事件。信号的生命周期包括生成、挂起和传递。在Linux系统中,信号种类的数量与具体平台相关,并且有多个预定义的信号,如SIGHUP、SIGINT、SIGQUIT等,各自有不同的用途,如终端关闭、用户中断、浮点异常等。发送信号通常使用`kill`函数,可以通过指定进程ID来发送信号,不同PID值会使得信号发送给不同目标。" 在Linux操作系统中,信号(Signal)是一种核心的进程间通信方式,用于通知进程发生了特定事件。这些事件可能包括错误、异常情况或者由用户或其他进程有意触发的动作。进程可以有三种方式来处理接收到的信号: 1. **指定信号处理函数**:进程可以注册一个信号处理函数,当接收到特定信号时,该函数会被调用。例如,可以注册一个处理函数来捕获SIGINT(Ctrl+C)信号,执行清理工作然后退出。 2. **阻塞信号**:进程可以暂时不让某个信号被处理,将其放入阻塞列表。这意味着即使信号已经被生成,进程也不会立即响应,直到信号被取消阻塞。这有助于避免信号处理和关键代码段的冲突。 3. **向其他进程发送信号**:通过`kill`函数,进程可以向指定的进程发送信号。例如,使用`kill(-1, SIGTERM)`可以向所有具有权限的进程发送结束信号,而`kill(getppid(), SIGTERM)`则会向父进程发送结束信号。 信号的生命周期分为三个阶段:生成、挂起和传递。当引发信号的事件发生时,信号被生成。如果进程当前无法处理该信号,信号就会挂起,直到进程能够处理或者信号被重新调度。一旦进程开始处理信号,信号就被传递。 在Linux中,存在多种预定义的信号,每个信号都有特定的数值和宏名,如: - SIGHUP(1):终端挂断,通常用于通知依赖于终端的进程关闭。 - SIGINT(2):用户中断,通常是通过Ctrl+C产生的,用于请求进程终止。 - SIGQUIT(3):用户退出,通常通过Ctrl+\触发,用于生成核心转储并终止进程。 - SIGFPE(8):浮点运算异常,比如除以零或非法数学运算。 - SIGKILL(9):强制结束进程,不可被捕获、忽略或阻塞。 - SIGUSR1(10)和SIGUSR2(12):用户自定义信号,可按需使用。 - SIGALRM(14):定时器到期,通常与`alarm`函数一起使用。 - SIGTERM(15):温和的结束请求,进程可以优雅地关闭。 - SIGCHLD(17):子进程停止或结束时发出。 - SIGSTOP(19):调试或控制台操作导致的进程暂停。 `kill`函数是发送信号的主要手段,其参数包括目标进程ID和要发送的信号类型。如果成功,它返回0;如果失败,则返回-1并设置errno。 在实际应用中,两个紧密相关的进程可能会互相发送信号,例如,子进程向父进程发送信号以通知其已完成任务,或者父进程向子进程发送信号以请求其终止。了解并熟练使用信号机制是编写健壮的、能够正确响应系统事件的Linux程序的关键。