gpt4 book ai didi

Linux:系统调用是否有自己的信号处理程序?我可以覆盖它吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:07 25 4
gpt4 key购买 nike

系统调用文档read()如果 read() 被信号中断,它会立即返回。返回值反射(reflect)了到目前为止它成功读取了多少字节。这似乎暗示某些系统调用有自己的信号处理程序。

如果read()正在从管道中读取(由pipe()设置),但是管道中没有可用的字节,所以read () 正在阻塞线程。现在,如果我从终端发送一个 SIGINT(通过 Ctrl+C),程序将终止。

假设在程序开始时,我为 SIGINT 安装了一个信号处理程序,它打印一条消息 “SIGINT is received”。当 read() 阻塞并且我使用 Ctrl+C 时,程序会终止并打印该消息,还是程序仍会静默终止,因为 SIGINT 已由 read() 的信号处理程序?

(我的实验表明是后一种情况..不确定)

最佳答案

It seems to imply some system calls have their own signal handlers.

不,绝对不是。根据read(2)手册页当读取被信号中断时返回 EINTR。要实现此行为,您必须处理信号,即为其安装处理程序。如果您发送信号而不处理它,那么程序将终止。

现在假设您已处理 SIGINT 信号并在程序在 read(2) 上被阻止时发送它那么根据您安装信号处理程序的方式,可以观察到两种行为。

  1. 如果使用 sigaction(2) 处理信号然后根据signal(7) 使用SA_RESTART手册页,处理程序将在信号处理程序返回后自动重新执行和读取。
  2. 如果未使用 SA_RESTART 标志,则调用失败并显示错误 EINTR。

在这两种情况下,程序都不会终止,因为已处理 SIGINT。

Suppose at the program's start I installed a signal handler for SIGINT that prints a message "SIGINT is received". When read() is blocking and I use Ctrl+C, will the program terminate with that message printed, or will the program still terminate silently because SIGINT is already handled by read()'s signal handler?

在这两种情况下,程序都不会终止。将打印处理程序消息“SIGINT is received”,程序将继续执行。

关于Linux:系统调用是否有自己的信号处理程序?我可以覆盖它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com