文章目录

  • 前言
  • 一、signal对信号的处理
    • 1.1 **如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样**?
    • 1.2 如果进程正在执行信号处理函数,这时又接收到一个不同的信号会怎样?
    • 1.3 针对可靠信号和不可靠信号signal又有如何表现?
  • 二、sigaction对信号的处理
    • 2.1 如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样?
    • 2.2 如果进程正在执行信号处理函数,这时又接收到一个加入到信号掩码集中的信号不同的信号会怎样?
    • 2.3 1.3 针对可靠信号和不可靠信号sigaction又有如何表现?
    • 2.4 一个细节
    • 2.5 sigaction总结
  • 三. signal和sigaction如何选择
  • 总结

前言

这里要解决关于信号安装的两个函数的区别

  1. signal对信号的处理
  2. sigaction对信号的处理
  3. 为什么有了signal还要sigaction

一、signal对信号的处理

signal对信号的处理使用虽然简单,但是有些细节还是要注意一下。

/*实验代码*/
#define _GUN_SORCE
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>sigset_t pendingSigs;void ouch(int sig)
{int i,cnt;cnt = 0;// printf("I got signal %d\n", sig);// (void) signal(SIGINT, SIG_DFL);//(void) signal(SIGINT, ouch);while (1){printf("I got signal %d\n", sig);if (sigpending(&pendingSigs) == -1)return;for (i = 1; i < NSIG; i++){if (sigismember(&pendingSigs,i)){cnt++;printf("\t\t%d(%s)\n",i,strsignal(i));}}sleep(1);}
}int main()
{(void) signal(SIGINT, ouch);(void) signal(SIGQUIT, ouch);while(1){printf("hello world...\n");sleep(1);}
}

1.1 如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样

实验结果可见进程正在处理Ctr+C的时候,阻塞了当前正在处理的信号。

>>> a.out
hello world...
hello world...
^CI got signal 2
I got signal 2
I got signal 2
I got signal 2
I got signal 2
I got signal 2
I got signal 2
^C^CI got signal 22(Interrupt)
I got signal 22(Interrupt)
I got signal 22(Interrupt)
I got signal 22(Interrupt)

1.2 如果进程正在执行信号处理函数,这时又接收到一个不同的信号会怎样?

当进程正在执行信号处理SIGINT时,接收到SIGQUIT,处理过程被中断,直到执行完毕SIGQUIT,再接着处理SIGINT。

1.3 针对可靠信号和不可靠信号signal又有如何表现?

实验结果表明,不可靠信号无论发送多少次,最后只被传递一次。
实验结果表明,可靠信号无论发送多少次,最后全部入队进程传递

#define _GUN_SORCE
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>void ouch(int sig)
{printf("oh, got a signal %d\n", sig);int i = 0;for (i = 0; i < 5; i++){printf("signal func %d,sig=%d\n", i,sig);sleep(1);}
}
int main()
{(void) signal(SIGINT, ouch);(void) signal(SIGQUIT, ouch);(void) signal(SIGRTMIN, ouch);while(1){printf("hello world...\n");sleep(1);}
}
/*SIGINT*/
>>> a.out
hello world...
^Coh, got a signal 2
signal func 0,sig=2
signal func 1,sig=2
^C^C^C^Csignal func 2,sig=2
^C^C^C^C^Csignal func 3,sig=2
signal func 4,sig=2
oh, got a signal 2
signal func 0,sig=2
signal func 1,sig=2
signal func 2,sig=2
signal func 3,sig=2
signal func 4,sig=2
hello world...
hello world...
hello world...
>>> kill -34 20509
[-vm01 ~]@~
>>> kill -34 20509
[-vm01 ~]@~
>>> kill -34 20509
>
>>> a.out
hello world...
hello world...
oh, got a signal 34
signal func 0,sig=34
signal func 1,sig=34
signal func 2,sig=34
signal func 3,sig=34
signal func 4,sig=34
oh, got a signal 34
signal func 0,sig=34
signal func 1,sig=34
signal func 2,sig=34
signal func 3,sig=34
signal func 4,sig=34
oh, got a signal 34
signal func 0,sig=34
signal func 1,sig=34
signal func 2,sig=34
signal func 3,sig=34
signal func 4,sig=34
hello world...

