我的意思是原子是成功还是失败,无所作为。
我知道socketpair(AF_LOCAL, SOCK_STREAM)
不是原子的,如果多个进程/线程调用write(fd, buf, len)
,则write()
的返回值可能是> 0 && < len
并导致数据困惑。
如果将多个进程/线程write(buf, len)
转换为sock_fd
创建的socketpair(AF_LOCAL, SOCK_SEQPACKET)
,那么它是原子的吗?
我查看了Linux手册,发现了有关pipe()
的内容,该内容表明len
小于PIPE_BUF
,而write/writev
是原子的。
我没有找到有关socketpair
的任何信息。我写了一个测试代码,发现SOCK_SEQPACKET
似乎是原子的,我在fd
中写了随机长度的缓冲区,返回值始终是-1
或len
。
最佳答案
是。
任何基于数据报的接口(interface)(即-传递给write
的大小对于执行read
的人都是可见的)必须是原子的。没有其他方法可以保证该属性(property)。
因此,SOCK_SEQPACKET
和SOCK_DGRAM
必须是原子的才能起作用。
出于同样的原因,SOCK_STREAM
没有这样的原子性保证。
关于linux - 是否写入SOCK_SEQPACKET原子?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46362854/