发送信号
信号可以发送给一个进程、一个进程组,甚至整个系统。发送信号的途径有多种。
kill 系统调用:kill(pid, sig) 发送信号 sig 给目标进程 pid。pid > 0 发送给指定进程;pid == 0 发送给同进程组所有进程;pid < 0 发送给指定进程组。
killpg 系统调用:killpg(pgrp, sig) 发送信号给指定进程组的所有成员。
进程组(Process Group):每个进程属于一个进程组,进程组有一个组长(PGID = 组长PID)。进程组是作业控制的单位,Shell 将前台作业的所有进程分配在同一进程组中。
用户级发送:
- 键盘:Ctrl+C 发送
SIGINT,Ctrl+Z 发送SIGTSTP,Ctrl+\ 发送SIGQUIT。 - 命令行:
kill -9 <pid>发送SIGKILL强制终止进程。
内核级发送:内核在检测到事件时自动发送信号:
- 子进程终止 → 向父进程发送
SIGCHLD - 定时器到期 → 向当前进程发送
SIGALRM - 硬件故障 → 向当前进程发送
SIGSEGV或SIGFPE
进程间发送:普通用户只能向自己拥有的进程发送信号,只有 root 可以向任何进程发送信号。