我的意思是原子是成功或失败,什么也不做。
我知道socketpair(AF_LOCAL, SOCK_STREAM)不是原子的,如果多个进程/线程调用write(fd, buf, len),那么write()的返回值可能是> 0 && < len并导致数据无序。
如果多个进程/线程write(buf, len)到由socketpair(AF_LOCAL, SOCK_SEQPACKET)创建的sock_fd,那么它是原子的吗?
我查看了Linux手册,发现了一些关于pipe()的东西,其中说如果len小于PIPE_BUF,那么write/writev是原子的。
我没有发现关于socketpair的任何东西。我编写了一个测试代码,发现SOCK_SEQPACKET似乎是原子的,我向fd写入随机长度缓冲区,返回值总是-1或len。
发布于 2017-09-22 12:22:36
是。
任何基于数据报的接口(即,传递给write的大小对执行read的人来说都是可见的)必须是原子的。没有其他办法来保证财产。
因此,SOCK_SEQPACKET和SOCK_DGRAM都必须是原子的,才能起作用。
出于同样的原因,SOCK_STREAM没有如此零散的保证。
https://stackoverflow.com/questions/46362854
复制相似问题