sigaction

c sigaction信号处理

强颜欢笑 提交于 2020-01-01 00:27:53
头文件:#include <signal.h> 原型: int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 参数: signum是除了SIGKILL和SIGSTOP之外的任何信号; act非空,新的动作(信号到来时执行的函数)存在act中,如果旧的动作非空,旧动作存在oldact中; 返回值: sigaction() returns 0 on success and -1 on error. 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已经废弃不用了; sa_handler就是执行的动作,指向函数的指针,函数接收signum作为其参数,也可以是SIG_DFL默认动作或者SIG_IGN忽略该信号; 。。。 signum可以有哪些,分别什么意思? 在signum.h中, /* Signals. */ #define SIGHUP 1 /* Hangup

信号中断与异步信号中断安全编程

故事扮演 提交于 2020-01-01 00:21:50
1、什么是中断? 1.1、什么是中断 外围设备的速度远低于CPU的速度,所以为提高CPU计算效率,现代计算机变内核主动为硬件主动,只在硬件需要的时候才发送信号,通知内核来处理数据。这样外围设备与内核的协作方式即为中断机制。而设备发送的信号即为中断,其本质为一种特殊的电信号。 硬中断处理流程: 1、各外围设备与中断管理器各输入引脚相连; 2、中断管理器与CPU之间只存在一条中断管线; 3、设备发送一个中断到中断管理器; 4、中断管理器发送对应电信号给CPU。 5、CPU中断当前工作,开始处理中断,并通知操作系统。 6、操作系统调用中断处理程序。 中断的特点: 1、不同的设备对应不同的中断,并被用数字标识; 2、对应的设备需要对应的中断处理程序; 3、中断值即中断请求线(IRQ),被关联到不同的数值量,如IRQ 0,中断亦可动态分配。 4、设备中断信号可能在任意时刻到来,不与CPU时钟同步,即异步硬件中断。 糕富帅CPU来到女儿国,女儿国的妹子们(中断集合)精心打扮,总在认为打扮完美的时刻向糕富帅抛媚眼露大腿扮性感,引起糕富帅的注意。糕富帅玩弄妹子的手段高超,经验丰富,与最靓的妹纸牵手,喜欢为不同的妹子编号并制定不同的攻略策略,总是上半场激烈,下半场缠绵,中场偷腥不断,并在腻味之后回归原始的浪荡生活。妹纸们总是很傻很天真,屡败屡战,不停地打扮自己,完美自己,期待着与糕富帅的重新开始。

进程间的通信—信号

限于喜欢 提交于 2020-01-01 00:21:37
一、信号及信号源 1、信号本质   信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。   信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。 2、信号来源   信号事件的发生有两个来源: 硬件来源(比如我们按下了键盘或者其它硬件故障); 软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。 二、进程对信号的响应   进程可以通过三种方式来响应一个信号: 忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP; 捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数; 执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。   Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。 三、信号的安装   如果进程要处理某一信号,那么就要在进程中安装该信号

信号

断了今生、忘了曾经 提交于 2019-12-30 13:54:57
文章目录 一、信号及其处理过程 1、概述 1.1、发送信号 1.2、待处理信号集合 1.3、接收信号与阻塞信号 1.4 信号处理函数的终止 2、发送信号 2.1、kill函数 2.1.1、其中pid的值: 2.1.2、信号发送的权限: 2.1.3、错误返回的errno标志 2.1.4、Linux权限管理(拓展) 2.2、发送信号的其他方式 2.2.1、raise函数(向自身发送信号) 2.2.2、killpg函数 3、信号集、待处理信号、阻塞信号 3.1、信号集处理: 3.2、处于等待状态的信号 3.3、阻塞信号传递(信号掩码) 3.3.1、概述 3.3.2、sigprocmask函数 4、改变信号处理 4.1、信号的默认行为 4.2、signal()函数 4.2.1、可移植性说明 4.3、sigaction()函数 4.3.1、与signal函数的比较 4.3.2、sa_flag信号说明 4.3.2.1、signal函数实现——使用sa_flag的实例 4.3.2.2、abort函数实现——使用sa_flag的实例 4.3.2.2.1、abort函数的功能 4.3.2.2.2、abort函数的实现 4.3.2.3、sigaltstack函数——实现SA_ONSTACK的基础 5、常用信号及其说明 5.1 SIGKILL(终止进程)和SIGSTOP(停止进程) 5.1.1

Linux多线程3-4_向线程发送信号

我的梦境 提交于 2019-12-27 00:45:48
一、发送信号的函数 int pthread_kill(pthread_t thread, int sig); 1、别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sigaction()去抓信号并加上处理函数。 ​ 2、向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。如果要获得正确的行为,就需要在线程内实现sigaction了。所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,否则,就会影响整个进程。如果int sig是0呢,这是一个保留信号,其实并没有发送信号,作用是用来判断线程是不是还活着。 二、信号处理 1、进程信号处理: int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 给信号signum设置一个处理函数,处理函数在sigaction中指定 act.sa_mask 信号屏蔽字 act.sa_handler 信号集处理程序 ​ 2、信号集的处理 ​ int

nginx master工作循环

