信号_信号的发送与接收_core文件

信号的发送与接收

(1)发送

  一般来说,大多数发送信号的原因,都是因为内核、硬件发生了某些事件时,才会向某个进程发送该事件专用的信号,告诉该进程这个事件发生了。

  不过对于我们自己写的进程来说,其实更多的是接收信号,而不是发送信号。

  我们自己发送信号的原因无非如下几种情况:

  (a)Ctrl+C、Ctrl+\发送信号,终止正在运行的进程

  (b)命令执行kill命令发送信号,终止跑飞的进程,通常都是发送15这个信号

    15这个信号的名字是SIGTERM,TERM就是terminal的缩写,其实就是命令行终端的意思。

    当无法使用Ctrl+C、Ctrl+\来终止进程时,往往使用Kill命令来终止进程。

    那么什么样的进程会使用Ctrl+C、Ctrl+\来终止呢?

    只有当进程占有命令行终端时,才能使用Ctrl+C、Ctrl+\来终止。

  (c)因为某些特殊需求,往往在我们自己的程序里面,需要调用kill函数向另一个进程发送某个信号。

    什么特殊需求呢?

      比如A进程和B进程需要协同工作,A进程将相应时间准备好以后,可能需要发送一个信号给B进程,通知B进程,B进程接收到信号后,就知道该事件已经准备好,可以配合A进程做事了。

    至于说自己写的进程发送什么信号合适呢?

      其实发送哪一种信号都行,但是我们说几乎每一种信号都有自己特定的用途。

      所以我们自己的程序在发送信号是,如果发送给别人专用时间信号的话,这样就显得很不正规,而且很可能造成误会。比如我的A进程给另一个进程发送一个SIGSEGV信号,B进程还以为发生了指针错误事件,其实发生的并不是指针错误时间,而是其他事件,这就造成了理解的错误。

    因此自己进程调用kill函数发送信号时,我们可以发送的是SIGUSER1、SIGUSER2这两个自定义信号,所谓自定义就是,信号所代表的事件,可以由程序员自己根据实际情况来规定。

(2)接收

  对于我们自己写的进程来说,最常见的信号操作还是接收信号。不过在一般情况下,我们的进程并不会去重新设置信号的处理方式,而是使用信号的默认处理方式来处理信号。

  虽然很少重新设置信号的处理方式,但是总还是有这种需求的,所以我们后面会介绍,如何调用API重新设置信号的处理方式。

(3)core文件

  1) 什么是core文件

  用于保存程序(进程)在当前结束的这一刻,进程在内存中的代码和数据,core文件可以用于分析进程在结束时的状况,不过由于进程代码和数据都是二进制的,所以把core文件直接打开后我们是看不懂的,一般需要特殊软件翻译后才能看懂。

  2)并不是所有的信号在终止进程时都会产生core文件

  只有某些信号在终止时才会产生core文件,不过一般情况下并不会创建这个文件,因为系统默认将产生core的设置给关闭了,只有打开这个设置后才会保存core文件。

  所以你看到提示core dumped,这就标识这个信号终止进程时,会产生core文件,只不过由于关闭了设置,因此core文件被丢弃了,dumped就是丢弃的意思。

  演示

    例子1:Ctrl+\ 发送SIGQUIT信号

    例子2:操作错误地址

  3)如果你不想丢弃core文件怎么办?

  对相关的系统文件进行设置即可,core文件一般默认保存在当前路径下。

  由于core在实际开发中基本用不到(除非某些特殊的场合),所以我们这里不再深入介绍core文件。

posted @ 2020-04-02 20:02  doitjust  阅读(631)  评论(0编辑  收藏  举报