当前位置: 首页 > news >正文

【Linux】常见信号 + 进程和作业

文章目录

  • 一、常见信号
    • 引言
      • 了解中断
    • 1. 什么是信号?
      • 查看所有信号:
    • 2. 常见信号及其作用
      • (1) **`SIGHUP` (1) - Hangup**
      • (2) **`SIGINT` (2) - Interrupt**
      • (3) **`SIGQUIT` (3) - Quit**
      • (4) **`SIGKILL` (9) - Kill**
      • (5) **`SIGTERM` (15) - Terminate**
      • (6) **`SIGSTOP` (19) - Stop**
      • (7) **`SIGCONT` (18) - Continue**
      • (8) **`SIGSEGV` (11) - Segmentation Fault**
      • (9) **`SIGPIPE` (13) - Broken Pipe**
      • (10) **`SIGCHLD` (17) - Child Status Change**
    • 3. 信号的处理方式
      • 示例:捕获 `SIGINT`(`Ctrl+C`)
    • 4. 如何发送信号?
      • (1) 命令行工具:
      • (2) 程序内发送:
    • 5. 重要注意事项
    • 6. 总结
  • 二、进程和作业
    • 1. 基本定义
      • 进程(Process)
      • 作业(Job)
    • 2. 关键区别
    • 3. 实际示例
      • 进程示例
      • 作业示例
    • 4. 控制方式对比
      • 进程控制
      • 作业控制
    • 5. 重要关系说明
    • 6. 何时使用哪个概念?

一、常见信号

引言

在 Linux 系统中,信号(Signal)是一种进程间通信机制,用于通知进程发生了某种事件。信号可以由内核、其他进程或进程自身发送。理解这些信号的作用对于系统编程、进程管理和故障排查至关重要。本文将介绍 Linux 中最常见的信号及其用途。

了解中断

在这里插入图片描述


1. 什么是信号?

信号是 Linux 系统中一种异步通知机制,用于通知进程某个事件的发生。每个信号都有一个唯一的编号(如 SIGKILL9)和默认行为(如终止进程、忽略或暂停进程)。

查看所有信号:

kill -l

这将列出系统支持的所有信号(通常 1~31 是标准信号,34~64 是实时信号)。


2. 常见信号及其作用

(1) SIGHUP (1) - Hangup

  • 作用:终端断开或控制进程终止时发送。
  • 默认行为:终止进程。
  • 典型场景
    • 终端关闭时,该终端下的进程会收到 SIGHUP
    • nohup 命令可以让进程忽略 SIGHUP,避免被终止。

(2) SIGINT (2) - Interrupt

  • 作用:用户按下 Ctrl+C 时发送。
  • 默认行为:终止进程。
  • 典型场景
    • 用于交互式终止前台进程。

(3) SIGQUIT (3) - Quit

  • 作用:用户按下 Ctrl+\ 时发送。
  • 默认行为:终止进程并生成核心转储(core dump)。
  • 典型场景
    • 用于强制终止进程并调试(生成 core 文件)。

(4) SIGKILL (9) - Kill

  • 作用:强制终止进程。
  • 默认行为:立即终止进程,无法被捕获或忽略。
  • 典型场景
    • kill -9 PID 用于强制杀死无响应的进程。

(5) SIGTERM (15) - Terminate

  • 作用:请求进程正常终止。
  • 默认行为:终止进程。
  • 典型场景
    • kill PID 默认发送 SIGTERM,允许进程清理资源后退出。

(6) SIGSTOP (19) - Stop

  • 作用:暂停进程执行。
  • 默认行为:暂停进程,无法被捕获或忽略。
  • 典型场景
    • kill -19 PID 暂停进程,可用 SIGCONT 恢复。

(7) SIGCONT (18) - Continue

  • 作用:恢复被暂停的进程。
  • 默认行为:继续执行进程。
  • 典型场景
    • kill -18 PID 恢复被 SIGSTOP 暂停的进程。

(8) SIGSEGV (11) - Segmentation Fault

  • 作用:进程访问非法内存时触发。
  • 默认行为:终止进程并生成核心转储。
  • 典型场景
    • 程序出现空指针解引用或越界访问时触发。

(9) SIGPIPE (13) - Broken Pipe

  • 作用:向无读端的管道写入数据时触发。
  • 默认行为:终止进程。
  • 典型场景
    • echo "hello" | head -n1echo 会收到 SIGPIPE 因为 head 提前退出。

(10) SIGCHLD (17) - Child Status Change

  • 作用:子进程终止或暂停时发送给父进程。
  • 默认行为:忽略。
  • 典型场景
    • 父进程可通过 wait() 回收子进程资源,避免僵尸进程。

3. 信号的处理方式

进程可以自定义信号处理函数(通过 signal()sigaction()),或选择:

  • 默认行为(如终止、暂停、忽略)。
  • 忽略信号SIGKILLSIGSTOP 除外)。
  • 捕获信号(执行自定义处理函数)。

示例:捕获 SIGINTCtrl+C

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handler(int sig) {
    printf("\nReceived SIGINT (Ctrl+C), but I won't die!\n");
}

int main() {
    signal(SIGINT, handler);  // 捕获 SIGINT
    while (1) {
        printf("Running...\n");
        sleep(1);
    }
    return 0;
}

运行后,按 Ctrl+C 不会终止进程,而是执行自定义函数。


4. 如何发送信号?

(1) 命令行工具:

  • kill -SIGNAME PID
    例如:kill -9 1234(强制杀死 PID 1234)。
  • pkill -SIGNAME process_name
    例如:pkill -TERM nginx(优雅终止 nginx)。

