首页 > 其他分享 >2. 文件与I/O

2. 文件与I/O

时间:2022-09-18 15:44:25浏览次数:56  
标签:文件 调用 int EXIT include open

2. 文件与I/o

  • open 系统调用
  • close 系统调用
  • creat 系统调用
  • read 系统调用
  • write 系统调用

open系统调用1

函数原型

  • 有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open ()(打开)系统调用
  • 函数原型
    • *int open(const char path, int flags);
  • 参数
    • path :文件的名称,可以包含(绝对和相对)路径
    • flags:文件打开模式
  • 返回值
    • 打开成功,返回文件描述符;
    • 打开失败,返回-1

open例子

/* ************************************************************************                                                                                   
  2 > File Name:     02open.c
  3 > Author:        sansuitaibai
  4 > email:         [email protected]
  5 > Created Time:  2022年09月18日 14时33分42秒 CST
  6 > Description:   
  7  ************************************************************************/
  8 #include <sys/types.h>
  9 #include <sys/stat.h>
 10 #include <fcntl.h>
 11 #include<stdio.h>
 12 #include<unistd.h>
 13 #include<stdlib.h>
 14 #include<string.h>
 15 #include<errno.h>
 16 #define ERR_EXIT(m) \
 17     do{ \
 18         perror(m); \
 19         exit(EXIT_FAILURE); \
 20     }while(0)
 21 
 22 int main(){
 23 
 24     int fd = open("test.txt",O_CREAT | O_RDWR);
 25     if(fd == -1){
 26         ERR_EXIT("open");
 27 
 28     }
 29     printf("open succ\n");
 30     ERR_EXIT("open succ\n");
 31     return 0;
 32 
 33
 34 
 35 }

结果:

image

open系统调用2

函数原型

  • 函数原型
    • int open(const char *path, int flags,mode_t mode);
  • 参数
    • path :文件的名称,可以包含(绝对和相对)路径
    • flags:文件打开模式,见下表
    • mode:用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,见下表
      • mode 计算公式: mode & ^umask
  • 返回值
    • 打开成功,返回文件描述符;
    • 打开失败,返回-1
打开方式 描述
O_RDONLY 打开一个供读取的文件
O_WRONLY 打开一个供写入的文件
O_RDWR 打开一个可供读写的文件
O_APPEND 写入的所有数据将被追加到文件的末尾
O_CREAT 打开文件,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT且文件存在,则强制open ()失败
O_TRUNC 在open ()时,将文件的内容清空

以上的标志在头文件<fcntl.h>

打开方式 描述
S_IRUSR 文件所有者的读权限位
S_IwUSR 文件所有者的写权限位
S__IXUSR 文件所有者的执行权限位
S_IRWXU S_IRUSR|S_IwUSR|\S_IXUSR
S_IRGRP 文件用户组的读权限位
S_IWGRP 文件用户组的写权限位
S_IXGRP 文件用户组的执行权限位
S_IRWXG S_IRGRP|S_IwGRP|S_IXGRP
S_IROTH 文件其他用户的读权限位
S_IWOTH 文件其他用户的写权限位
S_IXOTH 文件其他用户的执行权限位
S_IRWXO SIROTH|SIwOTH|S_IXOTH

以上在头文件<sys/stat.h>中定义。

例子

1 /* ************************************************************************                                                                                   
  2 > File Name:     02open.c
  3 > Author:        sansuitaibai
  4 > email:         [email protected]
  5 > Created Time:  2022年09月18日 14时33分42秒 CST
  6 > Description:   
  7  ************************************************************************/
  8 #include <sys/types.h>
  9 #include <sys/stat.h>
 10 #include <fcntl.h>
 11 #include<stdio.h>
 12 #include<unistd.h>
 13 #include<stdlib.h>
 14 #include<string.h>
 15 #include<errno.h>
 16 #define ERR_EXIT(m) \
 17     do{ \
 18         perror(m); \
 19         exit(EXIT_FAILURE); \
 20     }while(0)
 21 
 22 int main(){
 23 
 24     umask(0); //设置umask值,不让程序从shell那继承 
 25     int fd = open("03test.txt",O_CREAT | O_RDWR , 0666);
 26     if(fd == -1){
 27         ERR_EXIT("open");
 28 
 29     }
 30     printf("open succ\n");
 31     return 0;
 32 
 33 
 34 
 35 }

结果:
image

例子

