【问题标题】:Reading from shared resource inside signalhandler从信号处理程序中的共享资源中读取
【发布时间】:2023-03-22 20:25:01
【问题描述】:

我有一个共享资源,表示 Web 服务器的请求统计信息,该服务器在接受调用以处理客户端连接后分叉。当父进程捕获某个信号时,我想将这些统计信息打印到 stderr,但是 stats 结构受信号量保护,我知道由于死锁而在信号处理程序中锁定/解锁信号量是一个坏主意问题。我试图在 sig 处理程序中设置一个标志,并在设置标志时从父进程打印统计信息,方法是在 accept() 之后首先检查 EINTR,然后检查标志,但这不起作用。有什么想法吗?

【问题讨论】:

  • 所以我似乎找到了解决办法。基本上通过使用 sigaction() 关闭系统调用的自动重启并检查 EINTR 的 accept() 的返回值似乎有效。

标签: c signals semaphore signal-handling


【解决方案1】:

您可以使用 __sync_fetch_and_add 之类的原子操作读取统计变量,而不是在中断处理程序上下文中获取锁或设置标志。

__sync_fetch_and_add( stats, 0)

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2015-01-13
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多