linux中向进程发送信号的核心是内核在目标进程task_struct中设置对应编号的位图标志,权限允许且目标存在时即被记录为pending,待进程从内核态返回用户态时处理。

在Linux中,向目标进程发送指定信号,核心是明确“谁发”“发给谁”“发什么”,本质是内核在目标进程的 task_struct 中设置对应信号编号的位图标志。只要权限允许、目标存在,信号就会被记录,等待进程在合适时机(如从内核态返回用户态时)处理。
用kill命令发信号——最常用方式
终端下直接使用 kill 命令,无需编程,适合调试和运维:
-
基本语法:
kill [选项] PID,其中PID是目标进程的进程号 -
指定信号:可用编号(如
-9)或名称(推荐,更可读且可移植),例如:kill -SIGTERM 1234或kill -15 1234—— 请求优雅退出kill -SIGKILL 1234或kill -9 1234—— 强制终止(无法捕获/忽略)kill -SIGSTOP 1234—— 暂停进程执行 -
查PID小技巧:先用
ps aux | grep 进程名或pgrep 进程名获取准确PID,避免误杀
用kill系统调用发信号——程序内控制
C程序中通过 kill() 函数向其他进程(或自身、进程组)发送信号:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
函数原型:
int kill(pid_t pid, int sig); -
pid参数决定作用范围:
pid > 0:发给指定PID的单个进程pid == 0:发给当前进程所在进程组的所有进程(常用于前台任务组)pid == -1:发给当前用户有权限操作的所有进程(需root权限才发全系统)pid :发给进程组ID为 <code>|pid|的所有进程 -
权限注意:普通用户只能向同用户进程发信号;向其他用户进程发信号会失败(
errno = EPERM)
其他常用发送方式
除主流通用方法外,还有几种特定场景下的信号发送手段:
-
raise(int sig):仅向**当前进程自身**发送信号,等价于kill(getpid(), sig) -
abort():向当前进程发送SIGABRT(6号信号),强制产生异常终止,并生成 core dump(若开启) -
键盘快捷键:不是“命令”,但属于常见信号源。
Ctrl+C发SIGINT给前台进程组,Ctrl+Z发SIGTSTP暂停,它们本质也是内核捕获终端事件后主动投递信号
验证信号是否送达
信号发送成功 ≠ 立即执行,它只是被标记为 pending。可借助以下方式确认:
- 观察进程行为:是否退出、暂停、继续,是最直接反馈
- 用
kill -l查看全部信号名与编号,确保没输错(如SIGUSR1是10,不是1) - 程序中可通过
sigpending()检查当前进程 pending 了哪些信号(需配合信号掩码使用) - 对关键进程,可在代码里注册自定义 handler 并打印日志,确认是否被调用










