第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取代,不再介绍
posted @ 2022-01-12 21:24  MenciusYue  阅读(64)  评论(0)    收藏  举报