网络编程之 信号捕捉器(函数指针与回调函数)(2)

简介: sigaction()函数前面我们讲到的内容已经足以用来防止僵尸进程生成的代码。之所以博主还要介绍sigaction()函数是因为它类似于signal()函数,而且完全可以代替后者,也更稳定(主要是书上介绍到了

网络编程之 信号捕捉器(函数指针与回调函数)(2):https://developer.aliyun.com/article/1414738

sigaction()函数

前面我们讲到的内容已经足以用来防止僵尸进程生成的代码。之所以博主还要介绍sigaction()函数是因为它类似于signal()函数,而且完全可以代替后者,也更稳定(主要是书上介绍到了),之所有更稳定,是因为如下原因:


"signal()函数在UNIX系列的不同操作系统中可能存在区别,但sigaction()函数完全相同!"


实际上现在很少使用 signal()函数编写程序,它只是为了保持对旧程序的兼容(别崩溃啊)。下面介绍 sigaction()函数,单只脚接它的功能,展开来说太复杂了。

信号处理动作(通常在Linux用其来注册一个信号的捕捉函数)
    int sigaction(int signo, const struct sigaction *act, struct sigaction *oldact);  成功:0;失败:-1,设置errno
第一个参数 int signo:
        --->与signo相同,传递信号信息(我之前的博客写的很全)
第二个参数 const struct sigaction *act:
        --->传入参数,新的处理方式。
第三个参数 struct sigaction *oldact:
        --->传出参数,旧的处理方式。
返回值:
      成功: 0
      失败: -1,设置 errno

相信大家也看到了,上面有结构体


struct sigaction结构体(增加了书上没有的)

struct sigaction结构体
    struct sigaction {
        void     (*sa_handler)(int);
        void     (*sa_sigaction)(int, siginfo_t *, void *);
        sigset_t   sa_mask; 
        int       sa_flags; 
        void     (*sa_restorer)(void);
    };
  sa_restorer:该元素是过时的,不应该使用,POSIX.1标准将不指定该元素。(弃用)
  sa_sigaction:当sa_flags被指定为SA_SIGINFO标志时,使用该信号处理程序。(很少使用)  
重点掌握:(也就是我们书上的)
   sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作
   sa_mask: 调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。(也可以设置为0)
   sa_flags:通常设置为0,表使用默认属性。 


书上所说:

2019110120032329.png

书上之所以让把 sa_mask也设置0里面有牵扯到了,


信号屏蔽字 与 未决信号集(博主也不展开说了,比较繁琐)


解决这个函数的难点吧。其实大家应该知道没有难点了。


第一个参数就是和signal的第一个参数一样

2019110120062110.png


第二个参数的结构体我们只需要管三个参数就行而且:第二三个参数

sigset_t sa_mask;

int sa_flags;

都可直接设置0


所以结构体我们只用管第一个参数:

void (*sa_handler)(int);

这不就是我们的signal 得第二个参数吗?

第三个参数:直接传入之前的处理方式即可,如果不关心可以直接传NULL(传入之前的方式是为了恢复以前的处理方式)。


信号捕捉器讲完了========处理子进程回收的终极方法也将完了。下面看看书上的代码就可以结束我们这篇博客了

20191101201503401.png20191101201452665.png

是不是好烦啊!!!sigempty()函数书上也没讲!!!

博主再来拓展一下(不要怪书上,谢了介绍的话又要增加大家的负担了,因为涉及信号集!)


信号集设定
  sigset_t  set;    // typedef unsigned long sigset_t; 
  int sigemptyset(sigset_t *set);     将某个信号集清0        成功:0;失败:-1
    int sigfillset(sigset_t *set);        将某个信号集置1          成功:0;失败:-1
    int sigaddset(sigset_t *set, int signum);   将某个信号加入信号集      成功:0;失败:-1
    int sigdelset(sigset_t *set, int signum);   将某个信号清出信号集      成功:0;失败:-1
    int sigismember(const sigset_t *set, int signum);判断某个信号是否在信号集中  返回值:在集合:1;不在:0;出错:-1  
    sigset_t类型的本质是位图(由 1  0 组成)。但不应该直接使用位操作,而应该使用上述函数,保证跨系统操作有效。

好啦博客结束了,细细看完这篇博客在看书上的内容应该不成问题了。

谢谢观看


目录
相关文章
|
4月前
|
C++
指针中的回调函数与qsort的深度理解与模拟
本文详细介绍了回调函数的概念及其在计算器简化中的应用,以及C++标准库函数qsort的原理和使用示例,包括冒泡排序的模拟实现。
32 1
|
9月前
指针(5)---回调函数
指针(5)---回调函数
37 0
|
9月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
72 0
|
4月前
魔法指针 之 函数指针 回调函数
魔法指针 之 函数指针 回调函数
27 0
|
7月前
|
机器学习/深度学习 边缘计算 量子技术
ICML 2024:信号表征指数级强、内存节省超35%,量子隐式表征网络来了
【7月更文挑战第6天】QIREN,量子隐式表征网络,借助量子计算增强信号处理能力,内存效率提升35%以上。该技术旨在改进高频信号建模,提升图像和音频处理任务的性能,同时在资源受限环境下减少内存需求。尽管面临量子技术成熟度和训练复杂性的挑战,QIREN为机器学习开辟了新途径。[论文链接: https://arxiv.org/abs/2406.03873]**
91 3
|
8月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
9月前
|
算法 搜索推荐 C语言
c函数指针与回调函数
c函数指针与回调函数
65 2
|
8月前
|
机器学习/深度学习 网络协议 C语言
程序技术好文:网络编程中的SIGPIPE信号
程序技术好文:网络编程中的SIGPIPE信号
158 0
|
8月前
|
机器学习/深度学习 算法 语音技术
基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
**语音识别算法概览** MATLAB2022a中实现,结合MFCC与GRNN技术进行说话人身份检测。MFCC利用人耳感知特性提取语音频谱特征,GRNN作为非线性映射工具,擅长序列学习,确保高效识别。预加重、分帧、加窗、FFT、滤波器组、IDCT构成MFCC步骤,GRNN以其快速学习与鲁棒性处理不稳定数据。适用于多种领域。
|
9月前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
60 2

热门文章

最新文章