pause()系统调用并接收SIGINT信号

时间:2018-11-30 04:44:23

标签: linux process exception-handling signals

我是Linux和Process信号处理的初学者。 假设我们有一个进程A,它执行了pause()函数,我们知道这会使当前进程进入休眠状态,直到该进程接收到信号为止。 但是,当我们键入ctrl-c时,内核还会向进程A发送一个SIGINT,并且当A接收到该信号时,它会执行SIGINT的默认处理程序,该处理程序终止当前进程。所以我的问题是:

流程A首先恢复还是处理程序首先执行?

1 个答案:

答案 0 :(得分:0)

为简单起见,我们假设进程A仅具有一个线程,该线程在pause()调用中为blocking,并且恰好有一个信号发送给该进程。

  

流程A首先恢复还是处理程序首先执行?

首先执行信号处理程序,然后返回pause()调用。


  • 如果有多个信号怎么办?

    标准信号不会排队,因此如果您连续非常快地向流程发送两个INT信号,那么只会传递其中一个。

    如果有多个信号,则顺序不确定。

  • POSIX实时信号呢? (SIGRTMIN+0SIGRTMAX-0

    它们像标准命名的信号一样,只是它们被排队(到一定数量),并且如果有多个信号挂起,它们将以递增的数字顺序传递。

    如果同时存在标准信号和实时信号,则不确定先发送哪些信号;尽管实际上,在Linux和许多其他系统中,标准信号是首先传递的,然后是实时信号。

  • 如果进程中有多个线程怎么办?

    内核会从没有屏蔽信号的线程中选择一个线程(通过sigprocmask()pthread_sigmask()),然后使用该线程将信号传递给信号处理程序。

    如果pause()调用中有多个线程阻塞,则其中之一被唤醒。如果存在多个挂起的信号,则不确定是一个唤醒线程处理所有这些信号,还是唤醒一个以上线程。

通常,我强烈建议阅读man 7 signalman 7 signal-safetyman 2 sigactionman 2 sigqueueman 2 sigwaitinfo手册页。 (虽然这些链接转到Linux手册页项目,但是每个页面都包含一个名为Conforming To的部分,用于命名相关标准,并且明确标记了Linux特定的行为。)

相关问题