二、sigaction对信号的处理

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#void ouch(int sig)
{printf("oh, got a signal %d\n", sig);int i = 0;for (i = 0; i < 5; i++){printf("signal func %d,sig=%d\n", i,sig);sleep(1);}
}int main()
{struct sigaction act;act.sa_handler = ouch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT);// act.sa_flags = SA_RESETHAND;// act.sa_flags = SA_NODEFER;act.sa_flags = 0;sigaction(SIGINT, &act, 0);struct sigaction act_2;act_2.sa_handler = ouch;sigemptyset(&act_2.sa_mask);sigaddset(&act_2.sa_mask, SIGINT);act.sa_flags = 0;sigaction(SIGQUIT, &act_2, 0);while(1){sleep(1);}return 0;
}

2.1 如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样?

实验结果表明:sigaction将正在执行信号,阻塞了。

2.2 如果进程正在执行信号处理函数,这时又接收到一个加入到信号掩码集中的信号不同的信号会怎样?

实验表明:正在执行的信号不能被其他信号中断,而是将其阻塞并顺序执行。

>>> a.out
^Coh, got a signal 2
signal func 0,sig=2
signal func 1,sig=2
^\signal func 2,sig=2
signal func 3,sig=2
signal func 4,sig=2
oh, got a signal 3
signal func 0,sig=3
signal func 1,sig=3
signal func 2,sig=3
signal func 3,sig=3
signal func 4,sig=3

2.3 1.3 针对可靠信号和不可靠信号sigaction又有如何表现?

同1.3的实验结果。

2.4 一个细节

#include <signal.h>
#include <stdio.h>
#include <unistd.h>void ouch(int sig)
{printf("oh, got a signal %d\n", sig);int i = 0;for (i = 0; i < 5; i++){printf("signal func %d,sig=%d\n", i,sig);sleep(1);}
}int main()
{struct sigaction act;act.sa_handler = ouch;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT);// act.sa_flags = SA_RESETHAND;// act.sa_flags = SA_NODEFER;act.sa_flags = 0;sigaction(SIGINT, &act, 0);struct sigaction act_2;act_2.sa_handler = ouch;sigemptyset(&act_2.sa_mask);// sigaddset(&act_2.sa_mask, SIGINT);/*将这行屏蔽,sigaction和signal的行为变的一样了,但是有可能引起进程停止运行,所以这一步时碧血的*/act.sa_flags = 0;sigaction(SIGQUIT, &act_2, 0);while(1){sleep(1);}return 0;}

2.5 sigaction总结

  • 添加信号掩码的时机
    当执行由sa_handler指定的信号处理器之前,会将sa_mask指定的该组信号未处于信号掩码集之列的任何信号加入到进程的信号掩码集中,这些信号会保留在进程信号掩码集中,直至信号处理器退出,届时会自动删除这些信号。
  • 对多个加入到信号掩码集中的信号如何处理
    利用sa_mask指定的一组信号,不允许他们中断信号处理器的执行。
    引发执行信号处理器的信号,会自动加入到信号掩码集中,如果同一的信号实例第二次到达,信号处理器不会自己中断自己。
    对可靠信号排队处理,对不可靠信号只会传第一次

三. signal和sigaction如何选择

如果希望用同一方式处理同一信号的多次出现,考虑使用sigaction,如果只出现一次,则使用signal。因为signal会被不可靠信号中断

  • 为什么很多人建议不再使用signal?

    • 右上可知signal不能设置在信号处理器执行时希望被阻塞的信号
    • signal只能设置对当下信号的处理方式,而sigaction还知道以前的信号处理方式
int sigaction ( int sig , const struct sigaction * restrict act ,\struct sigaction * restrict oact ) ;
Member Tyep Member Name Member Name
void (*)(int) sa_handler 指向一个信号处理函数,或者使用SIG_IGN,SIG_DFL
sigset_t sa_mask 在执行信号处理函数时,屏蔽sa_mask中的信号的产生
int sa_flags 特殊的标志位,影响信号的处理行为
void () ( int , siginfo_t * ,void) sa_sigaction 指向一个信号处理函数(当设置了SA_SIGINFO标志位时)

