Linux 高级I/O函数

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;//返回文件描述符旧的状态标志,以便日后恢复该状态标志
}

猜你喜欢

转载自blog.csdn.net/weixin_39554266/article/details/83506325