Unix I/O
使得所有的输入和输出都能以一种统一且一致的方式来执行;
1.打开文件 :
标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2);
2.改变当前的文件位置;
3.读写文件
打开和关闭文件
open函数将filename转换为一个文件描述符,并且返回描述符数字(返回的文件描述符总是在进程中当前没有打开的最小描述符)。
int open(char * filename, int flags, mode_t mode)
flags参数:
- - O_RDONLY:只读
- - O_WRONLY:只写
- - O_RDWR:可读可写
mode参数定义文件的访问权限位
读和写文件
read (int fd, void *buf, size_t n)(返回:若成功,则为读的字节数,若EOF则为0,若出错则为-1)
write(int fd, const void *buf, size_t n)(返回:若成功则为写的字节数,若出错则为-1)
用RIO包健壮的读写
无缓冲的输入输出函数
rio_readn(int fd, void *usrbuf, size_t n)
rio_writen(int fd, void *usrbuf, size_t n)
返回:若成功则为传送的字节数,若EOF则为0<只对readn而言>,若出错则为-1;
带缓冲的输入输出函数
rio_readinitb(rio_t *rp, int fd)
返回:无
rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
rio_readnb(rio_t *rp, void *usrtuf, size_t n);
返回:若成功则为读的字节数,若EOF则为0,若出错则为-1.
RIO读程序的核心是rio_read函数。
读取文件元数据
应用程序通过调用stat和fstat函数,检索到关于文件的信息(元数据)。
int stat(const char *fliename, struct stat *buf);
int fstat(int fd, struct stat *buf);
返回:若成功则为0.若出错则为-1
共享文件
描述符表、文件表、V-node表
I/O重定向
方法一:使用dup2函数
dup2函数拷贝了描述符表表项oldfd到描述符表项newfd,覆盖描述符表项newfd的内容。若果newfd已经打开了,dup2会拷贝oldfd之前关闭newfd.
标准的I/O
标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构指针,。stdin\stdout\stdeer分别对应标准输入、标准输出、标准错误。
extern FLIE *stdin
extern FILE *stdout
extern FILE *stderr
类型为FILE的流是对文件描述符和流缓冲区的抽象。
我的问题:
1.PS:作业题中有一个返回未打开的最小描述符为什么是3?
2.对dup2函数的工作原理不理解。
资料参考来自:《深入理解计算机系统》