信号的概述(产生信号的方式、信号的处理等)

1.1 信号的概念

信号是软件中断它是在软件层次上对中断机制的一种模拟

信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个 突发事件。

信号是一种异步通信方式 。

  • 进程不必等待信号的到达:信号是异步事件,发送信号的动作并不需要接收进程的确认。当内核或其他进程决定发送一个信号给某个进程时,信号会被放入接收进程的信号队列中。接收进程可以在它期望的时候检查信号队列,并根据信号的类型做出相应的处理。
  • 进程也不知道信号什么时候到达:由于信号是异步的,进程并不知道信号何时到达。进程必须定期检查信号队列,以确定是否有新的信号需要处理。
  • 信号可以直接进行用户空间进程和内核空间进程的交互:信号是操作系统提供的一种机制,用于在用户空间进程和内核之间进行通信。内核可以使用信号来通知用户空间进程系统事件的发生,例如硬件异常、软件错误、定时器到期、进程终止信号等。
  • 内核进程可以利用它来通知用户空间进程发生了哪些系统事件:例如,当一个进程尝试读取一个没有挂载的文件系统时,操作系统内核会向该进程发送一个信号(通常是 SIGSEGV)。当进程接收并处理了这个信号,它可以采取适当的行动,比如终止程序或尝试恢复。

每个信号的名字都以字符SIG开头。

每个信号和一个数字编码相对应,在头文件signum.h中,这些信号都被定义为正整数。

信号名定义路径: /usr/include/i386-linux-gnu/bits/signum.h (ubuntu12.04)                                           /usr/include/x86_64-linux-gnu/bits/signum.h (ubuntu16.04)


在Linux下,要想查看这些信号和编码的对应关系,可使用命令:kill - l

  • 信号是操作系统中用于进程间通信的一种机制。它们是预先定义的一系列标识符,每个标识符都对应于一个特定的事件或条件。当这些预设的事件发生时,比如程序终止、硬件异常或者用户输入等,信号会被发送到一个或多个进程中。
  • 每个信号都有一组默认的行为,称为信号处理函数,当信号到达进程时,这些函数会被自动调用,从而影响进程的运行。进程可以选择忽略某些信号或者注册自定义的信号处理函数来覆盖默认行为。这样,进程就能够根据自身的逻辑来响应不同的信号。
  • 信号的使用非常灵活,但同时也需要谨慎处理,因为错误的信号处理可能导致程序崩溃或者不可预料的行为。因此,了解和正确使用信号对于编写健壮的多线程和多进程应用程序至关重要。虽然我们不能自行创建新的信号,但操作系统提供的标准信号集合足以满足大多数编程需求。

1.2 产生信号的方式

  1. 当用户按某些终端键时,将产生信号 例如:终端上按“Ctrl+c”组合键通常产生中断信号SIGINT、 终端上按"Ctrl+\"键通常产生中断信号SIGQUIT、 终端上按"Ctrl+z"键通常产生中断信号SIGSTOP。
  2. 硬件异常将产生信号 除数为0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生 适当的信号发送给相应的进程。
  3. 软件异常将产生信号。 当检测到某种软件条件已发生,并将其通知有关进程时,产生信号。
  4. 调用kill函数将发送信号。 注意:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必 须是超级用户。
  5. 运行kill命令将发送信号。 此程序实际上是使用kill函数来发送信号。也常用此命令终止一个失控的后台进程。

1.3 信号的默认(缺省)处理方式

信号是操作系统提供的一种进程间通信手段,用于通知进程发生了某种事件。

进程接收到信号后,通常会采取以下几种默认处理方式之一:

  1. 终止进程这是最常见的信号处理方式,当进程接收到如SIGTERM(程序终止请求)信号时,会立即停止运行并退出

  2. 忽略信号有些信号被设计为可以被进程忽略,例如SIGCHLD(子进程状态改变)。如果进程选择忽略某个信号,则该信号不会对进程产生任何影响

  3. 停止进程当进程接收到如SIGSTOP(停止进程)信号时,它会暂停执行,处于等待状态。这通常用于调试目的,以便开发者可以检查进程的状态

  4. 恢复停止的进程如果进程之前被停止了(例如,通过接收到SIGSTOP信号),那么它可以通过接收如SIGCONT(继续进程)信号而恢复执行。这允许进程从后台转到前台,继续其任务。

值得注意的是,尽管每个信号有一个默认的处理方式,但进程可以通过编写特定的信号处理函数来覆盖这些默认行为。

这种自定义的处理方式允许程序员根据具体情况来决定如何响应信号。例如,一个进程可能希望捕获SIGTERM信号并进行清理工作,而不是直接退出。

1.4 进程收到信号后的处理

当进程接收到信号时,可以采取不同的处理方式:

  • 执行系统默认动作:这是大多数信号的默认行为,通常是终止进程。例如,SIGKILL(杀死进程)和SIGSEGV(段错误)信号就是设计来立即终止进程的。

  • 忽略此信号:进程可以选择忽略某些信号,这意味着信号到来时不会引起任何反应。例如,SIGCHLD(子进程状态改变)通常被忽略,除非进程显式地请求接收它。

  • 执行自定义信号处理函数:进程可以注册一个自定义函数来处理特定信号。当信号到来时,这个函数会被调用,允许进程根据需要执行特定的操作,比如记录日志、释放资源或者安全地终止。

    注意SIGKILLSIGSTOP这两个信号只能以默认的处理方式执行,不能忽略也不能自定义。

1.5 常见的信号

一些信号实现函数我会放在下一篇讲解,如有错误,诚请指点。

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值