linux - 写入 SOCK_SEQPACKET 是原子的吗?

标签 linux ipc atomic socketpair

我的意思是原子是成功或失败,什么都不做。

我知道socketpair(AF_LOCAL, SOCK_STREAM)不是原子的,如果多个进程/线程调用write(fd, buf, len) , write() 的返回值也许> 0 && < len并导致数据乱序。

如果多个进程/线程write(buf, len)sock_fdsocketpair(AF_LOCAL, SOCK_SEQPACKET) 创建,它是原子的吗?

我查看了 Linux 手册,发现了一些关于 pipe() 的内容这表示如果len小于 PIPE_BUF , write/writev是原子的。

我没有找到关于 socketpair 的任何信息.我写了一个测试代码,发现好像SOCK_SEQPACKET是原子的,我将随机长度缓冲区写入 fd并且返回值始终为 -1len .

最佳答案

是的。

任何基于数据报的接口(interface)(即 - 您传递给 write 的大小对执行 read 的人可见)必须是原子的。没有其他方法可以保证该属性。

因此 SOCK_SEQPACKET 以及 SOCK_DGRAM 必须是原子的才能起作用。

出于同样的原因,SOCK_STREAM 没有这样的原子性保证。

关于linux - 写入 SOCK_SEQPACKET 是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362854/

相关文章:

java - Java 方法执行时间长

c - execv() 贵吗?

ipc - OPC 和 DDS 之间的区别?

java - 我应该使用原子整数还是同步

linux - 通过 crontab 启动脚本时 Python 请求挂起

linux - 复制在 2 个 SVN 版本之间更改的文件和文件夹

c++ - 在 strlen 函数中的 solaris vsnprintf 核心转储中有什么方法可以解决这个问题?

c++ - 使c++程序以交互方式将输入输出传递给windows命令提示符

c++ - 错误: use of deleted function ‘std::atomic<_Tp>::atomic() [with _Tp = node]’

java - "atomic"和 "synchronous"在编程中是同义词吗?