open函数:打开一个已存在的文件或者创建一个新文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *filename,int flags,mode_t mode);
open函数将filename转换为一个文件描述符,并且返回描述符数字。
返回的描述符总是在进程中当前没有打开的最小描述符。
O_ RDONLY :只读
O_ WRONLY :只写
O_ RDWR :可读可写
flag参数可以是一个或多个更多位掩码
O_ CREAT:如果文件不存在,就创建它的一个截断的空文件
O_ TRUNC:如果文件已经存在,就截断它
O_ APPEND:在每次写操作前,设置文件位置到文件的结尾处
应用程序是通过分别调用read和write函数来执行输入和输出的
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t n);
ssize_t write(int fd,const void *buf,size_t n);
用RIO包健壮地读写
RIO包的实质:I/O包
RIO包提供的两种函数:
无缓冲的输入输出函数、带缓冲的输入函数(线程安全)
应用程序通过调用rioreadn和riowritten函数可以在存储器和文件之间直接传送数据
#include "csapp.h"
ssize_t rio_readn(int fd,void *usrbuf,size_t n);
ssize_t rio_writen(int fd,void *usrbuf,size_t n);
读取文件元数据
检索文件信息(元数据):应用程序能够通过调用stat和fstat函数
#include <unistd.h>
#include <sys/stat.h>
int stat(const char *filename,struct stat *buf);
int fstat(int fd,struct stat *buf);
stat函数以一个文件名作为输入,填写一个stat数据结构中的各个成员。
fstat函数以文件描述符而不是文件名作为输入。
st_ size成员包含了文件的字节数大小。
st_ mode成员则编码了文件访问许可位和文件类型。
文件类型包括:
普通文件:某种类型的二进制或文本数据。
目录文件:关于其他文件的信息。
套接字:一种用来通过网络与其他进程通信的文件。
宏指令:根据st_mode成员来确定文件的类型
在sys/stat.h中定义:
S_ ISREG():这是一个普通文件吗?
S_ ISDIR():这是一个目录文件吗?
S_ ISSOCK():这是一个网络套接字吗?
Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
unix> ls > foo.txt
标准I/O
标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构的指针。每个ANSIC程序开始都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出、标准错误。
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;