信号

信号种类

信号是一种软件层面上对中断的模拟,而这种软件模拟的信号或者说中断的产生,有三大类:

1. 外部信号。

用户在终端 按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C 产生 SIGINT 信 号, Ctrl-\ 产生 SIGQUIT 信号, Ctrl-Z 产生 SIGTSTP 信号。

2. 硬件异常产生的信号。

这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。

例如当前进程执行了 除以0 的指令, CPU 的运算单元会产生异常,内核将这个异常解释为 SIGFPE 信号发送给进 程。
再比如当前进程访问了非法内存地址,, MMU 会产生异常,内核将这个异常解释为 SIGSEGV 信 号发送给进程。

3. 显示的请求。

alarm(times);

定义一个闹钟,约定times秒后,内核向该进程发送一个SIGALRM信号;
kill 发信号

信号处理

异常的处理在CPU的中断表中有固定的位置

  1. 如果用户没有挂除0处理函数,执行路径:
kernel/signal.c do_notify_resume() --> do_signal() --> get_signal_to_deliver()

在get_signal_to_deliver()中, 用户空间任务直接被do_group_exit() 杀掉.

  1. 如果用户挂了除0的处理函数,执行路径:
kernel/signal.c do_notify_resume() --> do_signal() --> handle_signal()

handle_signal()比较复杂, 要构建用户栈, 修改eip等寄存器, 这样从内核返回后(entry.s中的restore_all)

  1. 执行特殊的系统调用sigreturn从用户态回到内核态

信号与中断

信号与中断的相似点:

(1 )采用了相同的异步通信方式;

(2 )当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

(3 )都在处理完毕后返回到原来的断点;

(4 )对信号或中断都可进行屏蔽。

信号与中断的区别:

(1 )中断有优先级,而信号没有优先级,所有的信号都是平等的;

(2 )信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

(3 )中断响应是及时的,而信号响应通常都有较大的时间延迟。

信号的原理

clipboard.png
clipboard1.png

在Linux里面每个进程都是按照进程描述符 task_struct 结构创建的,还有一个叫task vector的东西,从名字上就能看出来这是一个数组,这里面保存的是指向每一个进程的指针,即指向每一个task_struct的指针,因此一个Linux系统最大的进程数,取决于task vector这个数组的大小,一般默认是512个。

在每一个进程描述符task_struct里面,其中一项是Signal_Struct,在Signal_Struct这里面有一项list_head的描述符,在这里面有一个sigset_t表,定义了64种信号的所代表的含义。
铺垫了很多,其实主要是为了铺垫64种信号存放的位置。也就是说在每个进程之中,都有存着一个表,里面存着每种信号所代表的含义,而这也是信号机制的根本。

由于信号的触发和发送是随机的,也就是异步的。接收进程是无法预知什么时间,会收到哪个信号的。下面就开始讲下信号的详细发送机制,

举例说明,如果有A,B两个进程,A进程接收到触发条件,开始发送信号给B进程,信号并不是直接从进程A发送给进程B,而是要通过内核来进行转发。之所以要通过内核来转发,这样做的目的应该也是为了对进程的管理和安全因素考虑。因为在这些信号当中,SIGSTOP和SIGKILL这两个信号是可以将接收此信号的进程停掉的,而这类信号,肯定是需要有权限才可以发出的,不能够随便哪个程序都可以随便停掉别的进程。

(
q1)信号是直接从进程到进程的吗?
q2)是否有发信号的权限管理

A进程发送的信号消息,其实就是根据上面的那个信号表,根据需要对相应的表项进行设置。内核接受到这个信号消息后,会先检查A进程是否有权限对B进程的信号表对应的项进行设置,如果可以,就会对B进程的信号表进行设置,这里面信号处理有个特点,就是没有排队的机制,也就是说某个信号被设置之后,如果B进程还没有来及进行响应,那么如果后续第二个同样的信号消息过来,就会被阻塞掉,也就是丢弃。

(
q3)有排队机制吗?
)

内核对B进程信号设置完成后,就会发送中断请求给B进程,这样B进程就进入到内核态,这个时候进程B根据那个信号表,查找对应的此信号的处理函数,然后设置frame,设置好之后,跳回到用户态执行信号处理函数,处理完成后,再次返回到内核态,再次设置frame,然后再次返回用户态,从中断位置开始继续执行。

这个frame其实就是在用户态和内核态之间跳转的时候,对堆栈现场的压栈保存。
大致的原理就是这么一个过程,在真正使用的时候,就比较简单了,用kill函数发送信号,在接收进程里,通过signal或者signalaction函数调用sighandler,来启动对应的函数处理信号消息

信号的使用

用kill函数发送信号。
与kill函数不同的是raise()函数允许进程向自身发送信号

在接收进程里,通过signal或者signalaction函数调用sighandler,来启动对应的函数处理信号消息

三种处理:

忽略信号,

对信号不做任何处理,但是又两个信号是不能忽略的,即SIGKILL,SIGSTOP

捕捉信号,

定义信号处理函数,当信号发送时,执行相应的自定义处理函数

执行缺省操作,linux对每种信号都规定了默认操作
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 信号的基本概念 信号被认为是一种软件中断(区别于硬件中断),信号机制提供了一种在单进程/线程下处理异步事件的方法。...
    小叶大孟阅读 1,914评论 0 1
  • 一、信号及信号来源 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一...
    丶Em1tu0F阅读 1,438评论 0 1
  • 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件...
    故事狗阅读 84,925评论 2 62
  • 如果人注定要长大, 请让我记住这金色的年华, 青春是心中永不凋零的花。 将欢乐的种子在心中种下, 友谊的松柏经的起...
    半月仙河北廊坊阅读 147评论 0 5
  • 有一位志同道合的友人,总是在讨论工作之后可以聊几句诸如人生状态,当下感悟之类的宜人的话题。 “经你之手的花花草草总...
    冷眼鲁娜阅读 253评论 0 1