标签:
一个Unix文件就是一个m个字节的序列,所有的I/O设备,都被模型化为文件,而所有的输入和输出都被当作对应文件的读和写来执行。
这种简单优雅的方式叫做UnixI/O。
①打开文件 描述符:0,标准输入
1,标准输出
2,标准错误
②改变当前文件位置 初始为0,通过seek操作改变为K
③读写文件 从文件拷贝到存储器叫读;从存储器拷贝到文件叫写;end-of-file(EOF)。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。通过执行seek操作设置文件位置为k。
④关闭文件:内核释放文件打开时创建的数据结构。
打开:调用open函数来执行
open函数将filename转换为一个描述符,并且返回描述符数字;
flags参数也可以是一个或者更多位掩码;
mode参数指定了新文件的访问权位。
关闭:通过close函数的调用关闭一个打开的文件。
例如:打开:int open(char *filename,int flags,mode_t mode) (若成功则返回新文件描述符,若出错为-1)
关闭:int close(int fd)(若成功则为0,若出错则为-1)
读文件:read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值表示实际传送的字节数量,错误返回-1,EOF返回0。
写文件:write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。
通过调用rio _ readn和rio _ writen函数,应用程序可以在存储器和文件之间直接传送数
据。
打开每一个描述符都会调用一次rio _ readinitb函数,他将描述符fd和地址rp处的一个类型为rio _ t的读缓冲区联系起来。
带缓冲的函数的调用不应该和无缓冲的rio _ readn交叉使用。
应用程序能够通过调用stat和fstat函数,检索到关于文件的信息,即文件的元数据。
#include <unistd.h>
#include <sys/stat.h>
int stat(const char *filename,struct stat *buf);
int fstat(int fd,struct stat *buf);
返回:若成功则为0,若出错则为-1.
stat函数以一个文件名作为输入,并填写一个stat数据结构中的各个成员。
用三个相关的数据结构来表示打开的文件:
描述符表:表项由进程打开的文件描述符来索引的,每个打开的描述符表指向文件表中的一个表项,每个进程有其独立的描述符表。
文件表:所有进程共享,表项组成包括当前文件位置、引用计数、一个指向v-node表中对应表项的指针。引用计数为0时,内核会删除这个文件表表项。
v-node表:每个表项包含stat结构中的大多数信息,;包括st_mode和st_size成员,所有进程共享。
I/O重定向:使用dup2函数:
#include <unistd.h>
int dup2(int oidfd,int newfd);
返回:若成功则为非负的描述符,若出错则为-1
标准I/O库(libc):高级输入输出函数
#include <stdio.h>
extern FILE *stdin; /*标准输入,文件描述符为0*/
extern FILE *stdout; /*标准输出,文件描述符为1*/
extern FILE *stderr; /*标准错误,文件描述符为2*/
标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构指针。
参考资料来自闫佳歆同学
标签:
原文地址:http://www.cnblogs.com/20135335hs/p/4948825.html