写入SOCK_SEQPACKET原子?

时间:2017-09-22 10:44:47

标签: linux ipc atomic socketpair

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

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

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

我查看了Linux手册,发现了pipe()的内容,其中说len小于PIPE_BUFwrite/writev是原子的。

我对socketpair一无所知。我编写了一个测试代码,发现似乎SOCK_SEQPACKET是原子的,我将随机长度缓冲区写入fd,返回值始终为-1len

1 个答案:

答案 0 :(得分:1)

任何基于数据报的接口(即 - 传递给write的大小对于read的人来说是可见的)必须是原子的。没有其他方法可以保证财产。

所以SOCK_SEQPACKET以及SOCK_DGRAM必须是原子才能运作。

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