1 /* ************************************************************************                                                                                   
  2 > File Name:     02open.c
  3 > Author:        sansuitaibai
  4 > email:         [email protected]
  5 > Created Time:  2022年09月18日 14时33分42秒 CST
  6 > Description:   
  7  ************************************************************************/
  8 #include <sys/types.h>
  9 #include <sys/stat.h>
 10 #include <fcntl.h>
 11 #include<stdio.h>
 12 #include<unistd.h>
 13 #include<stdlib.h>
 14 #include<string.h>
 15 #include<errno.h>
 16 #define ERR_EXIT(m) \
 17     do{ \
 18         perror(m); \
 19         exit(EXIT_FAILURE); \
 20     }while(0)
 21 
 22 int main(){
 23 
 24     umask(0); //设置umask值,不让程序从shell那继承 
 25     int fd = open("03test.txt",O_CREAT | O_RDWR  | O_EXCL, 0666);
 26     if(fd == -1){
 27         ERR_EXIT("open");
 28 
 29     }
 30     printf("open succ\n");
 31     return 0;
 32 
 33 
 34 
 35 }

结果:

image

注意标志 O_EXCL 的用法。

open调用的几点说明

  • 可以利用按位逻辑增加 (bitwise—OR)(|) 对打开方式的标志值进行组合。

    • 如:打开一个新的文件: #define NEWFILE (O_WRONLY | O_CREAT | O_TRUNC )
  • 对访问权限位进行访问所用到的标志符,均可以通过<sys/stat.h>访问到,同样可以通过 | 或运算进行组合

    • 如: #define MODE755 (S_IRWXU | S_IXGRP | S_XOTH)

close系统调用3

函数原型

  • 为了重新利用文件描述符,用close()系统调用释放打开的文件描述符
  • 函数原型:int close(int fd);
  • 函数参数:
    • fd :要关团的文件的文件描述符
  • 返回值
    • 如果出现错误,返回-1调用成功返回0

例子

在上面的例子中将打开的文件进行关闭即可。

ulimit -a查看系统的限制

image

creat系统调用4

  • 为了维持与早期UNIX系统的向后兼容性,Linux也提供可选的创建文件的系统调用,它称为:creat()
  • 函数原型:
    • int creat(const char* path , mode_t mode);
    • 参数:
      • path: 文件的路径和名称(可以是绝对路径或相对路径)
      • 用来规定对该文件的所有者,用户组,其他人的访问权限的设置
      • 返回值:打开成功,返回文件描述符,失败返回-1.

creat系统调用含义

  • 在UNIX早期版本中,open()系统调用仅仅存在两个参数的形式。
  • 如果文件不存在,它就不能进行打开文件
  • 文件的创建则是由单独的系统调用creat()完成。
  • 在Linux及所有的UNIX的近代版本中,creat()系统调用是多余的。

creat()调用:

  • fd = creat(file , mode);
  • 完全等价于: fd = open(file, O_WRONLY | O_CREAT | O_TRUNC , mode);

标签:文件,调用,int,EXIT,include,open
From: https://www.cnblogs.com/sansuitaibai/p/16704902.html

相关文章

  • MyBatis配置文件开启驼峰命名
    mybatis-config.xml文件中配置开启<settings><!--配置:开启二级缓存--><!--<settingname="cacheEnabled"value="true"/>--><settingnam......
  • Yoink for Mac(临时文件存储助手)中文
    那么如果你也经常因为屏幕尺寸小,在Mac系统中拖放文件感觉很不方便的话,强烈推荐你试试Yoink这个小程序。Yoink(临时文件存储助手)forMac是一款适用于苹果电脑Macos平......
  • cmd 'node' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    报错:cmd提示:‘node‘不是内部或外部命令,也不是可运行的程序原因:没安装node.js或者没配置好环境变量情况1:安装node.js下载地址:https://nodejs.org/en/安装步骤:默......
  • 使用Android自带文件选择器
    工具类:publicclassUriTofilePath{publicstaticStringgetFilePathByUri(Contextcontext,Uriuri){Stringpath=null;//4.4及之后的......
  • RCE+CC攻击+目录穿越+任意文件读取...
    目录 目录穿越   目录穿越原理:目录穿越(也被称为目录遍历/directorytraversal/pathtraversal)是通过使用../等目录控制序列或者文件的绝对路径来访问存储......
  • 移动"历史文件夹"到"新指定的路径"
    一、将A路径下所有文件及文件夹,移动到一个新的路径中,并删除历史文件夹点击查看代码///<summary>///将历史文件夹移动到新路径中///</summary>///<paramname="ol......
  • 1. 系统调用 I/O 文件描述符 文件指针
    内核是如何处理系统调用每个系统调用被赋予了一个系统调用号在i386平台上,执行一个系统调用是通过int0X80指令完成的eax存放系统的调用号ebx,ecx,edx,esi,edi存储系统调用......
  • 实例-rust-将数据写入json文件
    Cargo.toml[package]name="rust-example5"version="0.1.0"edition="2021"#Seemorekeysandtheirdefinitionsathttps://doc.rust-lang.org/cargo/refere......
  • Jmeter远程服务模式运行时引用csv文件的路径配置
    问题在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考......
  • 实例-rust-将struct写入json文件
    cargo.toml[package]name="rust-example5"version="0.1.0"edition="2021"#Seemorekeysandtheirdefinitionsathttps://doc.rust-lang.org/cargo/refere......