gpt4 book ai didi

linux - 接收信号时阻塞的系统调用会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:12 24 4
gpt4 key购买 nike

假设一个 linux 进程正试图从一个套接字中读取()数据并且在 socked fd 上被阻塞。当它被信号中断时会发生什么?它会返回 errno EINRPT 还是继续在 socket fd 上读取()?

是否有适用于所有系统调用接收信号的通用规则?

最佳答案

在套接字的特定情况下,read(2) 被认为是一个缓慢的系统调用,因为它可能永远阻塞;因此,如果接收到已为其设置信号处理程序的信号,则可能发生以下两种情况之一:

  1. 如果信号处理程序在 struct sigactionsa_flags 字段中设置了 SA_RESTART 标志,则系统调用会在 ( and if) handler返回(handler不返回的情况包括但不限于调用exit(3)或使用longjmp(3)的handler代码/setjmp(3));在这种情况下,用户代码看不到 EINTR
  2. 如果未设置 SA_RESTART 标志,系统调用将提前返回并且 errno 将设置为 EINTR

通用规则参见man 7 signal,特别注意信号处理程序中断系统调用和库函数

关于linux - 接收信号时阻塞的系统调用会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812275/

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