【问题标题】:Why is strace showing ERESTARTSYS for read?为什么 strace 显示 ERESTARTSYS 以供读取?
【发布时间】:2014-10-02 11:40:24
【问题描述】:

我有一个多线程程序,通过strace 运行时,显示如下:

read(10, "lorem ipsum...", 100) = 100
read(10, 0x2ae9ebcb5000, 8191) = ? ERESTARTSYS (To be restarted)
--- SIGTERM ... ---

每当 ERESTARTSYS 发生时,程序都会挂起读取。当 ERESTARTSYS 没有发生时,程序成功退出,我得到:

read(10, "lorem ipsum...", 100) = 100
read(10, "", 8191) = 0
...
exit_group(0)

查看stracemanpage(对于不是我的版本的 strace)和诸如thisthis 之类的问题,似乎读取被某些信号中断。我可能误解了文档,但我没有看到除 SIGTERM 之外的任何信号,我假设这是我退出程序的信号。

我已经确定这两个读取来自 std::getline 调用,当找不到分隔符时读取两次(因为分隔符不正确并且在字符串中没有位置,所以没有找到它,但是我无法修复它,因为它在我无法控制的库中)。在字符串中添加分隔符似乎可以防止第二次读取,从而导致代码运行没有问题。

我也肯定代码中存在一些竞争条件,因为当我关闭并行性时,不会发生此错误。我的一个疯狂猜测是在线程上下文切换期间读取被中断,但这只是一个疯狂的猜测,strace 中没有任何内容表明这是真的。此外,我不确定为什么它不会在重新切换后简单地重新启动。不过,我找不到比赛条件,我希望了解 strace 和 ERESTARTSYS 可以帮助我找出错误在哪里是。

如果有帮助,我正在 RHEL5 上运行并使用 gcc 4.7.2 进行编译。

【问题讨论】:

  • 这很奇怪,因为ERESTARTSYS 应该只在内核中使用以进行透明处理。您的应用程序不应该看到它。

标签: c linux multithreading operating-system strace


【解决方案1】:

根据link,当 RHEL 系统上的 strace 中断读取时会发生这种情况。在我查看的代码中,结果显示读取只是挂起,等待输入,因为未找到 EOF 并且仍然有写入结束打开(由于竞争条件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多