一、open函数

1、函数原型:int open(const char *path,int oflag,.../* mode_t mode */);

2、头文件:#include <fcntl.h>

3、参数说明:

(1)path:要打开或创建文件的名字;

(2)oflag:用下列一个或多个常量进行“或”运算构成oflag参数;

a、文件读写模式常量:

O_RDONLY:文件以只读方式打开;

O_WRONLY:文件以只写模式打开;

O_RDWR:文件以可读可写模式打开。

b、其他常用常量:

O_APPEND:追加模式打开,即当给已有文件进行写数据操作时,新数据会追加到原文件的末尾;

O_CREAT:若要操作的文件不存在,则会创建此文件,使用时需要同时指定第三个参数权限位;

O_EXCL:检测文件是否存在,若同时指定了O_CREAT,且文件存在,则会报错,若文件不存在,则创建此文件;

O_TRUNC:若文件存在,则在打开的同时会清空文件内容;

O_NOCTTY:若path引用的是终端设备,则不该将设备分配作为此进程的控制终端;

O_NONBLOCK:若path引用的是一个FIFO/一个块特殊文件/一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置为非阻塞模式。

c、同步输入输出:(目前没用到过,还不太清楚使用场景)

O_SYNC:使每次write等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需的I/O;

O_DSYNC:使每次write要等待物理I/O操作完成,但若该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更新;

O_RSYNC:使每一个以文件描述符作为参数进行的read操作等待,直至所有对文件同一部分挂起的写操作都完成。

4、示例:

 #include <stdio.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc,char *argv[])
{
int fd = open("test.txt",O_RDWR|O_CREAT|O_TRUNC,);
if (fd < )
perror("open");
else
printf("fd = %d\n",fd); close(fd); return ;
}

注意:open和close需要成对存在!

二、openat函数:

1、函数原型:int openat(int fd,const char *path,int oflag,.../* mode_t mode */);

2、头文件:#include <fcntl.h>

3、参数说明:

(1)fd:

相对于open函数,此函数多了一个fd参数,异同点如下:

a、若path指定的是绝对路径,fd参数被忽略,openat函数相当于open函数;

b、若path指定的是相对路径,fd参数指出了相对路径名在文件系统中的开始地址,fd参数是通过打开相对路径名所在的目录来获取;

c、path指定了相对路径名,fd参数具有特殊值AT_FDCWD.在此情况下,路径名在当前工作目录中获取,openat函数在操作上与open类似。

(2)其余参数与open一致,在此不重复。

4、使用示例:主要考虑fd的获取,打开目录一般是DIR *dirfp = opendir("./"),需要处理,考虑以下两种方式;

(1)利用 dirfd()函数将opendir返回的目录描述符转为int类型的文件描述符;

函数原型:int dirfd(DIR *dirp);

示例:

 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h> int main()
{
DIR *dir;
int dirfd2;
int fd;
int n; dir = opendir("./");
if(NULL == dir)
{
perror("open dir error");
return -;
}
dirfd2 = dirfd(dir);
if(- == dirfd2)
{
perror("dirfd error");
return -;
} fd = openat(dirfd2,"output.log",O_CREAT|O_RDWR|O_TRUNC,);
if(- == fd)
{
perror("opeat error");
return -;
}
n = write(fd,"Hello world!\n",); close(fd);
closedir(dir); return ; }

(2)直接用open打开一个目录,其返回值作为openat的第一个参数:

示例:

 #include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h> void creat_at(char *dir_path, char *relative_path)
{
int dir_fd;
int fd; dir_fd = open(dir_path, O_RDONLY);
if (dir_fd < )
{
perror("open");
exit(EXIT_FAILURE);
} fd = openat(dir_fd, relative_path, O_CREAT | O_TRUNC | O_RDWR, );
if (fd < )
{
perror("openat");
exit(EXIT_FAILURE);
} write(fd, "HELLO\n", ); close(fd);
close(dir_fd);
} int main()
{
creat_at("./", "log.txt");
return ;
}

