是对socketpair的读/写完全同步还是有缓冲?

时间:2014-02-08 18:03:51

标签: c linux unix networking posix

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

int sv[2];
socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);
write(sv[0], ...)发生之前,

会阻止read(sv[1], ...)阻止吗?或者,即使在read发生write时未发生{{1}},也会将一些数据存储在操作系统中的某个位置?

1 个答案:

答案 0 :(得分:1)

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

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