• 首页
  • 搜索
  • 工具
  • 分类
  • 日志
  • 友链
  • 图片

It's Geek KingYoungy

KEEP CHALLENGE
系统编程基础

Linux信号处理深度解析:从基础到高级应用

2025-03-31 浏览量 129 暂无评论

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超时阻塞支持超时控制需要超时机制的场景
IO多路复用与高性能IO编程接口详解
实现安卓与类安卓系统的定位信息伪造

评论

  • 文章目录
  • 站点概览
    author

    38 日志
    7 分类
    Creative Commons
    • 热门文章
    • 热评文章
    • 随机文章
    • 在 Debian 服务器上部署 FileBrowser 并集成到现有博客路径
    • 高等数学重要定义整理
    • 高等数学重要定理总结
    • C语言原子量的使用
    • 库、链接与执行
    • 欢迎使用 Typecho
    • 对底层IO的深度总结
    • 数据结构——树
    • 库、链接与执行
    • shell作业控制的两个问题:组长叛变与SIGHUP信号
    • IO多路复用与高性能IO编程接口详解
    • 文件锁技术详解:flock与fcntl系统调用
    • 数据结构——图
    • C++ STL中的栈与队列:核心原理与实战应用指南
    • 算法——查找

    浏览量 : 5428

    © 2025 It's Geek KingYoungy. Power By Typecho . Theme by Shiyi

    浙ICP备2025160639号  |  浙公网安备33020502001222号

    This is just a placeholder img.