文件I/O——文件打开函数(open/openat)的更多相关文章

  1. ubuntu Linux下C语言open函数打开或创建文件与read,write函数详细讲解

    open(打开文件) 相关函数 read,write,fcntl,close,link,stat,umask,unlink,fopen 表头文件 #include<sys/types.h> ...

  2. python—— 文件的打开模式和文件对象方法 & os、os.path 模块中关于文件、目录常用的函数使用方法

    引用自“鱼c工作室”     文件的打开模式和文件对象方法  : https://fishc.com.cn/forum.php?mod=viewthread&tid=45279&ext ...

  3. 文件的打开函数第一类--fopen()

        fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, “文件指针名”必须是被说明为FILE 类型的指针变量: “文件名”是被打开文件的 ...

  4. linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间

    转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开 ...

  5. 第9.2节 Python的文件打开函数open详解

    一. 引言 在操作一个文件前,大部分情况需要先打开文件,才能进行,在Python中使用内置函数open来打开一个文件.open函数是Python的一个内置函数,io模块 定义的函数open是该内置函数 ...

  6. 第9.1节 Python的文件打开函数open简介

    一.语法简介 函数基本使用语法:open(文件名,文件打开模式='rt') 其中: 1.文件名为可带路径的文件名,注意windows下路径的反斜杠会被作为转义符处理,因此可以采用前面再加反斜杠或使用原 ...

  7. Linux文件(区域)锁函数 -- open()、fcntl()

    一.什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主 ...

  8. C语言 文件操作6--文件打开方式详解

    fopen文件打开模式 r代表read的简写,+代表可读可写,w代表write,b代表bit二进制位,t代表text r 打开只读文件,该文件必须存在r+ 打开可读可写的文件,该文件必须存在(这里的写 ...

  9. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

随机推荐

  1. laravel 5.5 运行在 php7.0 报错 Symfony\Component\Translation\Translator.php FatalThrowableErrorParse error: syntax error, unexpected '?', expecting variable (T_VARIABLE)

    问题描述 报错原因是 php-cli 版本是 7.1.x,运行 composer create-project ... 命令时安装的依赖包会自动适配到当前 php 版本 7.1.x.如果 php-fp ...

  2. Nginx开启Gzip压缩提升页面加载速度

    1.在 nginx 的conf 目录下新建 gzip.conf 文件 #开启gzip压缩 gzip on; #设置允许压缩的页面最小字节数 gzip_min_length 1k; #申请4个单位为16 ...

  3. 从干将莫邪的故事说起--java比较操作注意要点

    故事背景 <搜神记>: 楚干将.莫邪为楚王作剑,三年乃成.王怒,欲杀之.剑有雌雄.其妻重身当产.夫语妻曰:“吾为王作剑,三年乃成.王怒,往必杀我.汝若生子是男,大,告之曰:‘出户望南山,松 ...

  4. mysqlbinlog增量恢复(基于使用事件位置position的恢复)

    1.在xtrabackup 备份+还原文章中我们记录了备份到的binlog文件名和position点位置使用如下命令就可以进行增量的恢复了shell> mysqlbinlog --stop-po ...

  5. java并发基础及原理

    java并发基础知识导图   一 java线程用法 1.1 线程使用方式 1.1.1 继承Thread类 继承Thread类的方式,无返回值,且由于java不支持多继承,继承Thread类后,无法再继 ...

  6. fiddler抓包-快速找到准确的接口与断点介绍

    前言: 相信有不少小伙伴提出,如果一堆杂七杂八的接口在fiddler显示,眼花缭乱的该怎么办?本篇文章小编给大家带来的内容是: 1.fiddler中设置域名过滤,使得快速定位你需要的接口: 2.断点, ...

  7. Python操作三大主流数据库☝☝☝

    Python操作三大主流数据库☝☝☝ Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数 ...

  8. Vue-cli中axios传参的方式以及后端取的方式

    0917自我总结 Vue-cli中axios传参的方式以及后端取的方式 一.传参 params是添加到url的请求字符串中的,用于get请求. data是添加到请求体(body)中的, 用于post请 ...

  9. 微信小程序中事件

    微信小程序中事件 一.常见的事件有 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 ...

  10. 关于CSS Grid Layout的代码解释

    .wrapper { display: grid; /*生成grid类型块级网格*/ grid-template-columns: repeat(3, 1fr); /*设置显示的列网格线,且重复3次1 ...