首先我们回忆一下,stdin&stdout&stderr
C默认会打开三个输出输入流,分别是stdin,stdout,stderr。且这三个流的类型都是FILE*,fopen返回值类型,文件指针
文件操作
文件操作的一般过程:
打开文件,打开成功后,应用程序将获得文件描述符;
应用程序使用文件描述符对文件进行读写等操作;
全部操作完毕后,应用程序需要将文件关闭以释放用于管理打开文件的内存;
一、open和openat函数:系统调用可以打开或创建一个文件
1、看一下open函数:
(图中create函数在下面讲解)
参数说明:
pathname:指向欲打开的文件路径字符串
flags :打开文件时,可以传入多个参数选项,用下面的一个或者多个常量(只列出了一部分)进行“或”运算,构成flags.(如下)
注:open函数具体使用那个,和具体场景有关。比如,目标文件不存在,需要open创建,则第三个参数表示文件的默认权限(默认权限请看文章第三点对umask的介绍点击打开链接)。
否则就使用两个参数即可。
返回值:
成功:新打开的文件描述符
失败:-1
2、看一下openat函数

可以看出来,参数dirfd将open函数和openat函数区分开来,共有三种可能性:
(1)path参数指定的是绝对路径名,在这种情况下,fd参数被忽略,openat函数相当于open函数
(2)path参数指定的是相对路径名,fd参数指出了相对路径名在文件系统中的开始地址。
fd参数是通过打开相对路径名所在的目录来获取。
(3)path参数指定了相对路径名,fd参数具有特殊值AF_FDCWD。在这种情况下,路径名在当前工作目录中获取,openat函数在操作上与open函数类似。
所以,openat函数是希望解决两个问题:
(1)让线程可以使用相对路径名打开目录中的文件
(2)可以避免time-of-check-of-use(TOCTTOU)错误。
二、函数creat-创建一个新文件
</