随笔小屋 Logo
首页
瞬间
反馈
随笔小屋 Logo
首页 瞬间 反馈
  1. 首页
  2. linux
  3. 信号处理

信号处理

  • linux
  • 发布于 2025-10-08
  • 287 次阅读
flor
flor
#include <signal.h>
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
功能:设置调用进程针对特定信号的处理方式
参数: signum  信号编号
handler  信号处理方式
  SIG_IGN          忽略
  SIG_DFL          默认
  函数指针  捕获
返回值:成功返回原信号处理方式,如果之前未处理过则返回NULL,失败返回SIG_ERR

进程正常或异常终止都会向父进程发送SIGCHLD(17)信号

fork创建的子进程,继承父进程捕获和忽略

exec创建的子进程,继承父进程忽略,不继承捕获(新代码替换旧代码,恢复默认)

kill [-信号] PID

不指定发送SIGTERM(15)信号

信号使用编号或名称可以忽略SIG,-1给系统所有进程发送9号信号

超级用户可以发送任何进程,普通用户只能发送自己进程

发送信号

#include <signal.h>
int kill (pid_t pid, int signum);
功能:向指定进程发送信号
参数:pid
  -1  向系统所有进程发送信号
  >0  指定(pid)发送信号
signum:  信号编号,取0检查pid是否存在,不存在kill函数返回-1,且errno为ESRCH
返回值:成功0,失败-1

#include <signal.h>
int raise (int signum);
功能:向调用函数自己发送信号
参数:signum  信号编号
返回值:成功0,失败非0
等价kill(getpid(),signum)

暂停

#include <unistd.h>
int pause(void)
功能:无限睡眠
返回值:成功阻塞进程,失败-1
进程被终止或捕获返回-1且errno为EINTR表示阻塞被系统调用信号打断
信号处理函数返回(返回值)后函数才会返回(返回值)

睡眠

#include <unistd.h>
unsigned int sleep(unsigned int seconds);
功能:有限睡眠
参数:seconds  秒为单位的睡眠时限
返回值:返回0或剩余秒数
如果有信号被调用进程捕获,信号处理函数返回(返回值)后函数才会返回(返回值)

#include <unistd.h>
int usleep (useconds_t usec);
功能:更精准的有限睡眠
参数:usec  以微秒为单位的睡眠时限
返回值:成功返回0,失败-1
如果有信号被调用进程捕获,信号处理函数返回(返回值)后函数才会返回(返回值),返回值和errno为EINTR表示阻塞被系统调用信号打断

闹钟

#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:设置闹钟
参数:seconds 以秒为单位的闹钟时间。
返回值:返回0或先前所设闹钟的剩余秒数。
alarm函数使系统内核在该函数被调用后seconds秒的时候,向调用进程发送SIGALRM(14)信号
非堵塞运行,第一次设置闹钟后立即返回0(时间到后发送14信号),后续调用该函数前已设过闹钟且尚未到期,则该函数会重设闹钟,并返回先前所设闹钟的剩余秒数,否则返回0
若seconds取0,则表示取消先前设过且尚未到期的闹钟

信号集

多个信号组成的信号集合是信号集
系统内核用 sigset_t 类型表示信号集
在 <signal.h> 中又被定义为 typedef __sigset_t sigset_t;
在 <sigset.h> 中有如下类型定义
#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct {
    unsigned long int __val[_SIGSET_NWORDS];
    } __sigset_t;
sigset_t 类型是一个结构体,但该结构体中只有一个成员,是一个包含32个元素的整数数组(针对32位系统而言)(从低到高,一个比特表示一个信号)
#include <signal.h>
int sigfillset (sigset_t* sigset);
功能:填满信号集,将信号集的全部信号位置 1
参数:sigset 信号集
返回值:成功返回 0,失败返回 -1
#include <signal.h>
int sigemptyset (sigset_t* sigset);
功能:清空信号集,将信号集的全部信号位置 0
参数:sigset 信号集
返回值:成功返回 0,失败返回 -1
#include <signal.h>
int sigaddset (sigset_t* sigset, int signum);
功能:加入信号,将信号集中与指定信号编号对应的信号位置 1
参数:sigset 信号集
signum 信号编号
返回值:成功返回 0,失败返回 -1
#include <signal.h>
int sigdelset (sigset_t* sigset, int signum);
功能:删除信号,将信号集中与指定信号编号对应的信号位置 0
参数:sigset 信号集
signum 信号编号
返回值:成功返回 0,失败返回 -1
#include <signal.h>
int sigismember (const sigset_t* sigset, int signum);
功能:判断信号集中是否有某信号,即检查信号集中与指定信号编号对应的信号位是否为 1
参数:sigset 信号集
signum 信号编号
返回值:有则返回 1,没有返回 0,失败返回 -1

信号屏蔽

#include <signal.h>
int sigprocmask(int how, const sigset_t* sigset, sigset_t* oldset);
功能:设置/修改调用进程的信号掩码
参数:how:修改信号掩码的方式
  SIG_BLOCK     将 sigset 中的信号加入当前信号掩码
  SIG_UNBLOCK   从当前信号掩码中删除 sigset 中的信号
  SIG_SETMASK   把 sigset 设为当前信号掩码
set:信号集,取 NULL 则忽略此参数
oldset:输出原信号掩码,取 NULL 则忽略此参数
返回值:成功返回 0,失败返回 -1
#include <signal.h>
int sigpending(sigset_t* sigset);
功能:获取调用进程的未决信号集
参数:sigset:输出未决信号集
返回值:成功返回 0,失败返回 -1

湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号
CPU --% | 内存 0.00G/0.00G (0%) | 网络 无活动网卡
服务器资源占用 更新时间 --:--:--