我是Linux和Process信号处理的初学者 . 假设我们有一个进程A并且它执行pause()函数,我们知道将当前进程置于休眠状态直到进程收到一个信号 . 但是当我们输入ctrl-c时,内核也会向进程A发送一个SIGINT,当A收到信号时,它会执行SIGINT的默认处理程序,该处理程序终止当前进程 . 所以我的问题是:
进程A是先恢复还是处理程序先执行?
为简单起见,我们假设进程A只有一个线程,在 pause() 调用中是blocking,并且只有一个信号被发送到进程 .
pause()
进程A首先恢复还是首先执行处理程序?
首先执行信号处理程序,然后返回 pause() 调用 .
标准信号没有排队,因此如果您连续快速地向过程发送两个 INT 信号,则只传送其中一个信号 .
INT
如果有多个信号,则不指定订单 .
SIGRTMIN+0
SIGRTMAX-0
它们就像标准命名信号一样,除了它们排队(达到极限),如果它们中有多个是待定的,它们会以递增的数字顺序传递 .
如果标准信号和实时信号都有待处理,则未指定哪些信号先被传送;虽然在实践中,在Linux和许多其他系统中,标准信号首先被传递,然后是实时传递 .
内核将在那些没有信号屏蔽的线程中选择一个线程(通过 sigprocmask() 或 pthread_sigmask() ),并使用该线程将信号传递给信号处理程序 .
sigprocmask()
pthread_sigmask()
如果在 pause() 调用中有多个线程阻塞,则其中一个被唤醒 . 如果有多个待处理信号,则未指定一个唤醒线程是否全部处理它们,或者是否唤醒了多个线程 .
一般来说,我热烈建议您阅读man 7 signal,man 7 signal-safety,man 2 sigaction,man 2 sigqueue和man 2 sigwaitinfo手册页 . (当链接转到Linux手册页项目时,每个页面都包含一个符合相关标准的Conforming To部分,并且明确标记了特定于Linux的行为 . )
1 回答
为简单起见,我们假设进程A只有一个线程,在
pause()
调用中是blocking,并且只有一个信号被发送到进程 .首先执行信号处理程序,然后返回
pause()
调用 .标准信号没有排队,因此如果您连续快速地向过程发送两个
INT
信号,则只传送其中一个信号 .如果有多个信号,则不指定订单 .
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的行为 . )