对于高级I/O中一些函数的理解

 在Linux中IO分为基础和高级,在基础部分主要是read,write等函数,在高级IO中的一些函数不是非常常用,但是在内核使用中可能会进行编写。

高级IO分为三部分:1、用于创建文件描述符的函数,pipe,dup,dup2等

2、用于网络套接字编写时进行读写数据的函数,recv,send,sendfile,readv等

3,、用于控制IO行为和属性的函数

下面分别介绍:

pipe

该函数主要用于进程间通信,创建了一条管道,一个进程写数据,一个进程读数据,如果双方既想写也想读,就需要创建两个管道,因为默认创建的文件描述符是阻塞的。

值得注意的是,如果管道的读端没有进程在读数据,那么另一端就会写失败,这时会引发SIGPIPE信号,该进程引起错误,操作系统就会杀掉该进程,该进程就被挂掉。

管道里传输的是字节流,但是和TCP中的字节流是不一样的,管道具有容量限制,这是它本身自带的属性,而TCP一次能发送多少字节是根据对端的缓冲区决定的。

dup/dup2

该函数表示的是重定向,比如说将标准输入重定向到一个文件里,再或者将标准输出重定向到网络连接中。

原理:创建一个新的文件描述符,将新文件描述符 和旧文件描述符指向相同文件或者网络连接。

sendfile

该函数是在两个文件描述符之间进行操作,也就是在内核之间进行,效率较快,避免通过用户,被称为零拷贝。

函数原型为int sendfile(int in_fd,int out_fd,off_t* off_set,size_t count)

in_fd:待读取的内容的文件描述符

out_fd:待写入内容的文件描述符

off_set:从哪一段开始写,也就是偏移量,若设置为NULL,则表明从头开始编写

count:传输多少字节数

猜你喜欢

转载自blog.csdn.net/qq_36474990/article/details/81111107