微笑、不失礼 提交于 2019-12-24 06:49:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 默认情况下,nginx使用的是master-worker工作模式接收命令行指令和处理客户端请求。在nginx启动master进程后,其会进行整个nginx工作环境的初始化,然后会依次启动worker进程、cache manager和cache loader进程,接着会进入一个工作循环中,以等待命令行发送来的指令,从而实现对nginx的管理工作。本文主要讲解nginx是如何进行信号的初始化和处理的。 1. 信号处理方法 在介绍nginx是如何组织信号之前,我们首先需要理解的是对信号进行管理的几个主要的方法: 方法 参数 作用 sigaction(int signo, conststruct *act, struct sigaction * oldact); signo指定了当前需要监听的信号类型;act指定了处理当前信号的方法;oldact将接收原先设置的处理信号的方法; 对于signo指定的信号,为其设置接收到该信号时的处理方法 sigemptyset(sigset_t *set) set中存储了当前进程正在监听的信号集 将指定信号集中的信号清空 sigaddset(sigset_t *set, int signo) set为目标信号集;signo为将要添加的信号 将指定信号添加到目标信号集中

进程信号

天大地大妈咪最大 提交于 2019-12-23 18:33:19
以下是阿鲤对Linux下进程信号的总结,希望对大家有所帮助;若有误请慷慨指出。 在生活中我们处处离不开信号,很多东西都需要有信号来给我们传达信息。当我们听到上栗铃声我们就知道要上课了;当我们看到有人向我们挥手我们就知道他再向你打招呼;以上这些这些都是生活中信号的体现。那么什么是进程间信号呢? 1:信号概念 2:信号的种类 3:信号的产生 4:信号在进程中的注册和注销 5:信号的捕捉处理 6:信号的阻塞 7:函数的可重入与不可重入 8:volatile关键字 9:SIGCHLD信号 注:以下的代码实现均为centos7环境; 一:进程信号概念: 1:什么是进程信号 进程信号是一个软件中断,通知程序发生了某个事件,打断进程当前的操作,去处理这件事。 2:进程信号的特点 1:信号是多种多样的,每一个信号对应一个事件 2:所能识别的信号必须是合理的 二:信号的种类 1:查看信号的种类 :使用kill -l命令 我们可以看到上面有62种信号(32 33 不存在),其中前31种信号是借鉴unix而来的是,每一个均对应一个操作;而后面的信号是面向用户的,并没有对应的事件,所以没有真正的命名。 所以有一个分类,1-31为非可靠信号;34-64是可靠信号。 三:信号的产生 1:软件产生: 1:kill命令:kill+signal number pid 2:int kill(pid_t pid,

20 Alarms, sigaction(), and Reentrant System Calls

荒凉一梦 提交于 2019-12-23 00:27:41
1 Alarm Signals and SIGALRM 1.1 Setting an alarm unsigned int alarm(unsigned int seconds); 过n秒后向进程发送 SIGALARM 信号 SIGALARM 信号默认动作是 terminate # include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <signal.h> # include <sys/signal.h> void alarm_handler ( int signum ) { printf ( "Buzz Buzz Buzz\n" ) ; } int main ( ) { //set up alarm handler signal ( SIGALRM , alarm_handler ) ; //schedule alarm for 1 second alarm ( 1 ) ; //do not proceed until signal is handled pause ( ) ; } 1.2 Recurring Alarms /* buzz_buzz.c*/ void alarm_handler ( int signum ) { printf ( "Buzz Buzz Buzz\n" ) ; /

022 UNIX再学习 -- 信号处理

纵饮孤独 提交于 2019-12-19 02:15:07
一、闹钟和睡眠 1、函数 alarm # include <unistd.h> unsigned int alarm ( unsigned int seconds) ; 返回值:返回 0 或先前所设闹钟的剩余秒数 (1)函数功能 使用 alarm 函数可以设置一个定时器 (闹钟时间) ,在将来的某个时刻该定时器会超时。当定时器超时时,产生 SIGALRM 信号 。如果忽略或不捕捉此信号,则其默认动作是终止调用该 alarm 函数的进程。 (2)参数解析 参数 seconds 的值是产生信号 SIGALRM 需要经过的时钟秒数。 当这个时刻到达时,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一个时间间隔。 (3)函数解析 每个进程只能有一个闹钟时间。 如果在调用 alarm 时,之前已为该进程注册的闹钟时间还没有超时,则该闹钟时间的余值作为本次 alarm 函数调用的值返回。以前注册的闹钟时间则被新值代替。 如果有以前注册的尚未超过的闹钟时间,而且 本次调用的 seconds 值是 0,则取消以前的闹钟时间 ,其余留值仍作为 alarm 函数的返回值。 虽然 SIGALRM 的默认动作是终止进程,但是大多数使用闹钟的进程捕捉此信号。 如果此时进程要终止,则在终止之前它可以执行所需的清理操作。如果我们想捕捉 SIGALRM 信号,则必须在调用 alarm

Do I have to use a signal handler for a Posix timer?

人盡茶涼 提交于 2019-12-12 15:31:58
问题 I want to start a timer and have a function called when it expires. Googling finds lots of examples, including the example in the manual, all of which use sigaction() to set a signal handler. However, @Patryk says in this question that we can just void cbf(union sigval); struct sigevent sev; timer_t timer; sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = cbf; //this function will be called when timer expires sev.sigev_value.sival_ptr = (void*) arg;//this argument will be passed to