怕忘。
pipe函数
int pipe(int fd[2]);
返回值:
执行成功返回0,失败返回-1.
理解:
pipe创建的这两个文件描述符分别构成函数两端,往fd[1]中写的数据可以从fd[0]中读出,fd[0]只能用于从管道读数据,fd[1]只能用于往管道写数据。管道内部传输的时字节流,管道本身拥有一个容量的限制,fcntl函数可以修改管道容量。
dup和dup2函数
int dup(int fd);
int dup2(int fd1,fd2);
返回值 :
dup返回当前可用的最小的文件描述符,
理解 :
dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。
int fd = fopen(“zhuziyu.txt”, (O_RDWR | O_CREATE), 0664 );
dup2( fd, 1 );
close( fd );
往标准输入的内容会写入zhuziyu.txt
readv和writev函数
ssize_t readv(int fd , const struct iovec *vector , int count);
ssize_t writev(int fd , const struct iovec *vector , int count);
返回值:
返回读/写字数,出错返回-1
理解:iovec结构体描述一块内存区域,count代表数组长度。
sendfile函数
ssize_t sendfile(int out_fd,int in_fd,off_t * offset , size_t count);
返回值 : 返回传输的字节数,失败返回-1。
理解:从in_fd中的offset位置读出的字节数写入到out_fd中,count代表在两个文件描述符之间的传输的字节数。in_fd必须是一个指向真实文件的文件描述符,不能是socket和管道,out_fd必须是一个socket。
mmap函数和munmap函数
void * mmap(void *start , size_t length , int prot , int flags , int fd , off_t offset);
void munmap(void start , size_t length);
返回值:
mmap函数成功返回目标区域的指针,失败返回(void*)-1。
munmap函数成功返回0,失败返回-1。
理解:
start参数允许使用某个特定的地址作为这段内存的起始地址,如果是NULL,则系统自动分配一个地址。length制定内存段的长度,prot设置内存段的访问权限,flags用于控制内存段被修改后内存的行为,fd是被映射的文件描述符,offset表示从哪一处开始映射。共享内存可以使用它。
splice函数
ssize_t splice (int fd_in,loff_t off_in,int fd_out,loff_t off_out,size_t len,usigned int flags);
返回值:
移动的字节数,出错是-1。
理解:
fd_in时待输入数据的文件描述符,如果是一个管道描述符,off_in必须设置成NULL。fd_in不是管道描述符,那么off_in指出输入流具体偏移位置。len参数制定移动数据的长度,flags控制数据如何移动。fd_in和fd_out必须至少有一个管道文件描述符。
特点:用于在两个文件描述符之间移动数据,零拷贝操作。
tee函数
ssize_t tee(int fd_in,int fd_out,size_t len,usigned int flags);
返回值 :
两个文件描述符之间的复制数据量,出错返回-1。
理解 :在管道文件描述符之间复制数据,零拷贝操作。
fcntl函数
int fcntl(int fd , int cmd , …);
返回值:他的返回值比较复杂,额额。。
理解 : 对fd文件执行cmd操作。多余参数arg可选。