总结

信号【2】-理解signal和sigaction相关推荐

  1. 信号捕捉(signal、sigaction)

    信号的基本属性:软中断,由内核发送,内核处理.某个进程通过内核向另一个进程发送信号时(引起信号产生的五个因素),另一个进程将会陷入内核进行中断处理,未决信号集中相应信号置1,当递达后,置0.如果阻塞信 ...

  2. signal() 和 sigaction()

    [摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...

  3. Linux信号详解:signal与sigaction函数【2】

    我们已经讨论了Linux操作系统中"信号"."中断"."僵尸进程"'等重要概念.结合C语言中的setjmp.longjump.sigsetj ...

  4. Linux signal、sigaction的使用总结

    目录 一.什么是信号 二.信号的种类 三.信号的处理 -- signal()函数 四.信号处理 -- sigaction()函数(扑获信号) 五.扑获信号示例 一.什么是信号 信号是UNIX和Linu ...

  5. C++ signal和sigaction信号处理

    本文介绍两个信号处理机制signal和sigaction. 一 signal void (*signal(int signo, void (*func)(int)))(int); // 该函数在不同的 ...

  6. 平稳与非平稳随机信号的理解

    最近在做stft的相关算法,发现stft的前提条件是在窗函数内信号必须被认为是平稳随机信号,随机信号的平稳和非平稳有什么区别么?总结如下: 1.首先理解随机信号概念,随机信号理论上讲是不能利用公式复现 ...

  7. linux. signal信号,Linux下signal信号汇总

    SIGHUP /* Hangup (POSIX). */ 终止进程 终端线路挂断 SIGINT /* Interrupt (ANSI). */ 终止进程 中断进程 Ctrl+C SIGQUIT /* ...

  8. 对图像高频信号和低频信号的理解

    今天开始讲图像了,讲了很多在频域处理的方法,回来复习一下图像的频域. 一 .关于图像高频和低频 1.1 对图像高频信号和低频信号的理解 图像中的低频信号和高频信号也叫做低频分量和高频分量. 简单一点说 ...

  9. linux 信号signal和sigaction理解

    转载:http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下 ...

最新文章

  1. 创立一家互联网公司,需要几步?
  2. excel图片地址直接显示图_图片转表格基于百度AI
  3. PHP上传文件大小限制的问题(转)
  4. oracle按天创建分区,oracle 10g按天分区
  5. (转)tomcat配置访问项目时不需要加项目名称
  6. MSCRM plicklist 级联JS
  7. HDU-1159-Common Subsequence
  8. 【zhasite】托业英语阅读技巧有哪些
  9. 标准纸张尺寸 国际标准(ISO 216)
  10. info.plist 隐私权限 国际化
  11. Android一键锁屏功能的实现,推荐一款非常好用的Android一键锁屏软件
  12. Windows下搭配AirSim环境
  13. hour:24小时制和12小时制
  14. uva 10808 - Rational Resistors
  15. Golang Append()详解
  16. Windows10+Ubuntu子系统使用ImageMagick报错convert-im6.q16: not authorized解决方法
  17. Linux内核超级装备eBPF技术详细研究
  18. MT4-EA自动化交易研究笔记(2022-04-23)
  19. Android编译问题:java.util.zip.ZipException:duplicate entry...
  20. colormap是MATLAB里面用来设定和获取当前色图的函数。

热门文章

  1. 软件开发的KISS原则
  2. win10部分软件窗口显示不完整解决办法
  3. 谷歌地球下载 Outline密钥生成 问题备忘录
  4. 大学计算机操作题模拟,《大学计算机基础》上模拟试卷操作题
  5. 使用mindspore的ResNet101使用GPU进行训练时报错
  6. 玻璃盘CCD影像筛选机程序,应用5套CCD视觉系统
  7. js装修计算器java代码_用js编写的简单的计算器代码程序
  8. EA的使用(用例图)
  9. 用 50 行代码写个听小说的爬虫
  10. 二维拉普拉斯方程的基本解