我是靠谱客的博主 细心帆布鞋,最近开发中收集的这篇文章主要介绍信号【2】-理解signal和sigaction前言一、signal对信号的处理二、sigaction对信号的处理三. signal和sigaction如何选择总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 前言
- 一、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如何选择
- 总结
前言
这里要解决关于信号安装的两个函数的区别
- signal对信号的处理
- sigaction对信号的处理
- 为什么有了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 %dn", sig);
// (void) signal(SIGINT, SIG_DFL);
//(void) signal(SIGINT, ouch);
while (1)
{
printf("I got signal %dn", sig);
if (sigpending(&pendingSigs) == -1)
return;
for (i = 1; i < NSIG; i++){
if (sigismember(&pendingSigs,i)){
cnt++;
printf("tt%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 2
2(Interrupt)
I got signal 2
2(Interrupt)
I got signal 2
2(Interrupt)
I got signal 2
2(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 %dn", sig);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("signal func %d,sig=%dn", 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 %dn", sig);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("signal func %d,sig=%dn", 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 %dn", sig);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("signal func %d,sig=%dn", 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前言一、signal对信号的处理二、sigaction对信号的处理三. signal和sigaction如何选择总结的全部内容,希望文章能够帮你解决信号【2】-理解signal和sigaction前言一、signal对信号的处理二、sigaction对信号的处理三. signal和sigaction如何选择总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复