2016-02-01 114 views
0

我是新手,在学习Linux信号处理时遇到了一些问题。C Linux信号处理

在Linux中,如果一个信号在诸如pause()之类的系统调用期间到达,程序将切换到内核模式并运行信号处理程序。然后根据处理程序的功能,程序将执行该功能告诉它执行的任何操作。如果系统调用很重要并且不能/不应该中断? (或者是否存在不能被信号中断的系统调用?)

另外,如果在内核正在处理另一个信号时,信号到来会发生什么?这个新信号会被捕获吗?

非常感谢!

+0

我会读这:http://unix.stackexchange.com/questions/16455/interruption-of-system-calls-when-a-signal-is-caught – Idos

+0

你的问题是相当广泛的,有多个问题它。信号处理程序是一个广泛的主题,所以也许你可以编辑它来突出你正在问的是什么,只有一两个实际问题......(顺便说一句,信号处理程序不在内核模式下运行。) – hyde

回答

1

你错了。信号处理程序不在内核模式下运行,但在用户模式下运行。这将是一个主要的权限升级bug是一个正常的应用程序可以获得内核模式访问。

你也想知道系统调用被中断。这不是一个问题,出于同样的原因:信号只影响应用程序,而不是处理系统调用的内核。

+0

不是相当。信号可以中断系统调用。 –

+0

@n.m .:你的意思是系统调用可以在信号到达时提前返回(并且失败)?我不认为系统调用被暂停,并且通过处理信号恢复。 – MSalters

+0

是的,情况正是如此。阅读“男人7号信号”。 –

0

如果不希望系统调用来的信号被中断,则可以屏蔽所有(捕)信号与sigprocmask(2)

sigset_t fullset; 
sigfillset(&fullset); 
sigprocmask(SiG_SETMASK, fullset, NULL); 

SIGKILLSIGSTOP无法阻止。

如果一个信号在阻塞时到达,当相应的信号再次从掩码中移除时,处理程序将被执行。