趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

37 | 信号(上):项目组A完成了,如何及时通知项目组B?

sigaction函数
signal函数
do_sigaction设置信号处理函数
系统调用rt_sigaction
__sigaction调用
库函数调用
参数设置
发送信号
注册信号处理函数
忽略信号
捕捉信号
执行默认操作
信号作用及默认操作
信号列表
编写程序调用sigaction设置信号处理函数
注册信号处理函数的过程
sigaction函数具体实现
signal函数与sigaction函数的区别
信号处理的流程
用户进程对信号的处理方式
Linux操作系统中的信号
应急预案的设计思路
信号的机制
课堂练习
总结时刻
如何通过API注册一个信号处理函数?

该思维导图由 AI 生成,仅供参考

上一节最后,我们讲了信号的机制。在某些紧急情况下,我们需要给进程发送一个信号,紧急处理一些事情。
这种方式有点儿像咱们运维一个线上系统,为了应对一些突发事件,往往需要制定应急预案。就像下面的列表中一样。一旦发生了突发事件,马上能够找到负责人,根据处理步骤进行紧急响应,并且在限定的事件内搞定。
我们现在就按照应急预案的设计思路,来看一看 Linux 信号系统的机制。
首先,第一件要做的事情就是,整个团队要想一下,线上到底能够产生哪些异常情况,越全越好。于是,我们就有了上面这个很长很长的列表。
在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过 kill -l 命令,查看所有的信号。
# kill -l
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
这些信号都是什么作用呢?我们可以通过 man 7 signal 命令查看,里面会有一个列表。
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
……
就像应急预案里面给出的一样,每个信号都有一个唯一的 ID,还有遇到这个信号的时候的默认操作。
一旦有信号产生,我们就有下面这几种,用户进程对信号的处理方式。
1.执行默认操作。Linux 对每种信号都规定了默认操作,例如,上面列表中的 Term,就是终止进程的意思。Core 的意思是 Core Dump,也即终止进程后,通过 Core Dump 将当前进程的运行状态保存在文件里面,方便程序员事后进行分析问题在哪里。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何通过API注册一个信号处理函数。首先,文章详细讲解了Linux信号系统的机制,列举了各种信号及其作用,并介绍了用户进程对信号的处理方式。接着,文章详细讲解了信号处理的最常见流程,包括注册信号处理函数和发送信号两个步骤。在注册信号处理函数方面,文章介绍了使用signal函数和sigaction函数的区别,以及如何通过这两种方法将信号和相应的动作进行关联。此外,还强调了signal函数不是系统调用,而是glibc封装的一个函数,不同的实现方式会导致行为的不同。文章还深入探讨了信号处理函数的内核实现,包括系统调用rt_sigaction和进程内核数据结构的设置。总的来说,本文通过详细介绍Linux信号系统的机制和信号处理的流程,为读者提供了深入了解和掌握如何通过API注册一个信号处理函数的方法和技巧。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • LDxy
    信号类似内核里面的中断,只不过是在用户态的

    作者回复: 是的

    2019-06-25
    26
  • geraltlaush
    c语言开发者路过,表示以前从来不知道signal不是系统调用

    作者回复: strace一下

    2019-06-21
    7
  • 免费的人
    关于SA_ONESHOT,为什么我平时用signal的时候,处理函数可以被重复调用呢

    作者回复: 使用的库不一样?

    2019-06-21
    2
    1
  • 欢乐小熊
    收获满满, 不过看了标题以为是信号发送的流程, 结果学到了信号的注册和处理

    作者回复: 还有信号下

    2019-06-21
    1
  • Luke
    信号是不是操作系统的一个原语,在Windows端,对应的实现是消息Message循环

    作者回复: windows不太清楚

    2019-06-24
  • 眭东亮
    课后练习,参考文档: https://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html https://www.runoob.com/linux/linux-comm-kill.html
    2019-07-12
    4
  • JT
    老师,我测试过使用 signal 函数注册信号处理函数,注册一次是一直有效。每次给进程发信号都会调用信号处理函数
    2019-10-18
    2
  • hello
    一个进程如果一瞬间收到很多同一个信号,那task_struct的action最多能保存几个呢
    2019-11-10
    1
    1
  • NoTryNoSuccess
    “SEGSTOP”笔误,应为“SIGSTOP”。
    2023-04-24归属地:湖北
  • Geek_1ec22e
    信号注册是针对所有进程还是单个进程?
    2021-09-08
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部