【问题标题】:`nanosleep()` async-signal safety on Linux`nanosleep()` Linux 上的异​​步信号安全
【发布时间】:2020-07-16 01:53:59
【问题描述】:

我需要在我的用户空间线程库中使用nanosleep 函数来实现大约所需数量的等待,因为它可以在异步信号中断的情况下节省剩余时间。我使用 SIGALRM 抢先切换线程;因此,重要的是要考虑使用不可重入函数的可能副作用。因此,如果 nanosleep 调用被线程切换中断,并从另一个线程或信号处理程序再次调用,我想知道这种情况是否会导致问题。

显然,nanosleep 函数不是 as it is not listed here 的异步信号安全的;但是,sleep(3) 据说是异步信号安全的。另一方面,sleep(3) seems to be implemented using nanosleep on Linux。我可以以此证明nanosleep 对我想要实现的目标是安全的吗?

编辑:根据this resource,它确实是 AS 安全的。

【问题讨论】:

    标签: linux multithreading signals posix ucontext


    【解决方案1】:

    不,除非有专门记录,否则您不能安全地假设这一点。原因是使用nanosleepsleep 的实现细节。如果这两个函数被重构为使用 glibc 中的一些常见的内部函数,这些函数是异步信号安全的,但 nanosleep 的实现发生了变化,因此它不是,你的代码就会被破坏。

    您不能依赖 glibc 中函数的实现细节,因为它们可以并且确实会跨版本更改。值得注意的是,所有 Adob​​e Flash 版本在某些机器上都崩溃了,因为 glibc 将 memcpy 更改为向下复制而不是向上复制,这是标准和文档所允许的。

    另外,仅仅因为 glibc 以某种方式做事并不意味着其他 Linux libcs​​(或其他非 Linux libcs​​)也可以,并且您的代码将无法在那里工作。

    【讨论】:

    • 向下复制而不是向上复制...有人使用memcpy(),而他们应该从一开始就在重叠缓冲区上使用memmove()
    • 是的,他们就是这么做的。 bugzilla.redhat.com/show_bug.cgi?id=638477
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 2019-12-14
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多