linux环境编程:Linux文件i/o编程之open和openat函数

相比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 &~ umask

fd参数 :与路径相关的一个参数

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.结果:

猜你喜欢

转载自blog.csdn.net/T19900/article/details/129786303
今日推荐