代码之家  ›  专栏  ›  技术社区  ›  Leedehai

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

  •  0
  • Leedehai  · 技术社区  · 6 年前

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

    读取() 正在从管道中读取数据(由 pipe() ),但管道中没有可用的字节,因此 正在阻塞线程。现在,如果我发一封信 SIGINT 从终端(通过Ctrl+C),程序将终止。

    信号 打印一条信息 "SIGINT is received" . 什么时候? 是阻塞,我使用Ctrl+C,程序是否会在打印消息时终止,或者程序是否仍会以静默方式终止,因为 信号 读取()

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Monk    6 年前

    这似乎意味着一些系统调用有自己的信号处理程序。

    read(2)

    现在假设您已经处理了SIGINT信号,并在程序被阻塞时发送它 然后,根据信号处理程序的安装方式,可以观察到两种行为。

    1. sigaction(2) 重新启动 signal(7) 手册页,处理程序将执行和读取将在信号处理程序返回后自动重新启动。
    2. 如果 重新启动

    在这两种情况下,由于SIGINT被处理,程序不会终止。

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