【问题标题】:C Linux Signal HandlingC Linux 信号处理
【发布时间】:2016-02-01 08:38:14
【问题描述】:

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

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

另外,如果一个信号在内核处理另一个更早到达的信号时到达会发生什么?以后会捕获新信号吗?

非常感谢!

【问题讨论】:

  • 您的问题相当广泛,其中包含多个问题。信号处理程序是一个广泛的主题,所以也许您可以编辑它以突出显示您要问的问题,只需要一两个实际问题......(顺便说一句,信号处理程序不在内核模式下运行。)跨度>

标签: c linux signals


【解决方案1】:

你错了。信号处理程序不在内核模式下运行,而是在用户模式下运行。这将是一个重大的权限升级错误是一个普通的应用程序可以获得内核模式访问。

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

【讨论】:

  • 不完全。信号可以中断系统调用。
  • @n.m.:您的意思是系统调用可以在信号到达时提前返回(并失败)?我认为系统调用不会因处理信号而暂停和恢复。
  • @n.m. :我想这可能是视角上的差异(内核/用户代码)。我想你指的是SA_RESTART,C 库通过重新发出调用来处理EINTR。但另请参阅 glibc 明确指出 readwrite 不会重新发布。
【解决方案2】:

如果您不希望系统调用被信号中断,您可以使用sigprocmask(2) 屏蔽所有(可捕获的)信号:

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

SIGKILLSIGSTOP 不能被屏蔽。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2014-04-29
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多