当使用socketpair进行通信时,操作系统是否提供任何类型的缓冲区?也就是说,如果我这样做了
int sv[2];
socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);在发生read(sv[1], ...)之前,write(sv[0], ...)是否会阻塞?或者,即使在发生write时没有发生read,也会将一些数据存储在操作系统中的某个位置吗?
发布于 2014-02-09 03:02:16
在C中,socketpair套接字没有缓冲,就像fopen中有STDIO缓冲一样。但是,您的操作系统中有一个缓冲区。缓冲区大小可以通过使用SO_SNDBUF和SO_RCVBUF的setsockopt来设置,就像任何普通套接字一样。默认值取决于操作系统。man -s7 socket将在这方面提供帮助。
缓冲可能稍微依赖于套接字类型。例如,我认为使用数据报套接字可以保证原子性。在大多数(所有?)POSIX操作系统唯一可用的地址族是AF_UNIX。我相信您可以使用SOCK_STREAM或SOCK_DGRAM,缓冲技术将取决于您选择哪种技术。在内存中,如果您使用的缓冲区大小超过了可用的缓冲区大小(因为数据报是以原子方式传输的),那么SOCK_DGRAM将简单地失败,而SOCK_STREAM将阻塞;在依赖它之前,我会对此进行检查。
https://stackoverflow.com/questions/21649753
复制相似问题