文件I/O

来源:互联网 发布:网络套路是什么意思 编辑:程序博客网 时间:2024/06/07 18:55

APUE – 第三章 文件I/O
1. 综述
这一章里面描述的函数都是不带缓冲的I/O,不带缓冲的意思是每一个read或者write都调用内核中的一个系统调用。
对于内核而言,所有打开的文件都通过文件描述符(非负整数)引用,这个文件描述符是用来标识一个文件的。
UNIX系统shell把文件描述符0与进程的标准输入(STDIN_FILENO)相关联,1与标准输出(STDOUT_FILENO)相关联,2与标准错误(STDERR_FILENO)相关联。

int open(const char *path, int oflag, ...);

这个函数用来打开一个文件,返回此文件的描述符。
path参数用来指定名字(路径),oflag是如何打开这个文件,oflag是很多标识符或起来的结果:这些常量都在 fcntl.h 这个头文件中定义,并且都以O_开头,常见的几个为:O_RDONLY,O_WRONLY,O_RDWR,O_APPEND等等。看到这些英文单词我们就能知道这些常量的作用。

int creat(const char* path, mode_t mode);

这个函数用来创建一个文件,其中mode参数是访问权限。

int close(int fd);

这个函数用来关闭一个文件。

off_t lseek(int fd, off_t offset, int whence);

每个文件都有一个当前文件偏移量(用来度量从文件开始处计算的字节数),上面有一个常量为O_APPEND,如果不指定这个常量,那么当写此文件时会覆写该文件(偏移量为0是默认的)。
这个函数就是用来显式指定偏移量的。
whence这个参数有三个可选项:SEEK_SET(直接指定偏移量offset),SEEK_CUR(偏移量 += offset),SEEK_END(偏移量 = 文件长度 + offset)。返回值为新的偏移量。

ssize_t read(int fd, void *buf, size_t nbytes);

这个函数用来从文件里面读取数据,返回读取到的字节数。nbytes是要求读的字节数,buf读取到的数据的开始地址,因为Linux里面一切都是文件,所以这个函数可以用来读取终端设备和套接字。

ssize_t write(int fd, const void *buf, size_t nbytes);

这个函数用来向文件里面写入数据,返回值是写入数据的字节数,通常跟nbytes相同,如果不同表示出错。

在使用read,write这两个函数时,我们需要设定一个数组来装载相关数据,这个数组的大小通常设置为pow(2,n),但是不能太小,最好大于32。

int dup(int fd); int dup2(int fd, int fd2);

这两个函数都是用来复制一个现有的文件描述符,两个函数都返回新的文件描述符,新的描述符和fd都共享同一个文件表项。