Linux高性能服务器笔记--6

本文详细介绍了Linux系统中的信号处理,包括信号种类如SIGHUP、SIGPIPE、SIGURG等,信号处理方法,信号函数如signal和sigaction,以及如何处理网络编程中的相关信号,如SIGPIPE和SIGURG,强调了统一事件源的重要性以及如何避免SIGPIPE导致进程结束。
摘要由CSDN通过智能技术生成

1.信号

#include <sys/types.h>
#include <signal.h>
​
//把信号sig发送给目标进程
// sig:信号;pid:目标进程
int kill(pid_t pid, int sig);
// 该函数成功时返回0,失败时返回-1并设置errno

2.信号处理方法

#include <signal.h>
​
// 目标进程在收到信号时,需要定义一个接收函数来处理,其原型为:
typedef void (*__sighandler_t)(int);

信号处理函数只能带一个整型参数,该参数用来指示信号类型。信号处理函数应该是可冲入的,否则容易引发竞态条件。

#include <bits/signum.h>
​
// 其他两种处理方式
// SIG_IGN忽略目标信号;SIG_DFL使用信号的默认处理方式
#define SIG_DFL ((__sighandler_t) 0)
#define SIG_IGN ((__sighandler_t) 1)

SIG_IGN忽略目标信号;SIG_DFL使用信号的默认处理方式

SIG_IGN表示忽略目标信号,SIG_DFL表示使用信号的默认处理方式。信号的默认处理方式有如下几种:结束进程(Term)、忽略信号(Ign)、结束进程并生成核心转储文件(Core)、暂停进程( Stop),以及继续进程(Cont)。

3.Linux信号

SIGHUP 控制终端挂起

SIGPIPE 往读端被关闭的管道或者socket连续中写数据

SIGURG socket连接上接收到紧急数据

SIGALRM 由alarm或setitimer设置的实时闹钟超时引起

SIGCHLD 子进程状态发送变化(退出或者暂停)

4.中断系统调用

如果程序在执行处于阻塞状态的系统调用时接收到信号,并且我们为该信号设置了信号处理函数,则默认情况下系统调用将被中断,并且errno被设置为EINTR。我们可以使用sigaction函数(见后文)为信号设置SA_RESTART标志以自动重启被该信号中断的系统调用。 ​ 对于默认行为是暂停进程的信号(比如SIGSTOP、SIGTTIN),如果我们没有为它们设置信号处理函数,则它们也可以中断某些系统调用(比如connect、epoll_wait)。POSIX没有规定这种行为,这是Linux独有的。

4 信号函数

4.1signal系统调用

#include <signal.h>
​
// sig:指出要捕获的信号类型,_handler用于指定信号sig的处理函数
_sighandler_t signal(int sig, _sighandler_t _handler);
// 成功时返回类型为_sighandler_t的函数指针,错误返回SIG_ERR并设置errno

4.2sigaction系统调用

#include <signal.h>
​
// 更健壮的信号处理函数接口
// sig:要捕获的信号类型;act:制定新的信号处理方式;oact:输出信号前的处理方式
int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);
​
// sigaction结构体定义:
struct sigaction{
#ifdef __USE_POSIX199309
    union{
        _sighandler_t sa_handler;
        void(*sa_sigaction)(int, siginfo_t*, void*);
    }
    _sigaction_handler;
# define sa_handler     __sigaction_handler.sa_handler
# define sa_sigaction   __sigatcion_handler.sa_sigaction
#else
    _sighandler_t sa_handler; //信号处理函数
#endif
​
    _sigset_t sa_mask;//信号掩码
    int sa_flags;//收到信号的行为
    //void(*sa_restorer)(void); 过时了
};

5.信号集

5.1. 信号集函数</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值