成功调用send()并返回的数字等于size参数中指定的数量,是否保证不会发生"部分发送"?
或者有什么方法可以在服务系统调用时中断操作系统,发送部分数据,等待可能很长时间,然后发送其余的并返回而不通知我更小的返回值?
我不是在讨论内核缓冲区空间不足的情况; 我意识到我会得到一个较小的返回值,并且必须再试一次.
更新: 根据目前为止的答案,我的问题可以改写如下:
在调用send()之前,有没有办法通过线路发送数据包/数据?
我有一个多线程程序,在运行时会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进行编译.