文件I/O
1.1 C标准函数与系统函数的区别
1.1.1 I/O缓冲区
每一个FILE文件流都有一个缓冲区buffer,默认大小8192Byte。
1.1.2 效率
1.1.3 程序的跨平台性
事实上Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓
冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接
写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于
进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数
据从进程B也能读到,而C标准库的I/O缓冲区则不具有这一特性(想一想为什么)。
第1章 文件I/O
1.2 PCB概念
1.2.1 task_struct结构体
/usr/src/linux-headers/include/linux/sched.h
1.2.2 files_struct结构体
1.3 open/close
图 1.2: open
1.3.1 文件描述符
一个进程默认打开3个文件描述符
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
新打开文件返回文件描述符表中未使用的最小文件描述符。
open函数可以打开或创建一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
在Man Page中open函数有两种形式,一种带两个参数,一种带三个参数,其实在C代码
中open函数是这样声明的:
1.3节 open/close 3
int open(const char *pathname, int flags, ...);
最后的可变参数可以是0个或1个,由flags参数中的标志位决定,见下面的详细说明。
pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也
可以是绝对路径。flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运
算符连接起来,所以这些常数的宏定义都以O_开头,表示or。
必选项:以下三个常数中必须指定一个,且仅允许指定一个。
* O_RDONLY 只读打开
* O_WRONLY 只写打开
* O_RDWR 可读可写打开
以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。可选项有很多,
这里只介绍一部分,其它选项可参考open(2)的Man Page:
* O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾
而不覆盖原来的内容。
* O_CREAT 若此文件不存在则创
1.1 C标准函数与系统函数的区别
1.1.1 I/O缓冲区
每一个FILE文件流都有一个缓冲区buffer,默认大小8192Byte。
1.1.2 效率
1.1.3 程序的跨平台性
事实上Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓
冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接
写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于
进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数
据从进程B也能读到,而C标准库的I/O缓冲区则不具有这一特性(想一想为什么)。
第1章 文件I/O
1.2 PCB概念
1.2.1 task_struct结构体
/usr/src/linux-headers/include/linux/sched.h
1.2.2 files_struct结构体
1.3 open/close
图 1.2: open
1.3.1 文件描述符
一个进程默认打开3个文件描述符
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
新打开文件返回文件描述符表中未使用的最小文件描述符。
open函数可以打开或创建一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
在Man Page中open函数有两种形式,一种带两个参数,一种带三个参数,其实在C代码
中open函数是这样声明的:
1.3节 open/close 3
int open(const char *pathname, int flags, ...);
最后的可变参数可以是0个或1个,由flags参数中的标志位决定,见下面的详细说明。
pathname参数是要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也
可以是绝对路径。flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运
算符连接起来,所以这些常数的宏定义都以O_开头,表示or。
必选项:以下三个常数中必须指定一个,且仅允许指定一个。
* O_RDONLY 只读打开
* O_WRONLY 只写打开
* O_RDWR 可读可写打开
以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数。可选项有很多,
这里只介绍一部分,其它选项可参考open(2)的Man Page:
* O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾
而不覆盖原来的内容。
* O_CREAT 若此文件不存在则创