1.open/close
- 函数原型:
- int open(const char *pathname,int flags);
- int open(const char *pathname,int flags,mode_t mode);
- 参数:
- flags
必选项:O_RDONLY,O_WRONLY,O_RDWR
-
可选项:
- 创建文件:O_CREAT
- 创建文件时检测文件是否存在:O_EXCL
- 如果文件存在,返回-1
- 必须与O_CREAT一起使用
- 追加文件:O_APPEND
- 文件截断:O_TRUNC
- 设置非阻塞:O_NONBLOCK
- 创建文件:O_CREAT
- mode
- mode&~umask(通常0002)
- flags
2.read
- 函数原型:ssize_t read(int fd,void *buf,size_t count);
- 参数:
- fd:open的返回值
- buf:缓冲区,存储要读取的数据
- count:缓冲区能存储的最大字节数sizeof(buf)
- 返回值:
- -1:失败
- 成功:
- >0:读出的字节数
- =0:文件已经读完了
- 参数:
3.write
- 函数原型:ssize_t write(int fd,const void *buf,size_t count);
- 参数:
- fd:open返回值
- buf:要写到文件的数据
- count:buf的有效字节数strlen(buf)
- 返回值:
- -1:失败
- >0:写入到文件的字节数
- 参数:
4.lseek
- 函数原型:off_t lseek(int fd,off_t offset,int whence);
- 使用:
- 文件指针移动到头部:lseek(fd,0,SEEK_SET)
- 获取文件指针当前位置:int len=lseek(fd,0,SEEK_CUR);
- 获取文件长度:int len=lseek(fd,0,SEEK_END);
- 文件扩展
- 文件原大小100k,拓展为1100k:lseek(fd,1000,SEE_END)
- 最后做一次写操作:write(fd,"a",1);
5.阻塞和非阻塞
- 阻塞和非阻塞是文件的属性还是read函数的属性?
- 文件的属性
- 普通文件:hello.c(默认不阻塞)
- 终端设备:/dev/tty、管道、套接字(默认阻塞)
6.stat
- 获取文件属性
- int stat(const char *path,struct stat *buf);
- int lstat(const char *path,struct stat *buf);
- lstat读取的链接文件本身的属性
- stat读取的是链接文件指向的文件的属性
7.access
测试当前用户指定文件是否具有某种属性
- 当前用户:使用那个用户调用这个函数,这个函数就是当前用户
- int access(const char *pathname,int mode)
参数:- pathname:文件名
- mode:4种权限
R_OK--读,W_OK--写,X_OK--执行,F_OK--文件是否存在
返回值: - 0:有某种权限,或者文件存在
- 1:没有,或文件不存在
8.chmod
修改文件权限
- int chmod(const char *filename,int mode)
参数:- filename:文件名
- mode:文件权限(八进制数)
9.chmod
修改文件所有者和所属组
- int chown(const char *path,uid_t owner,gid_t group)
参数:- path--文件路径
- owner--整形值,用户ID(/etc/passwd)
- group--组ID(/etc/group)
10.truncate
- int truncate(const char *path,off_t length);
参数:- path--文件名
- length--文件最终大小
- 比原来小,删掉后边的部分
- 比原来大,向后扩展
11.目录操作相关函数
12.目录遍历相关函数
13.dup、dup2
- int dup(int oldfd)
- oldfd:要复制的文件描述符
- 返回值:新的文件描述符
- dup调用成功:有两个文件描述符指向同一个文件
- 返回值:去最小的且没被占用的文件描述符
- int dup2(int oldfd,int newfd)
- 假设newfd已经指向了一个文件,首先断开close与那个文件的链接,newfd指向oldfd指向的文件
- newfd没有被占用,newfd执行oldfd指向的文件