第3章------文件IO
第3章------文件IO
引言
对于unix系统来说,一切皆文件。但是常用的文件IO函数只有5个
- open
- read:不同缓冲长度对读会有影响
- write:不同缓冲长度对写会有影响
- lseek
- close
本章主要介绍的是不带缓冲的IO,它是posix的组成部分,但不是ISO C的组成部分。涉及到多个进程共享资源时,原子操作的概念就变得很重要,本章通过文件IO和open函数的参数讨论相关概念。随后会涉及到多进程如何共享文件,以及内核相关的数据结构。最后介绍dup,fcntl,sync,ioctl函数。
对于内核来说,所有打开的文件都可以通过文件描述符表示。文件描述符是一个非负整数,当打开或者创建一个文件时,内核会向进程返回一个文件描述符,该文件描述符还可以作为参数传给read或者write。在shell中,0代表标准输入,1代表标准输出,2代表标准错误,使用posix标准时,可以用STDIN_FILEON,STDOUT_FILEON和STDERR_FILEON表示,它们定义在<unistd.h>中。文件描述符的变化范围是0~OPEN_MAX-1。
函数
open和openat
//打开文件
#include<fcntl.h>
int open(const char* path,int flag,.../*mode_t mode*/);
int openat(int fd,const char* path,int flag,.../*mode_t mode*/);
path:
文件名
flag:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_EXEC 执行
O_SEARCH 搜索(应用于目录)
以上5中权限能且只能指定一个,下列是可选的。
O_APPEND,O_CLOEXEC,O_CREATE(搭配mode使用),O_DIRCETORY(不是目录出错),
O_EXCL(如果同时指定了O_CREATE,文件存在则出错,文件不存在则创建),
O_NONBLOCK(如果path引用的是FIFO,一块特殊文件或者字符特殊文件,则本次打开和后续的IO操作均为非阻塞。)
O_SYNC,O_TRUNC,O_TTY_INIT,O_DSYNC,O_RSYNC,O_NOCTTY,O_NOFOLLOW。
fd:
1.path是绝对路径时,fd被忽略,openat相当于open。
2.path是相对路径,fd是通过打开相对路径名所在目录获取的,fd指出了相对路径名在文件系统的开始地址。
3.path是相对路径,fd参数具有特殊值AT_FDCWD,路径名在当前工作目录中获取。openat和open类似。
return
成功:
文件描述符,且该文件描述符一定是最小未用的文件描述符值。
失败:
-1
openat主要想解决两个问题
1.线程可以使用相对路径打开目录中的文件,而不是只能打开当前工作目录。
2.避免TOCTTOU错误。time-of-check-to-time-of-use。有两个基于文件的函数调用,
第二个调用依赖于第一个调用的结果,那么程序是不可靠的,因为两个调用不是原子操作。
create
//创建新文件
#include<fcntl.h>
int create(const char* path,mode_t mode);
//这个函数太罗嗦,现在已经被open取代,不再介绍
浙公网安备 33010602011771号