c - 为什么 strace 显示 ERESTARTSYS 供读取?

标签 c linux multithreading operating-system strace

我有一个多线程程序,当通过 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/

相关文章:

linux - 当缺少 dpkg 架构时,如何区分 linux 上的 mips cpu 类型?

php - C中的多线程程序 : calculating thread stack space

C# WinForms 等待表单继续

c - mac 的 win32 等价物是什么?

linux - 如何在 Linux 上更改包含特定字符串的所有目录/文件的名称

linux - 显示文件中正则表达式超过 'n' 次的行

java - 如何控制一个Spring应用中有多少个线程?

c - 为什么我的 timefd 上的 epoll 没有按预期工作?

c - 使用 .c=.o 和 $< 理解 Makefile

c - 编译内核模块时如何解决函数名冲突