【问题标题】:Is sysinfo() async. signal safe?sysinfo() 是异步的。信号安全吗?
【发布时间】:2022-02-17 03:11:28
【问题描述】:

这可能是一个愚蠢的问题,但在 Linux(RHEL 7/8)中是 sysinfo()(从 gcc 'C' 调用)异步。信号安全吗?

也就是说,它可以安全地从“C”信号处理程序中调用吗?

从命令行运行 'man sysinfo' 或 'info sysinfo' 似乎没有提到任何一种方式。

我一直在寻找一种“快速”的方法来获取经过的时间(来自信号处理程序或“正常”上下文)。

Posix ('man signal-safety') 似乎说 clock_gettime() 是信号安全的,尽管我看到 glibc 和 Posix 文档似乎并不总是同意什么是信号安全,什么不是。至少对于我正在寻找的地方。

例如在https://pubs.opengroup.org/onlinepubs/9699919799/ 'sleep()' 被列为'信号概念' 下的信号安全,其中显示了 POSIX 信号安全函数列表。 (并且还在 RHEL 8.5 的“人信号安全”下运行)。

但是“信息睡眠”(来自 RHEL 8.5)将 sleep() 显示为“AS-不安全”。 (以及我认为与 glibc 的安装级别相匹配的文档“GNU C 库参考手册 2.28”)。

我想我什至不确定应该在哪里找到最终文档(对于这种环境)。

【问题讨论】:

    标签: linux asynchronous gcc signals sysinfo


    【解决方案1】:

    sysinfo 只是瘦系统调用包装器和异步信号安全:

    00000000000feb00 <sysinfo@@GLIBC_2.2.5>:
       feb00:       mov    $0x63,%eax
       feb05:       syscall 
       feb07:       cmp    $0xfffffffffffff001,%rax
       feb0d:       jae    feb10 <sysinfo@@GLIBC_2.2.5+0x10>
       feb0f:       retq   
       feb10:       mov    0xbf359(%rip),%rcx
       feb17:       neg    %eax
       feb19:       mov    %eax,%fs:(%rcx)
       feb1c:       or     $0xffffffffffffffff,%rax
       feb20:       retq   
    

    但它没有 vDSO 加速,因此在当前系统上使用 CLOCK_REALTIMECLOCK_MONOTONIC 将比 clock_gettime 慢得多。

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2012-08-07
      • 2017-05-06
      相关资源
      最近更新 更多