文件IO
标准库IO函数和linux系统调用IO函数的区别:
-
标准C库的文件IO函数是跨平台的,在不同的平台上调用不同的系统API
-
标准C库的IO函数有缓冲区,而linux系统调用的没有缓冲区
因此,在网络通信时尽量使用系统调用提高效率,而在读写磁盘时尽量使用库函数减少读写次数
标准库函数和系统调用的关系是 调用与被调用 的关系
文件描述符
在PCB中有一个文件描述符表,记录这个进程打开的所有文件信息。一般默认大小是1024,有3个默认打开的文件:标准输入,标准输出,标准错误默认都是打开的状态,文件描述符分别是0,1,2。这三个文件都指向当前终端 /dev/tty
每次新打开一个文件都会分配一个最小的可分配的文件描述符。
对于同一个进程,可以对同一个文件打开多次,每次分配的文件描述符是不一样的
常用函数
1. 对文件的操作函数
-
open() 打开一个存在的文件 或者 创建一个新文件
-
close() 关闭一个打开的文件,文件描述符被释放掉
/* int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 参数: -pathname: 包括文件名的路径 -flags: O_WRONLY, O_RDONLY, O_RDWR, 可选项 O_APPEND O_CREAT, 用|连接 -mode: 若需要创建文件,则传入要创建的文件权限,八进制 例如0664 最终权限是 mode&~umask 不同的用户的umask是不同的,直接输入umask就能查看,可以自己设置 umask的作用就是抹去某些权限,使得权限更加合理 返回值: 调用失败返回-1,否则返回文件描述符 */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(){ int fd = open("a.txt", O_RDONLY); if(fd == -1){ perror("open: "); } close(fd); return 0; }
-
read() 读数据
-
write() 写数据
-
lseek()
-
stat()