开始本章学习之前了解一些概念:
1、带缓存和不带缓存IO
参考
系统调用,用户程序通过系统级别API调用系统函数将请求传递给内核。无缓存的IO表示在用户层没有缓存,每次读写都需要调用系统函数,频繁调用系统函数效率是比较低的。但值得注意的是,并不是说调用了系统函数就会将数据写道磁盘,这样效率会更低,内核中有缓冲存储器,只有数据满了时才会写道磁盘。同理,为了不让每次读写操作都直接调用系统函数,将内容写道用户设置的缓存区中,有三种常用缓存:
- 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。
- 行缓存。当输入输出遇到新行符或缓存满时,才由标准I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。
- 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。
带缓存IO也叫标准IO,目的就是减少调用read和write的次数。举个例子,写数据到文件上,内核缓存(注意这个不是用户层缓存区)区长度是100字节,我们调用不带缓存的IO函数write()就要调用10次(加入每次10字节),这样系统效率低,现在我们在用户层建立另一个缓存区(用户层缓存区或者叫流缓存),假设流缓存的长度是50字节,我们用标准C库函数的fwrite()将数据写入到这个流缓存区里面,流缓存区满50字节后在进入内核缓存区,此时再调用系统函数write()将数据写入到文件(实质是磁盘)上,看到这里,你用该明白一点,标准IO操作fwrite()最后还是要掉用无缓存IO操作write,这里进行了两次调用fwrite()写100字节也就是进行两次系统调用write()。
0、open close函数
1、lseek函数
文件偏移量概念,每个文件打开的位置和当前内容位置为偏移量,
off_t lseek(int filedes, off_t offset, int whence); 返回值:新的偏移量(成功),-1(失败)
参数 offset 的含义取决于参数 whence
1. 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。
2. 如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo 加上 offset,
offset 可以为正也可以为负。
3. 如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,
offset 可以为正也可以为负。
SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。
lseek 的以下用法返回当前的偏移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。
2、read write函数
3、文件原子操作待理解
4、复制文件描述符
dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下:
#include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd )
利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。
int oldfd;
oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );
本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。任何写到stdout的东西,现在都将改为写入名为“app_log”的文件中。需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。
5、sync、fsync、fdatasync
我们知道,内核中设有高速缓存或页高速缓存,大多数磁盘IO都通过缓冲区进行。也叫延迟写,当内核需要重用缓冲区时,会先把缓存中的数据写入磁盘,避免丢失,要用到上面几个函数。
6、fcntl
学习
主要有以下功能: