写入 SOCK_SEQPACKET 是原子的吗?
Is write to SOCK_SEQPACKET atomic?
我的意思是原子是成功或失败,什么都不做。
我知道socketpair(AF_LOCAL, SOCK_STREAM)
不是原子的,如果多个processes/threads调用write(fd, buf, len)
,write()
的return值可能> 0 && < len
并导致数据乱序。
如果多个 processes/threads write(buf, len)
到 socketpair(AF_LOCAL, SOCK_SEQPACKET)
创建的 sock_fd
,它是原子的吗?
我查看了 Linux 手册,发现了一些关于 pipe()
的内容,它说如果 len
小于 PIPE_BUF
,则 write/writev
是原子的。
我没有找到任何关于 socketpair
的信息。我写了一个测试代码,发现 SOCK_SEQPACKET
似乎是原子的,我将随机长度缓冲区写入 fd
并且 return 值始终是 -1
或 len
.
是的。
任何基于数据报的接口(即 - 您传递给 write
的大小对执行 read
的人可见)必须是原子的。没有其他方法可以保证 属性.
因此 SOCK_SEQPACKET
以及 SOCK_DGRAM
必须是原子的才能运行。
出于同样的原因,SOCK_STREAM
没有这样的原子性保证。
我的意思是原子是成功或失败,什么都不做。
我知道socketpair(AF_LOCAL, SOCK_STREAM)
不是原子的,如果多个processes/threads调用write(fd, buf, len)
,write()
的return值可能> 0 && < len
并导致数据乱序。
如果多个 processes/threads write(buf, len)
到 socketpair(AF_LOCAL, SOCK_SEQPACKET)
创建的 sock_fd
,它是原子的吗?
我查看了 Linux 手册,发现了一些关于 pipe()
的内容,它说如果 len
小于 PIPE_BUF
,则 write/writev
是原子的。
我没有找到任何关于 socketpair
的信息。我写了一个测试代码,发现 SOCK_SEQPACKET
似乎是原子的,我将随机长度缓冲区写入 fd
并且 return 值始终是 -1
或 len
.
是的。
任何基于数据报的接口(即 - 您传递给 write
的大小对执行 read
的人可见)必须是原子的。没有其他方法可以保证 属性.
因此 SOCK_SEQPACKET
以及 SOCK_DGRAM
必须是原子的才能运行。
出于同样的原因,SOCK_STREAM
没有这样的原子性保证。