3

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

我知道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并且返回值始终是-1or len

4

1 回答 1

1

是的。

任何基于数据报的接口(即,您传递给的大小write对执行此操作的人可见read)必须是原子的。没有其他方法可以保证该财产。

因此SOCK_SEQPACKET, 以及SOCK_DGRAM, 必须是原子的才能起作用。

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

于 2017-09-22T12:22:36.423 回答