首页 文章

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

提问于
浏览
0

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

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

1 回答

  • 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的行为 . )

相关问题