【问题标题】:Are read/writes to a socketpair completely synchronous or is there buffering?对套接字对的读/写是完全同步的还是有缓冲的?
【发布时间】:2014-02-08 18:03:50
【问题描述】:

在使用socketpair 进行通信时,操作系统是否提供任何类型的缓冲区?即,如果我这样做了

int sv[2];
socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);

在read(sv[1], ...) 也发生之前,write(sv[0], ...) 会阻塞吗?或者即使write 发生时没有发生read,也会在操作系统的某个位置存储一些数据?

【问题讨论】:

  • 有一个缓冲区。如果没有缓冲区,管道、fifos、socketpair 等将几乎毫无用处。 `我的猜测是缓冲区大小是 PIPE_BUF 字节,但我从未在任何地方看到明确记录。在任何情况下,如果您填充缓冲区,您将阻塞(如果非阻塞,则 EAGAIN 出错)。
  • 对于套接字,您可以通过setsockopt 设置缓冲区大小。

标签: c linux unix networking posix


【解决方案1】:

socketpair 套接字在 C 中没有缓冲,就像 STDIO 和 fopen 缓冲一样。但是,您的操作系统中有一个缓冲区。缓冲区大小可以通过setsockopt 设置,使用SO_SNDBUF 和SO_RCVBUF 进行发送和接收,就像任何普通套接字一样。默认值取决于操作系统。 man -s7 socket 将在这里提供帮助。

缓冲可能略微依赖于套接字类型。例如,我认为使用数据报套接字可以保证原子性。在大多数(全部?)POSIX 操作系统中,唯一可用的地址系列是AF_UNIX。我相信您可以使用SOCK_STREAM 或SOCK_DGRAM,缓冲技术将取决于您选择哪一个。如果您使用超过可用缓冲区大小(因为数据报以原子方式传输),SOCK_DGRAM 将在内存中失败,而SOCK_STREAM 将阻塞;我会在依赖它之前检查一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2021-01-14
    • 2017-07-31
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多