【问题标题】:Is write to SOCK_SEQPACKET atomic?写入 SOCK_SEQPACKET 是原子的吗?
【发布时间】:2018-03-03 22:09:23
【问题描述】:

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

我知道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,返回值始终为-1len

【问题讨论】:

    标签: linux ipc atomic socketpair


    【解决方案1】:

    是的。

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

    所以SOCK_SEQPACKETSOCK_DGRAM 必须是原子的才能起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2016-07-08
      相关资源
      最近更新 更多