重读APUE(13)-可靠信号】的更多相关文章

在信号产生和传递之间有一段时间间隔,称为信号是未决的: 进程可以设置阻塞信号传递:如果进程产生了一个阻塞的信号,并且对该信号的动作是系统默认或者捕捉该信号,则该进程保持此信号为未决状态,直到该进程对此信号接触阻塞,或者将对该信号的动作改为忽略:内核在传递一个原来被阻塞的信号给进程时(而不是产生该信号时),才决定对它的处理方式:这样就意味着进程在信号传递给它之前仍然可以改变对该信号的动作:进程调用sigpending函数来判断哪些信号是设置为阻塞并处于未决状态的: 如果进程在解除对某个信号的阻塞之…
首先说明:现在大部分Unix系系统如Linux都已经实现可靠信号. 1~31信号与SIGRTMIN-SIGRTMAX之间并不是可靠信号与不可靠信号的区别,在大多数系统下他们都是可靠信号. 只不过: 1~31信号                              --不支持排队,为普通信号.(不能用于统计信号发生次数的情景.) SIGRTMIN-SIGRTMAX信号 --支持排队,实时信号 不可靠信号 什么是不可靠信号: 不可靠的意思是信号可能丢失或者被错误处理. 在早起系统中,信号存在两…
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止.   1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了abort函数时,都会产生一个SIGABRT信号. 每一个信号对应一个正整数,定义在头文件<signal.h>中. 没有信号对应整数0,kill函数使用信号编号0表示一种特殊情况,所以信号编号0又叫做空信号(null signal). 下面的各种情况会产生一个信号: 当用户在终端按下特定的键时,会产生…
不可靠信号(在执行自定义函数其间会丢失同类信号) 可靠信号(在执行自定义函数其间不会丢失同类信号) 不可靠信号用一次以后,就恢复其默认处理吗? 至少在ubuntu 12.04上,已经是一次绑定,永远使用,除非显性再次绑定默认行为. 测试方式: 1)不可靠信号(1-31)程序(关键代码:signal( SIGINT, sigintctl) ;)执行后,sleep的2s内按ctrl+c N次,只会看到1次信号处理的输出: 1)可靠信号(34-64)程序执行后(关键代码:signal( SIGRTMI…
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> void catch_signal(int signo, siginfo_t *info…
在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不支持信号队列,就是当多个信号发生在进程中的时候(收到信号的速度超过进程处理的速度的时候),这些没来的及处理的信号就会被丢掉,仅仅留下一个信号. 可靠信号是多个信号发送到进程的时候(收到信号的速度超过进程处理信号的速度的时候),这些没来的及处理的信号就会排入进程的队列.等进程有机会来处理的时候,依次再…
前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便. 那就是调用 sigaction 函数. sigaction() 函数 原型:int sigaction (int signo, const struct sigaction * restrict act, struct sigaction *restrict oact) 作用:将信号及其处理函数关联起来,但这个注册函数中,信号处…
前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便.那就是调用 sigaction 函数. sigaction 函数 原型:int sigaction (int signo, const struct sigaction * restrict act, struct sigaction *restrict oact) 作用:将信号及其处理函数关联起来,但这个注册函数中,信号处理函数…
一个事件可以事一个信号发送给一个进程,这个事件可以是硬件异常,可以是软件条件触发,可以是终端产生信号,也可以是一个kill函数调用.当信号产生后,内核通常会在进程表中设置某种形式的标志(flag).我们可以认为当进程中的信号处理函数被触发的时候认为信号下达到了(delivered)这个进程.从信号产生到信号下达到进程这段期间,信号被认为是挂起状态(pending).进程拥有阻塞信号下达的选项.如果一个阻塞信号要发送给一个进程,而且信号的处理方式是默认处理或者被进程捕获,那么这个信号将一直处于挂起…
重入时间点 进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就会被信号处理程序临时中断,它首先执行该信号粗合理程序中的指令:如果从信号处理程序返回,则继续执行捕捉到信号时进程正在执行的正常指令序列: ps:如果了解驱动,上面这段信号打断流程与中断打断进程上下文很类似: 不可重入函数 对于有些函数,是不可重入的,如果信号处理程序打断了这些函数的执行,同时信号粗合理程序中也调用这个函数,就会发生错误:这些不可重入的函数,有如下特点: 1. 使用了静态的数据结构: 2. 调用了malloc或…