相关疑难解决方法(0)

成功发送send()"原子"吗?

成功调用send()并返回的数字等于size参数中指定的数量,是否保证不会发生"部分发送"?

或者有什么方法可以在服务系统调用时中断操作系统,发送部分数据,等待可能很长时间,然后发送其余的并返回而不通知我更小的返回值?

我不是在讨论内核缓冲区空间不足的情况; 我意识到我会得到一个较小的返回值,并且必须再试一次.

更新: 根据目前为止的答案,我的问题可以改写如下:

在调用send()之前,有没有办法通过线路发送数据包/数据?

sockets tcp atomicity

4
推荐指数
1
解决办法
2080
查看次数

为什么strace显示ERESTARTSYS用于读取?

我有一个多线程程序,在运行时会strace显示:

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

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

read(10, "lorem ipsum...", 100) = 100
read(10, "", 8191) = 0
...
exit_group(0)
Run Code Online (Sandbox Code Playgroud)

纵观strace 手册页(对于strace的,是不是我的版本),并像这样的问题这个这个,似乎读出被一些信号中断.我可能误解了文档,但除了SIGTERM之外我没有看到任何信号,我假设是退出该程序.

我已经确定这两个读取来自std :: getline调用,当找不到定界符时它会读取两次(由于分隔符不正确而且字符串中没有任何内容,因此找不到它,但我不能修复它,因为它在一个我无法控制的库中.将分隔符添加到字符串似乎会阻止第二次读取,这会导致代码运行没有问题.

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

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

c linux multithreading operating-system strace

2
推荐指数
1
解决办法
4103
查看次数

标签 统计

atomicity ×1

c ×1

linux ×1

multithreading ×1

operating-system ×1

sockets ×1

strace ×1

tcp ×1