Linux信号处理深度解析:从基础到高级应用
Linux信号处理深度解析:从基础到高级应用
1. 信号发送机制
1.1 kill系统调用
功能:向指定进程或进程组发送信号
函数声明:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
参数说明:
• pid
:目标进程/进程组标识符
• >0
:发送给特定进程
• =0
:发送给调用进程所属进程组
• =-1
:广播发送给所有有权进程
• <-1
:发送给进程组ID为|pid|
的组
• sig
:信号编号(如SIGTERM=15)
返回值:
• 成功返回0,失败返回-1并设置errno(EPERM/ESRCH/EINVAL)
1.2 killpg系统调用
功能:向指定进程组发送信号
函数声明:
#include <signal.h>
int killpg(pid_t pgrp, int sig);
参数说明:
• pgrp
:目标进程组ID(0表示当前进程组)
• sig
:同kill系统调用
返回值:
• 同kill系统调用
1.3 raise函数
功能:向当前进程发送信号
函数声明:
#include <signal.h>
int raise(int sig);
参数说明:
• sig
:待发送信号编号
返回值:
• 成功返回0,失败返回非0值
2. 信号处理机制
2.1 signal函数
功能:注册标准信号处理函数
函数声明:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数说明:
• signum
:待捕获信号编号(如SIGINT)
• handler
:处理函数指针,可取值:
• SIG_IGN
:忽略信号
• SIG_DFL
:默认处理
• 自定义函数指针
返回值:
• 成功返回原处理函数指针,失败返回SIG_ERR
2.2 sigaction系统调用
功能:支持实时信号处理的增强型注册接口
函数声明:
#include <signal.h>
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
参数说明:
• signum
:同signal
• act
:新处理配置
• sa_handler
:标准处理函数
• sa_sigaction
:实时信号处理函数(需设置SA_SIGINFO标志)
• sa_mask
:执行处理函数期间阻塞的信号集
• sa_flags
:控制标志位,常用值:
◦ `SA_NOCLDSTOP`:子进程停止时不产生SIGCHLD
◦ `SA_RESTART`:自动重启被中断的系统调用
◦ `SA_SIGINFO`:使用sa_sigaction处理函数
• oldact
:保存原处理配置
siginfo_t结构体:
typedef struct {
int si_signo; /* 信号编号 */
int si_code; /* 信号来源 */
pid_t si_pid; /* 发送进程PID */
uid_t si_uid; /* 发送进程UID */
void *si_addr; /* 引发故障的内存地址 */
int si_status; /* 子进程退出状态 */
union sigval si_value;/* 伴随数据 */
} siginfo_t;
返回值:
• 成功返回0,失败返回-1
3. 信号屏蔽控制
3.1 sigprocmask系统调用
功能:修改进程信号屏蔽字
函数声明:
#include <signal.h>
int sigprocmask(int how,
const sigset_t *set,
sigset_t *oldset);
参数说明:
• how
:操作类型
• SIG_BLOCK
:添加set到屏蔽集
• SIG_UNBLOCK
:从屏蔽集移除set
• SIG_SETMASK
:直接设置屏蔽集为set
• set
:待操作信号集
• oldset
:保存原屏蔽集
返回值:
• 成功返回0,失败返回-1
4. 信号等待策略
4.1 sigsuspend系统调用
功能:原子操作解除信号屏蔽并等待信号
函数声明:
#include <signal.h>
int sigsuspend(const sigset_t *mask);
参数说明:
• mask
:临时信号屏蔽字
返回值:
• 总是返回-1,errno=EINTR
4.2 sigwaitinfo系统调用
功能:同步等待指定信号并获取详细信息
函数声明:
#include <signal.h>
int sigwaitinfo(const sigset_t *set,
siginfo_t *info);
参数说明:
• set
:等待信号集合
• info
:接收信号详细信息
返回值:
• 成功返回信号编号,失败返回-1
4.3 sigtimedwait系统调用
功能:带超时的信号等待
函数声明:
#include <signal.h>
int sigtimedwait(const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout);
参数说明:
• timeout
:超时时间结构体
struct timespec {
time_t tv_sec; /* 秒 */
long tv_nsec; /* 纳秒 */
};
返回值:
• 成功返回信号编号,超时返回-1且errno=EAGAIN
综合对比表
等待方式 | 阻塞行为 | 返回值处理 | 适用场景 |
---|---|---|---|
sigsuspend | 临时解除 | 中断系统调用 | 简单信号等待 |
sigwaitinfo | 持续阻塞 | 直接返回信号编号 | 实时信号处理 |
sigtimedwait | 超时阻塞 | 支持超时控制 | 需要超时机制的场景 |