打开文件:
int open(const char *pathlname, int flags);
int open(const char *pathname, int flags, mode_t mode);
第一个参数:路径名称(文件名),
第二个参数:标志位,本质是个整形数字,O_表示or ,flags是一个32位的整形,其中必须有且只有以下常数中的一个(必选项)
O_RDONLY----------只读打开
O_WRONLY---------只写打开
O_RDWR -----------可读可写打开
以下选项可指定0个或多个,和必选项按位或起来作为flags参数
O_APPEND--------------------追加至文件尾
O_CREAT----------------------若文件不在则创建,使用时需提供第三个参数,表示访问权限
O_EXCL------------------------若同时指定了O_CREAT,并且文件已存在,则出错返回
O_TRUNC---------------------若文件已存在,且以只写或可读可写方式打开,则将其长度截断为0字节
O_NONBLOCK----------------对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/O)
读取文件:
ssize_t read(int fd, void *buf, size_t count);
read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中,如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料
成功时返回读取到的字节数(为零表示读到文件描述符)
写入文件:
ssize_t write(int fd, const void *buf, size_t count);
write 向文件描述符 fd 所引用的文件中写入 从 buf 开始的缓冲区中 count 字节的数据. POSIX规定,当使用了write()之后再使用read(),那么读取到的应该是更新后的数据. 但请注意并不是所有的文件系统都是 POSIX兼容的
成功时返回所写入的字节数(若为零则表示没有写入数据)
关闭文件:
int close(int fd);
close 关闭一个文件描述符,使它不在指向任何文件和可以在新的文件操作中被再次使用,任何与此文件 相关联的以及程序所拥有的锁,都会被删除(忽略那些持有锁的文件描述符)假如fd是最后 一个 文件描述符与此资源相关联,则这个资源将被释放.若此描述符是最后一个引用到此文件上的,则文件用unlink删除
close 返回 0 表示 成功 , 或者 -1 表示 有 错误 发生
移动文件指针:
主要用来移动文件指针, 也有拓展文件,获取文件大小的功能
拓展文件:
off_t lseek(int fd, off_t offset, int whence);
offset------------------文件偏移量
whence----------------文件参照位置,有以下3个参数
SEEK_SET------------文件起始位置
SEEK_CUR-----------文件当前位置
SEEK_END-----------文件末尾
lseek 将以whence为基准偏移offset来扩展文件
lseek需配合write函数进行写入,才会真正扩展文件
获取文件大小
lseek(fd, 0, SEEK_END) 可以知道文件有多少个字节
od -tcx flie -----------以16进制显示二进制文件内容
od -tcd file-----------以10进制显示二进制文件内容
文件描述符与FILE结构体:
文件流指针和文件描述符的关系: 文件流指针结构体中包含了文件描述符的成员变量,PCB里有一个files_struct结构体指针,里面有一个文件描述符数组,记录了打开的文件描述符编号,(实际上是一个数组下标),它指向真正的文件