总结《Linux高性能服务器编程》第六章
pipe函数可用于创建一个管道,以实现进程间通信,pipe函数的定义如下
#include<unistd.h>
int pipe(int fd[2]);
通过pipe函数创建的这两个文件描述符fd[0]和fd[1]分别构成管道的两端,往fd[1]写入的数据可以从fd[0]读出,并且fd[0]只能从管道读出数据,fd[1]则只能往管道写入数据,而不能反过来使用;
管道内部传输的数据是字节流,且管道本身拥有容量限制;
socketpair函数能够方便地创建双向管道;
#include<sys/types.h>
#include<sys/socket.h>
int socketpair(int domain,int type,int protocol,int fd[2]);
用于复制文件描述符的dup或dup2函数:把标准输入重定向到一个文件,或者把标准输出重
定向到一个网络连接;
#include<unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one,int file_descriptor_two);
通过dup和dup2创建的文件描述符并不继承原文件描述符的属性,比如close-on-exec和non-blocking等;
代码清单6-1 用dup函数实现CGI服务器原理
readv函数:将数据从文件描述符读到分散的内存块中,即分散读;
writev函数:将多块分散的内存数据一并写入文件描述符中,即集中写;
#include<sys/uio.h>
size_t readv(int fd, const struct iovec*vector,int count);
size_t writev(int fd, const struct iovec*vector,int count);
sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,被称为零拷贝;
#include<sys/sendfile.h>
size_t sendfile(int out_fd,int in_fd,off_t*offset,size_t count);
mmap函数用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中,munmap函数则释放由mmap创建的这段内存空间;
#include<sys/mman.h>
void* mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void*start,size_t length);
splice函数用于在两个文件描述符之间移动数据,是零拷贝操作;
#include<fcntl.h>
size_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags);
使用splice函数时,fd_in和fd_out必须至少有一个是管道文件描述符;
tee函数在两个管道文件描述符之间复制数据,是零拷贝操作;
#include<fcntl.h>
size_t tee(int fd_in,int fd_out,size_t len,unsigned int flags);
fcntl函数(file control)提供了对文件描述符的各种控制操作;
#include<fcntl.h>
int fcntl(int fd,int cmd,…);