(2) 程序内发送:

  • kill() 系统调用:
    kill(pid, SIGTERM);
    

5. 重要注意事项

  1. SIGKILLSIGSTOP 无法被捕获或忽略,用于强制控制进程。
  2. SIGTERM 是优雅终止的首选,允许进程清理资源。
  3. 僵尸进程需要通过 SIGCHLD 处理或 wait() 回收。
  4. 信号处理函数应尽量简单,避免调用非异步安全函数(如 printf)。

6. 总结

信号编号默认行为常见用途
SIGHUP1终止终端断开时通知进程
SIGINT2终止Ctrl+C 中断进程
SIGQUIT3终止+core dumpCtrl+\ 强制终止并调试
SIGKILL9终止强制杀死进程
SIGTERM15终止请求进程正常退出
SIGSTOP19暂停暂停进程(不可捕获)
SIGCONT18继续恢复被暂停的进程

掌握这些信号有助于更好地管理 Linux 进程和编写健壮的程序。建议在实际开发中结合 man 7 signal 进一步学习!

二、进程和作业

在 Linux/Unix 系统中,"作业"和"进程"是两个密切相关但又有重要区别的概念。理解它们的差异对于系统管理和脚本编程至关重要。

1. 基本定义

进程(Process)

  • 定义:进程是操作系统进行资源分配和调度的基本单位,是程序的一次执行实例。
  • 特点
    • 有独立的地址空间
    • 由内核直接管理
    • 通过进程ID(PID)唯一标识
    • 可以创建子进程(形成进程树)

作业(Job)

  • 定义:作业是shell管理的概念,指用户通过shell启动的一个或多个关联进程的集合。
  • 特点
    • 由shell维护和管理
    • 可以包含一个进程或一个进程组(管道命令)
    • 有作业号(Job ID)标识
    • 可以控制为前台或后台运行

2. 关键区别

特性进程作业
管理主体操作系统内核管理Shell管理
标识符PID(进程ID)作业号(如%1)
生命周期独立存在与Shell会话绑定
可见性系统全局可见(通过ps命令)仅在当前Shell可见
控制方式通过kill等系统调用通过jobs、fg、bg等Shell内置命令
组成单个执行实例可以是一个进程或进程组

3. 实际示例

进程示例

$ sleep 100 &
[1] 25341  # 25341是PID,[1]是作业号
$ ps -ef | grep sleep
user     25341 12345  0 10:00 pts/0    00:00:00 sleep 100

作业示例

$ sleep 100 | sleep 200 &  # 这是一个作业,包含两个进程
[1] 25341-25342
$ jobs
[1]+  Running                 sleep 100 | sleep 200 &

4. 控制方式对比

进程控制

# 查看进程
ps aux

# 终止进程
kill -9 PID

# 查看进程树
pstree

作业控制

# 查看作业
jobs

# 将后台作业调到前台
fg %1

# 将前台作业放到后台(先Ctrl+Z暂停,然后)
bg %1

# 终止作业
kill %1

5. 重要关系说明

  1. 一个作业可以包含多个进程(如管道命令 cmd1 | cmd2
  2. Shell会话结束时,其管理的所有作业会收到SIGHUP信号(除非使用nohup或disown)
  3. 作业控制是Shell提供的功能,不同Shell(bash、zsh等)实现可能略有差异
  4. 进程是系统级概念,作业是用户级概念

6. 何时使用哪个概念?

  • 当需要精细控制系统资源时,关注进程
  • 当需要管理Shell中启动的任务时,使用作业控制
  • 编写脚本时,通常需要同时考虑两者关系

理解这些区别可以帮助您:

  • 更有效地管理系统资源
  • 编写更健壮的Shell脚本
  • 正确处理任务挂起、恢复和终止
  • 避免产生僵尸进程或孤儿进程
http://www.dtcms.com/a/99289.html

相关文章:

  • Java常用异步方式总结
  • 硬实时操作系统(Hard Real-Time OS)与软实时操作系统(Soft Real-Time OS)的区别
  • matplot显示中文
  • json-server使用方法
  • Android14 SystemUI中添加第三方AIDL
  • java.util包之java.util.Collection介绍
  • 并发编程之最小化共享
  • 21_js正则_表单验证
  • Java基于SpringBoot的网络云端日记本系统,附源码+文档说明
  • 若依——基于AI+若依框架的实战项目(实战篇(上))
  • SourceMap原理
  • 打破循环依赖的三大法宝:Spring Boot实战解析
  • 基于三维数字图像相关(DIC)全场应变测量技术的基础设施结构健康监测与安全评估方法研究
  • Msys2安装编译Redis
  • LearnOpenGL-笔记-其六
  • 数据分析概述
  • tauri配置全局变量
  • neo4j中导入csv格式的三元组数据
  • 访问者模式_行为型_GOF23
  • 人工智能入门(2)
  • 心理咨询法律咨询预约咨询微信小程序系统源码独立部署
  • Python函数中的*args与**kwargs详解:灵活处理可变参数
  • LabVIEW 燃气轮机气路故障诊断
  • 算法中常见的求和问题,数学公式
  • 通俗版解释:SecureLink 和 Xshell 的区别与联系
  • 管理系统-接口信息
  • 烽火MR622-KK融合机_海思MV300芯片_1+8G_强刷卡刷固件包
  • 计算机网络 用deepseek帮助整理的复习资料(一)
  • 工程项目管理软件赋能制造工程高效变革
  • VRRP虚拟路由器冗余协议