Linux下的文件I/O
1、基础知识
文件I/O:posix(可移植操作系统接口)定义的一组数组,
不提供缓冲机制,每次读写操作都引起系统调用,
核心概念是文件描述符,
可访问各种类型文件,
Linux下,标准I/O基于文件I/O实现。
文件描述符:文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符,
文件描述符从0开始分配,依次递增,
文件I/O操作通过文件描述符来完成。
2、文件I/O的相关函数
创建或者打开一个文件:
#include<fcntl.h>
int open(const char *path, int oflag, ...);
注:成功时返回文件描述符,出错时返回EOF;
打开文件时使用两个参数;
创建文件时第三个参数指定新文件的权限;
只能打开设备文件。
关闭打开的一个文件:
#include<unistd.h>
int close(int fd);
注:成功时返回0,出错时返回EOF;
程序结束时自动关闭所有打开的文件;
关闭文件后,文件描述符不再代表文件。
读取文件:
#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count);
注:成功时返回实际读取的字节数,出错时返回EOF;
读到文件末尾时返回0;
buf是接收数据的缓冲区;
count不应超过buf大小。
写入文件:
#include<unistd.h>
ssize_t write(int fd, void *buf, size_t count);
注:成功时返回实际写入的字节数,失败时返回EOF;
buf是发送数据的缓冲区;
count不应超过buf大小。
文件定位:
#include<unistd.h>
off_t lseek(int fd, off_t offset, int whence);
注:成功时返回当前文件的读写位置,出错时返回EOF;
参数whence : SEEK_SET/SEEK_CUR/SEEK_END;
参数offset:偏移量,可正可负。
打开一个目录文件:
#include<dirent.h>
DIR *opendir(const char *name);
注:DIR是用来描述一个打开的目录文件的结构体类型;
成功时返回目录流指针,出错时返回NULL。
读取目录流中的内容:
#include<dirent.h>
struct dirent *readdir(DIR *dirp);
注:struct dirent是用来描述目录流中一个目录项的结构体类型;
包含成员char d_name[256] 参考帮助文档;
成功时返回目录流dirp中下一个目录项;
出错或者到末尾时返回NULL。
关闭一个目录文件:
#include<dirent.h>
int closedir(DIR *dirp); 成功时返回0,出错时返回EOF。
修改文件访问权限:
#include<sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
注:成功时返回0,出错时返回EOF;
root和文件所有者能修改文件的访问权限。
获取文件属性:
#include<sys/stat.h>
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
注:成功时返回0,出错时返回EOF;
如果path是符号链接stat获取的是目标文件的属性,而lstat获取的是链接文件的属性。
struct stat是存放文件属性的结构体类型:
文件类型---st_mode
文件访问权限---st_mode