第二章第二节 读写数据函数
readv与writev函数
readv函数将数据从文件描述符读到分散的内存块,即分散读;writev函数将多块分散的内存数据一并写入文件描述符,即集中写。
1 | /* |
根据HTTP响应报文格式,状态行、多个头部字段、1个空行与文档内容,文档内容通常与前面的内容是分开的;因此,可以使用writev函数将它们同时写出。
sendfile函数
sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区与用户缓冲区之间的数据拷贝,效率很高,这称为零拷贝。
1 | /* |
man 2 sendfile
明确指出:fd必须是支持mmap函数的文件描述符,必须指向真实的文件,不能是socket或管道;而out必须是一个socket。
mmap与munmap函数
mmap函数用于申请一段内存空间,这段内存可以用于进程间通信,也可以用于映射文件。munmap释放由mmap创建的内存空间。
1 | /* |
flags参数取某些值的按位或(除了MAR_SHARED与MAR_PRIVATE互斥外)。
1 | /* |
splice函数
splice函数用于在两个文件描述符之间移动数据,也是零拷贝操作。
1 | /* |
文件描述符in与out必须至少有一个是管道文件描述符。
tee函数
tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作。它不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作。
1 | /* |