使用socketpair
进行通信时,操作系统是否提供任何类型的缓冲区?即,如果我这样做
int sv[2];
socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);
在write(sv[0], ...)
发生之前,会阻止read(sv[1], ...)
阻止吗?或者,即使在read
发生write
时未发生{{1}},也会将一些数据存储在操作系统中的某个位置?
答案 0 :(得分:1)
socketpair
套接字在C中没有缓冲,就像STDIO
缓存fopen
一样。但是,您的操作系统中有一个缓冲区。可以使用setsockopt
使用SO_SNDBUF
设置缓冲区大小,并使用SO_RCVBUF
进行发送和接收,就像任何普通套接字一样。默认值取决于操作系统。 man -s7 socket
会在这里提供帮助。
缓冲可能略微依赖于套接字类型。例如,我认为使用数据报套接字可以保证原子性。在大多数(所有?)POSIX操作系统中,唯一可用的地址族是AF_UNIX
。我相信你可以使用SOCK_STREAM
或SOCK_DGRAM
,缓冲技术取决于你选择哪一个。如果使用超过可用缓冲区大小(因为数据报是以原子方式传输),SOCK_DGRAM
将从内存中失败,而SOCK_STREAM
将阻塞;在依赖之前我会检查一下。