> 文章列表 > 10.系统级I/O

10.系统级I/O

10.系统级I/O

1.基础

所有的I/O设备被模型化为文件,所有的输入和输出被当作相应文件的读和写来执行
应用程序在文件结尾检测到EOF(end of file)条件

文本文件是只含有ASCII或Unicode字符的普通文件
二进制文件是所有的其他文件
对于内核,文本文件和二进制文件没有区别

目录是包含一组链接的文件

int open(char *filename, int flags, mode_t mode);
flags指明如何访问:只读、只写、可读可写
flags也可以通过更多位掩码的或,为写提供更多额外提示:不存在就创建、存在就截断、append
mode指定访问权限:使用者/团队成员/任何人+读/写/执行

read、write传送的字节比程序要求的少,不足值的原因:
读时遇到EOF
从终端读文本行
读写网络套接字(socket)

文件的元数据(metadata):文件的信息
int stat(const char *filename, struct stat *buf);
int fstat(int fs, struct stat *buf);
stat以文件名作为输入
fstat以文件描述符作为输入
stat结构:如st_mode(文件访问许可位和文件类型)、st_size(文件的字节数)

DIR *opendir(const char *name);
以路径名作为参数,返回指向目录流的指针
流是对条目有序列表的抽象

2.共享文件

描述符表:表项由进程打开的文件描述符索引
文件表:打开文件的集合,所有进程共享,refcnt为引用次数
关闭一个描述符会减少相应的文件表表项的refcnt,内核不会删除这个文件表表项,直到refcnt=0
(类似于智能指针)
v-node表:包含stat结构的大多信息

子进程有一个父进程描述表的副本,共享文件表集合,共享相同的文件位置。
内核删除相应文件表表项前,父子进程必须都关闭描述符

3.I/O重定向

int dup2(int oldfd, int newfd);
复制描述表表项oldfd到newfd,覆盖newfd以前的内容
dup2(4,1);

4.标准I/O

标准I/O库将一个打开的文件模型化为一个流,如fstream
对于程序员,一个流就是一个指向FILE类型的结构的指针
类型为FILE的流是对文件描述符和流缓冲区的抽象