我有一个多线程程序,当通过 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)
查看 strace
manpage (对于不是我的版本的 strace)和类似 this 的问题和 this ,似乎读取被某些信号打断了。我可能误解了文档,但除了 SIGTERM 之外我没有看到任何信号,我假设这是我退出程序的信号。
我已经确定这两次读取来自 std::getline 调用,当未找到分隔符时它会读取两次(未找到它是因为分隔符不正确且在字符串中无处可寻,但我无法修复它,因为它在我无法控制的库中)。将分隔符添加到字符串似乎可以防止第二次读取,这会导致代码运行没有问题。
我也肯定代码中存在一些竞争条件,因为当我关闭并行性时,不会发生此错误。我的一个疯狂猜测是读取在线程上下文切换期间被中断,但这只是一个疯狂的猜测,strace 中没有任何内容表明这是真的。此外,我不确定为什么它在切换回后不会简单地重新启动。不过我找不到竞争条件,我希望了解 strace 和 ERESTARTSYS 可以帮助我找出错误所在是。
如果有帮助,我正在 RHEL5 上运行并使用 gcc 4.7.2 进行编译。
最佳答案
根据这个link ,当读取被 RHEL 系统上的 strace 中断时会发生这种情况。在我查看的代码中,结果是读取只是挂起,等待输入,因为没有找到 EOF 并且因为仍有写端打开(由于竞争条件)。
关于c - 为什么 strace 显示 ERESTARTSYS 供读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212866/