文章目录
1、用于创建文件描述符的函数
1.1、pip函数
pipe
创建管道来实现进程间通信
#include <unistd.h>
int pipe(int fd[2]);
使用pipe
创建的管道使用两个文件描述符fd[0]
和fd[1]
来构成管道的两端,fd[0]只能用于从管道中读出数据,fd[1]
只能向管道中写入数据
- 要实现双向的数据传输,则要使用两个管道
- 管道默认的容量限制为65336B,但是可以用
fcntl
来修改管道容量。
1.2、双向管道
使用socketpair
创建的双向管道既可读也可以写
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int fd[2]);
//domain只能使用AF_UNIX
//type 指出服务类型,主要有SOCK_STREAM流服务(TCP)和SOCK_UGRAM数据报(UDP)
//protocol几乎所有情况下设置为0
1.3、dup和dup2函数
dup
创建一个新的文件描述符,该新文件描述符指向与file_descriptor
相同的文件、管道或者网络
dup2
是将file_descriptor_two
指向与file_descriptor_one
相同的文件
#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one, int file_descriptor_two);
dup
总是返回系统中最小的可用文件描述符dup2
返回系统中第一个不小于file_descriptor_two
的值
2、数据读写函数
2.1 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表示vector的长度
//成功时返回读出/写入的字节数,失败返回-1
2.2、sendfile函数
sendfile
函数实现了两个文件描述符之间直接传递数据(完全在内核之中操作),避免了用户缓冲区以及内核缓冲区之间的数据拷贝,这也被称为零拷贝。
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t* offset, int count);
//out_fd, in_fd分别代表待写入文件描述符和待读出文件描述符
//offset指出了读出的位置
//count指定了传输的字节数
2.3、mmap函数和munmap函数
mmap
函数用于申请一段内存空间,munmap
则用于释放这一段空间。这段空间主要用作进程间通信的共享内存
#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);
//start指的是这段内存的起始地址
//length指定了内存块的长度
//prot设置内存段的访问权限
//flags参数指定了内存段内容被修改后程序的行为
//fd是被映射文件对应的文件描述符
//offset设置从文件何处开始映射
//mmap成功返回指向目标内存区域的指针,失败返回MAP_FILED并设置error
//munmap成功返回0,失败返回-1并设置error
start
为NULL
则自动分配地址
2.4、splice函数
splice
函数用于在两个文件描述符之间移动数据,也是零拷贝操作。
#include <fcntl.h>
ssize_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out,
size_t len, unsigned int flags);
//fd_in是待输入数据的文件描述符
//len表示指定数据流的长度
//flags表示控制数据如何流动
//调用成功返回移动字符的数量,失败返回-1并设置error
fd_in
是一个管道文件描述符,off_in
必须为NULL
,此时表示从输入数据流的当前偏移位置读入fd_in
不是一个管道文件描述符,off_in
不为NULL
,则它必须指出具体的偏移位置fd_out/off_out
的含义与fd_in/off_in
相同,但是指的是输出流
2.5 tee函数
tee
函数用于在两个管道文件描述符之间移动数据,也是零拷贝操作。
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);
//fd_in是待输入数据的文件描述符,fd_out是待输出数据的文件描述符
//成功返回复制的字节数量,失败返回-1并设置error
3、控制I/O行为和属性的函数
3.1、fcntl函数
#include <fcntl.h>
int fcntl(int fd, int cmd,...);
//fd是被操作的文件描述符,cmd代表操作类型
//成功时的返回值根据操作的不同而不同,失败返回-1并设置error