我是Linux和Process信号处理的初学者。 假设我们有一个进程A,它执行了pause()函数,我们知道这会使当前进程进入休眠状态,直到该进程接收到信号为止。 但是,当我们键入ctrl-c时,内核还会向进程A发送一个SIGINT,并且当A接收到该信号时,它会执行SIGINT的默认处理程序,该处理程序终止当前进程。所以我的问题是:
流程A首先恢复还是处理程序首先执行?
答案 0 :(得分:0)
为简单起见,我们假设进程A仅具有一个线程,该线程在pause()
调用中为blocking,并且恰好有一个信号发送给该进程。
流程A首先恢复还是处理程序首先执行?
首先执行信号处理程序,然后返回pause()
调用。
如果有多个信号怎么办?
标准信号不会排队,因此如果您连续非常快地向流程发送两个INT
信号,那么只会传递其中一个。
如果有多个信号,则顺序不确定。
POSIX实时信号呢? (SIGRTMIN+0
至SIGRTMAX-0
)
它们像标准命名的信号一样,只是它们被排队(到一定数量),并且如果有多个信号挂起,它们将以递增的数字顺序传递。
如果同时存在标准信号和实时信号,则不确定先发送哪些信号;尽管实际上,在Linux和许多其他系统中,标准信号是首先传递的,然后是实时信号。
如果进程中有多个线程怎么办?
内核会从没有屏蔽信号的线程中选择一个线程(通过sigprocmask()
或pthread_sigmask()
),然后使用该线程将信号传递给信号处理程序。
如果pause()
调用中有多个线程阻塞,则其中之一被唤醒。如果存在多个挂起的信号,则不确定是一个唤醒线程处理所有这些信号,还是唤醒一个以上线程。
通常,我强烈建议阅读man 7 signal
,man 7 signal-safety
,man 2 sigaction
,man 2 sigqueue
和man 2 sigwaitinfo
手册页。 (虽然这些链接转到Linux手册页项目,但是每个页面都包含一个名为Conforming To的部分,用于命名相关标准,并且明确标记了Linux特定的行为。)