我的意思是原子是成功还是失败,什么也不做。
我知道socketpair(AF_LOCAL, SOCK_STREAM)
不是原子的,如果多个进程/线程调用write(fd, buf, len)
,write()
的返回值可能是> 0 && < len
并导致数据乱序。< / p>
如果由write(buf, len)
创建的多个进程/线程sock_fd
到socketpair(AF_LOCAL, SOCK_SEQPACKET)
,它是原子的吗?
我查看了Linux手册,发现了pipe()
的内容,其中说len
小于PIPE_BUF
,write/writev
是原子的。
我对socketpair
一无所知。我编写了一个测试代码,发现似乎SOCK_SEQPACKET
是原子的,我将随机长度缓冲区写入fd
,返回值始终为-1
或len
。
答案 0 :(得分:1)
是
任何基于数据报的接口(即 - 传递给write
的大小对于read
的人来说是可见的)必须是原子的。没有其他方法可以保证财产。
所以SOCK_SEQPACKET
以及SOCK_DGRAM
必须是原子才能运作。
出于同样的原因,SOCK_STREAM
没有这样的原子保证。