Linux 收到信号时被阻止的系统调用会发生什么情况?

Linux 收到信号时被阻止的系统调用会发生什么情况?,linux,process,operating-system,signals,interrupt,Linux,Process,Operating System,Signals,Interrupt,假设linux进程正在尝试从套接字读取()数据,并且在套接字fd上被阻止。当信号中断时,会发生什么情况? 它将返回errno EINRPT还是继续读取套接字fd上的() 是否有适用于接收信号时所有系统调用的通用规则?在套接字的特定情况下,read(2)被认为是一个缓慢的系统调用,因为它可能永远阻塞;因此,如果接收到已设置信号处理程序的信号,则可能发生以下两种情况之一: 如果信号处理程序在struct sigaction的SA_flags字段中设置了SA_RESTART标志,那么系统调用将在处理程

假设linux进程正在尝试从套接字读取()数据,并且在套接字fd上被阻止。当信号中断时,会发生什么情况? 它将返回errno EINRPT还是继续读取套接字fd上的()


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

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

  • 如果信号处理程序在
    struct sigaction
    SA_flags
    字段中设置了
    SA_RESTART
    标志,那么系统调用将在处理程序返回后(如果)自动重新启动(处理程序不返回的情况包括但不限于调用
    exit(3)的处理程序代码)
    或使用
    longjmp(3)
    /
    setjmp(3)
    );在这种情况下,用户代码看不到
    EINTR
  • 如果未设置
    SA_RESTART
    标志,系统调用将提前返回,
    errno
    设置为
    EINTR

  • 有关一般规则,请参见
    MAN7信号
    ,特别注意信号处理程序中断系统调用和库函数一节

    。“信号处理器中断系统调用和库函数”部分。还有类似的问题/答案等。