【问题标题】:Which system calls are not interrupted by a signal?哪些系统调用不会被信号中断?
【发布时间】:2016-01-29 12:59:43
【问题描述】:

AFAIK,linux/unix 上的大多数系统调用在收到信号时都会中断。根据下面的博文,有一些系统调用没有被中断:

一般来说,立即返回的函数(不要等待任何 I/O 操作完成或休眠)不会像 socket(2) 那样被中断,它只是分配一个套接字并且不等待任何东西。

http://www.linuxprogrammingblog.com/all-about-linux-signals?page=5

有这类函数的列表吗?与此主题相关的任何链接都会有所帮助。

【问题讨论】:

  • 当一个信号被阻塞时,它不会“中断”任何系统调用。一些 NFS 挂载的文件系统可能存在一些边界情况。但是你为什么在乎呢?
  • 恐怕我听不懂你。什么是“信号被阻塞”?澄清一下,我说的是用 EINTR 中断系统调用。 man7.org/linux/man-pages/man7/signal.7.html(信号处理程序中断系统调用和库函数)内核使用什么机制来决定哪个调用是可中断的,哪个不是? (如果“socket()”的故事是真的)。​​
  • 每个系统调用的规范(手册页)告诉它是否可以获得EINTR

标签: linux unix linux-kernel kernel signals


【解决方案1】:

内核使用什么机制来决定哪个调用是 可中断的,哪一个不是? (如果“socket()”的故事是 真的)

任务有位掩码,可以用set_task_state 设置为TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE(定义here)。

有这类函数的列表吗?

我不认为有不间断功能的列表。可以搜索TASK_UNINTERRUPTIBLE的用法(比如this

编辑:example 使用 signal_pending_state 检查此标志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2016-02-01
    相关资源
    最近更新 更多