Linux 信号(上)- 信号概念/信号处理/等知识点

全篇阅读只需6分钟


  • 生活中的信号概念可想而知(交通信号灯),那什么是Linux中的信号概念呢?

其实很好理解,首先信号有好多种,不同的信号处理方式也不同(三种处理方式,默认、忽略<>、捕捉<要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号>);
在接收信号之前就已经指导改如何处理了。(以上两条也是信号的特性)

  • 信号发送给谁呢?怎么发送?

信号的发送者有很多,比如终端驱动程序,进程,系统。而接收者大多是一个进程。

那么怎么做就是给某进程发送一个信号呢?事实上,给进程发一个信号就是修改目标进程pcb结构体中的关于信号的字段(让进程记录此信号),想一想,用什么数据结构可以解决这个问题呢?

答案也很简单,进程是否接收到信号本身是一个原子问题。它要么收到,要么没收到。所以可以用位图来表示进程是否收到信号。

  • 注意:

    1、Ctrl + C产生信号,只能发送给前台进程;

    2、一个命令后加&可以放到后台运行,这样shell不必等待进程结束就可以接受新的命令,启动新的程序;

    3、一个shell可以运行一个前台进程和任意多个后台进程,只有前台进程才能接收到Ctrl + C这种控制键产生的信号;

    4、前台进程在运行过程中随时会因按下Ctrl+ C而产生一个信号,便会收到SIGINT信号而终止进程,所以信号相对进程控制流程来说是异步的。


  • 知道了信号的概念,查看系统中定义的信号列表也很简单:

kill -l 命令

这里写图片描述

乍一看,好像有64种信号,但是但如果仔细观察,你就会发现并非如此。没有32和33号信号。一共只有62个信号。。。

1 - 33号称为普通信号,34 - 64号是实时信号,其中每个信号都有一个编号和一个宏定义名称,这些宏定义可以在头文件signal.h中找到。

  • 而这些信号各自在什么条件下产生?默认的处理动作是什么?在signal(7)中都有详细说明,在命令行上输入man 7 signa即可查看:

这里写图片描述


  • 下期预告

  • 所有基本概念已知,那么信号是怎样产生的呢?

终端按键产生

硬件异常产生信号

系统调用产生

软件条件产生

  • 在此处有几个问题,值得注意:
    1、解引用空指针发生了什么?
    2、库函数和系统调用的区别?

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/79864987
今日推荐