相比open,openat允许使用相对目录打开文件
1、函数功能
打开或创建一个文件。
函数原型:
include<sys/stst.h>
#include<fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int openat(int fd, const char *pathname, int flags);
int openat(int fd, const char *pathname, int flags, mode_t mode);
函数的返回值:若成功,返回文件描述符; 若出错,返回-1
文件描述符:
当打开或创建文件时,内核将向进程返回一个非负整数表示的文件描述符。
函数参数:
pathname:要打开的文件名flags参数:必选项
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
flag参数:可选项O_APPEND 每次写时追加到文件的末尾
O_CREAT 若此文件不存在则创建它
O_EXCL 创建文件时检测文件是否存在,必须与O_CREAT一起使用
O_TRUNC 如果文件存在,而且只写或读写打开成功打开,则将其长度阶段为0
mode参数:mode &~ umaskfd参数 :与路径相关的一个参数
open和openat函数的区别:
如果path是绝对路径,则fd被忽略,openat等价于open。
如果path是相对路径,则fd表示相对路径在系统中的开始地址。
如果path是相对路径,且fd为AT_FDCWD,则相对路径的开始地址为当前工作目录。 openat的操作将与open类似。
引入openat是方便一个进程内的各线程可拥有不同的当前目录,传统的chdir会影响整个进程,而使用openat只需要每个线程在初始化时打开一个目录(调用open),然后就可以以openat在“当前目录”操作文件了,如:
int dirfd = open("/tmp"); // 相当于chdir到“/tmp”
int filefd = openat(dirfd, “myfile”); // 在/tmp目录下打开“myfile”文件
2、实验功能:
a.用openat打开指定目录下的文件
b.打开一个已经存在的文件
c.打开一个不存在的文件(需要指定第三个参数地址 fd1=open(argv[2],O_CREAT,0000000;)
3.实验代码:
#include<apue.h>
#include<fcntl.h>
#include<dirent.h>
int main (int argc,char *argv[])
{
int fd,fd1,fd3,daima;
/* opent配置*/
DIR *dir;
int fd4;
dir=opendir("test");
if(NULL==dir)
{
printf("open error");
return -1;
}
fd4=dirfd(dir);
/* opent配置*/
if(argc<2)
{
printf("./a.out不符合格式\n");
}
fd=open(argv[1],O_RDWR);//打开一个已经存在的文件
fd1=open(argv[2],O_CREAT,0000000);//文件不存在就创建它需要指定第三个参数地址
fd3=openat(fd4,argv[3],O_RDWR);//dirfd2需要配置
if(fd>0)
{
printf("成功打开一个存在的文件\n");
}
if(fd1>0)
{
printf("成功创建一个不存在文件\n");
}
if(fd3>0)
{
printf("成功打开指定目录下文件\n");
}
printf("fd=%d\n",fd);
printf("fd1=%d\n",fd1);
printf("fd3=%d\n",fd3);
close(fd);
close(fd1);
close(fd3);
exit(0);
}
dirfd
头文件:#include <dirent.h>
原型:int dirfd(DIR *dirp)
功能:返回参数dirp所指向的目录文件的文件描述符,该文件描述符的关闭应由函数closedir()执行
返回值:成功则返回一个整型文件描述符值,失败则返回-1并设置errno(失败的原因很可能是参数dirp指向的不是一个有效的目录
4.结果: