2019独角兽企业重金招聘Python工程师标准>>>

在Linux中,signal是一种局限较强的进程间通信方式。

主要有三种类型:

1. 从hardware signal到POSIX signal

hardware signal也叫hardware interrupt,CPU中存放着 interrupt vectors 指向 存放在kernel space中的interrupt handling routine。

例: 键盘输入;segmentation fault -> SIGSEGV

2. 直接从kernel生成的POSIX signal

例:exit() -> SIGCHLD

3. 从一个进程发起到另一个进程的signal

例:进程885 执行了 “kill 1234” 代码

POSIX signal

1. Generated from CPU to kernel, or from CPU to processes

例 1: Segmentation fault.
        The signal is labeled SIGSEGV, which comes from CPU to kernel then to process.
    例 2: Floating point exception (e.g., divided by 0).
        The signal is labeled SIGFPE, which is coming from CPU to process

2. From kernel to process

例: Child process termination.
        The signal is labeled SIGCHLD, which is coming from the kernel to process

3. Generated from one process to another

例: From terminals: E.g., “Ctrl C”, “Ctrl Z”
            Using programs: E.g., “kill”, “top”, etc.
            Using the “kill()” system call.

一些典型的signal

Asynchronous signal: 异步信号
– The signal received is NOT generated by the process itself。 So, its arrival time is usually not deterministic
– E.g., External hardware interrupt, another process sends ctrl-c

Synchronous signal: 同步信号
– The signal is caused by the process itself, its arrival time is usually deterministic
– E.g., A certain line leads to SIGFPE 
– E.g., A certain line accesses a memory region: SIGSEGV

kill() 方法

用于给特地进程发送POSIX signal

signal() 方法

更新当前进程的特定signal的处理方法,即signal handler

例:写个无法“Ctrl+C”中止的小病毒

#include <stdio.h>
#include <signal.h>void sig_handler(int sig) {if(sig == SIGINT)printf("\nCtrl + C\n");
}int main(void) {signal(SIGINT, sig_handler);printf("Press enter\n");getchar();printf("End of program\n");return 0;
}

通常情况下,我们希望当signal handler处理完signal后,程序恢复到之前执行的地方;而有时候,则希望程序继续运行下去。

signal的检查方法

一个进程如何知道它收到了一个特定的signal?

在kernel space中,有一个bitmask

进程会不定期地去检查这个bitmask,如果看到是1,则调用对应的handler,并重置为0。

因此,发送signal和处理signal是异步的。

pause()方法

The pause() system call suspends the calling process until a signal is received. 等待一个信号

有益的重写signal handler

重写SIGINT的handler,保证进程在被用户ctrl-c 中止之前,进行一些必要的清理工作比如 关闭数据库连接等。

alarm()方法

设置一个“闹钟”在指定时间后“响”起。

通过在hardware设置一个闹钟,到达时间后,hardware的signal会转换成SIGALRM signal发送给进程,默认的处理方式是结束当前进程。

alarm()是一次性的,如果需要周期性的,则使用 settimer()方法

转载于:https://my.oschina.net/Bruce370/blog/885260

Linux Signals 进程信号简介相关推荐

  1. 【Linux】进程信号“疑问?坤叫算信号吗?“

    鸡叫当然也算信号啦~ 文章目录 前言 一.认识信号量 二.信号的产生 1.调用系统函数向进程发信号 2.由软件条件产生信号 3.硬件异常产生信号 总结 前言 信号在我们生活中很常见,下面我们举一举生活 ...

  2. linux 之进程信号

    1       信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. ...

  3. 【Linux】进程信号

    目录

  4. Linux 中进程的管理

    Linux 的进程信号 1  HUP  挂起 2  INT  中断 3 QUIT  结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能终止 17 STOP 无条件终止运 ...

  5. linux忽略的信号可以被子进程继承,linux – 可以忽略(丢失)信号吗?

    我有一个通过信号与工人沟通的应用程序(特别是SIGUSR1 / SIGUSR2 / SIGSTOP). 我能相信无论发生什么,每个信号都将由处理程序传递和处理吗? 如果信号的发送速度快于应用程序处理信 ...

  6. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  7. linux使进程不依赖终端,Linux nohup命令应用简介--让Linux的进程不受终端影响

    nohup命令应用简介--让Linux的进程不受终端影响 by:授客 QQ:1033553122 #开启ping进程 [root@localhost ~]# ping localhost & ...

  8. linux 查看进程的信号,Linux 进程信号查看与控制

    Linux 进程信号查看与控制 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出 通常是在终端的控制进程结束时 通知同一 session 内的各个作业 这时它们与控制终端不再关联 ...

  9. Linux 进程信号详细总结

    信号:信号是进程之间事件异步通知的一种方式,是一个软中断 作用:操作系统通过信号告诉进程发生了某个事件,打断进程当前的操作,去处理这个事件 信号在我们生活中无处不在,例如交通上的红绿灯,学校上下课的铃 ...

最新文章

  1. HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析
  2. 剑指_数组中出现次数超过一半的数字
  3. LeetCode Basic Calculator II(加减乘除计算器)
  4. Linux系统及编程期末试题,《LINUX系统及其编程》考试试题及答案.doc
  5. Java final、static final 讲解
  6. SSO CAS 探究
  7. TIOBE开发语言排行榜
  8. 安装Sarge(二) 配置基本系统
  9. nvidia-rapids︱cuGraph(NetworkX-like)关系图模型
  10. android语音控制歌曲播放,Amazon Music应用程序已支持Alexa语音控制歌曲播放
  11. 【牛客网SQL篇】SQL必知必会
  12. 驱动人生病毒清除教程
  13. 用公式编辑器打的公式变大了怎么办?
  14. linux 图片压缩命令,Linux:优化和压缩JPEG和PNG图片的命令行工具
  15. php excel 导入图片,利用php实现读取excel中的图片
  16. 导出公众号历史文章,批量下载微信公众号数据分析
  17. App 抓包利器:Charles 以及 App 爬虫心得
  18. 数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
  19. 计算机的串口波特率,什么是波特率_波特率9600是什么意思_串口通信为什么要设置波特率?...
  20. 实现学习高效率,你需要这些更高效的学习APP!

热门文章

  1. 这几个技巧让你做出让导师眼前一亮的答辩 PPT
  2. kinux查日志_Linux实时查看日志的四种命令详解
  3. 自定义Matlab功能函数——10进制整数矩阵转二进制字符矩阵
  4. PDF转换器安装教程
  5. 安装 | R2021a链接及Matlab运行图
  6. 4由通道检测_十堰城区108处桥隧通道接受全面“体检”将持续至8月底
  7. 工业用微型计算机(25)-伪操作(1)
  8. python3精要(5)-最长公共前缀Trie树
  9. 【学术相关】人工智能顶会审稿现状—理想中的审稿人vs实际审稿人
  10. 【时间序列】再次出发!FaceBook 开源一站式服务时序利器 Kats !