【问题标题】:Use flock() in the sigaction handler在 sigaction 处理程序中使用flock()
【发布时间】:2013-06-03 11:06:49
【问题描述】:

flock() 通常是异步信号安全的,因为它是一个系统调用。它的语义使得很难以不同的方式实现它。它不在 POSIX 的 list 的异步信号安全函数中,因为它根本不在 POSIX 中。

是否可以在 sigaction 处理程序中使用flock() 而不会出现问题?

【问题讨论】:

  • flock() 的 Mac OS X 文档没有提供任何直接帮助。没有理由假设 flock() 会与用户空间结构混淆,因此完全有理由认为它将是异步信号安全的,但这并不是决定性的。 fcntl() 函数,它是 POSIX 锁定系统调用,是异步信号安全的,它支持 flock() 可以实现的观点,因此它是异步信号安全的,但这仍然不是证据。也许你应该升级为使用fcntl(),然后你就会知道你是安全的。
  • @JonathanLeffler Cna 我使用flock() 锁定并使用fcntl() 解锁?
  • 请在此处查看我对您最初问题的补充回答:stackoverflow.com/a/16979601/694576
  • 不:你不能用fcntl()来解锁你用flock()锁定的东西。
  • 终于在这个话题上得到了答案:stackoverflow.com/questions/16988256/…

标签: c linux signals flock


【解决方案1】:

根据@alk在下面topic的回答:

我们可以开发我们的属性flock()函数(它的名字可以是async_flock())。我们在这个新函数中复制原始 lockf() 代码的内容,然后我们进行以下更改以获得异步信号安全函数:

  • __fcntl 替换为fcntl:编译代码所必需的
  • __set_errno(<errno-define>)替换为errno = <errno-define>:编译代码所必需的

  • 用适当的分配 struct fcntl = {0} 替换对 memset() 的调用:使其变为 async-signal-save 所必需的。

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多