1. pip函数
pip函数用于创建一个管道,用于进程间通信
#include <unistd.h>
int pip(fd[2]);
参数为包含两个 int 型整数的数组指针;
两个文件描述符fd[0] 和 fd[1] 构成管道的两端,一端读一端写,单向;若双向通信,使用两个管道;
2. dup 和 dup2 函数
把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接;
#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one,int file_descriptor_two);
dup函数创建一个新的文件描述符,与原有文件描述符 file_descriptor 指向相同的文件、管道或者网络连接
dup 返回的文件描述符总是取系统当前可用的最小整数值;
dup2返回第一个不小于 file_descriptor_two 的整数值
3. readv 函数和 writev 函数
readv 函数将数据从文件描述符读到分散的内存块中,即分散读;
writev 函数则多块分散的内存数据一并写入文件描述符中,即集中写;
#include <sys/uio.h>
ssize_t readv(int fd,const struct iovec* vector,int count);
ssize_t writev(int fd,const struct iovec* vector,int count);
- fd参数:被操作的目标文件描述符
- vector: iovec结构数组,描述一块内存区
- count : 数组长度,即多少块内存数据从 fd 读出或写到 fd
4. sendfile 函数
sendfile 函数使用零拷贝技术,在两个文件描述符间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高
为在网络上传输文件而设计
#include <sys/sendfile.h>
ssize_t senfile(int out_fd,int in_fd,off_t* offset,ssize_t count);
- in_fd : 待读出内容的文件描述符
必须是一个真实文件 - out_fd : 待写入内容的文件描述符
必须是一个 socket - offset : 指定从读入文件流的哪个位置开始读
- count : 指定传输字节数
5. splice 函数
用于在连个文件描述符之间移动数据,也是零拷贝操作
#include <fcntl.h>
ssize_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, ssize_t len,unsigned int flags)
-
fd_in : 待输入数据的文件描述符
-
fd_out : 待输出数据为文件描述符
必须至少一个是管道文件描述符
-
len : 指定移动数据的长度
-
flags : 控制数据如何移动
6. tee 函数
在两个管道文件描述符之间赋复制数据,也是领拷贝操作。它不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, ssize_t len,unsigned int flags );
7. fcntl 函数
提供对文件描述符的各种控制操作;
#include <fcntl.h>
int fcntl(int fd, int cmd, ... );
在网络编程中, fcntl 函数通常用来将一个文件描述符设置为非阻塞的
int setnonblocking(int fd){
int old_option = fcntl(fd, F_GETFL);//获取文件描述符旧的状态标志
int new_option = old_option | O_NONBLOCK;//设置非阻塞标志
fcntl(fd, F_SETFL, new_option );
return old_option;//返回文件描述符旧的状态标志,以便日后恢复该状态标志
}