系统编程基础

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超时阻塞支持超时控制需要超时机制的场景

回复

This is just a placeholder img.