• 售前

  • 售后

热门帖子
入门百科

Linux详解 --- 系统文件IO操作与文件描述符

[复制链接]
123456806 显示全部楼层 发表于 2022-1-12 12:09:38 |阅读模式 打印 上一主题 下一主题
文章目录



 接下来我将介绍Linux当中与IO有关的知识,下面是本章节的思维导图,接下来的几篇博客我将按照思维导图的划分进行讲解。

思维导图获取
提取码: m9cz

IO操作

语言级IO操作

  在介绍系统级别的IO操作之前,我们先来回顾一下语言级别的IO操作。这里就以C语言中的IO操作为例了。
  在C语言中,我们首先需要打开一个文件,使用的函数就是fopen,fopen可以指定以何种方式去打开文件,如: 以只读的方式、以只写的方式、以追加的方式等。
  在打开文件之后,我们就可以写入或读取这个文件了。C语言中,文件的写入操作有fputs、fwrite、fprintf等。文件的读取操作有fgets、fread、fscanf等。下面给出一个C语言中常用的文件操作函数的接口及其功能的解释。
C语言文件操作函数接口功能fopen打开文件
可以指定打开的方式fputc向文件中写入一个字符fputs向文件中写入一个字符串fwrite向文件中写入指定数量的全部字符fprintf以格式化的方式输入到文件中fgetc从文件中读取一个字符fgets从文件中读取n个字符(会读取\n)fread从文件中读取指定数量的全部字符fscanf以格式化的方式读取文件中的数据fseek将文件指针移动到 特定的偏移量的位置ftell返回文件指针相对于起始的偏移量rewind让文件指针回到起始的位置fclose关闭文件 
问题:为什么我们可以直接 printf 和 scanf?
 任何进程在运行的时候,都会默认打开的3个输入/输出流
stdin ( 键盘 )     :标准输入
stdout ( 显示器 )  :标准输出
stderror ( 显示器 ) :标准错误
  他们三个流的类型都是FILE*类型的文件指针,就和我们打开文件一样,我们往往使用一个FILE *的指针去接收fopen函数的返回值。


系统级IO操作

  为什么我要在前面讲C语言的文件操作接口呢?因为接下来的系统级的IO接口和C语言中的接口非常相似,相似到只要你知道函数名你几乎它是干什么的了。
open

  1.         int open(const char* pathname, int flags);            
  2.     int open(const char* pathname, int flags, mode_t mode);
  3.         //包含于:<sys/types.h>    <sys/stat.h>    <fcntl.h>
复制代码
参数:
    pathname:要打开或创建的 目标文件  //支持相对路径和绝对路径
    flag:传参标志位
       flag参数有以下几种,可以传1个或多个。使用多个时,用“|”或运算符连结。
        O_RDONLY:只读打开
        O_WRONLY:只写打开
        O_RDWR :读、写 打开
        O_CREAT :若文件不存在,则创建它。使用该选项时,必须要用mode选项指定新文件的权限
        O_APPEND :追加 写
    mode:当创建新文件时,对权限的设置。如:0666 (注意,该权限还需要与umask进行运算)
返回值:
    成功:返回新打开文件的文件描述符(我下面会详细讲,类似C语言中的文件指针,但是它是个int)
    失败:-1

演示:
  1.         umask(0004);
  2.         int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
  3.         //创建一个文件并以只写的方式打开,文件的权限设置为0666 (还需要与umask值进行运算)
复制代码
close

  1.         int close(int fd);        //关闭指定的文件描述符fd
复制代码
write

  1.         ssize_t write(int fd, const void* buf, size_t count);
复制代码
参数:
    fd:文件描述符
    buf:要写入的字符串
    count:要写入的字符个数
read

  1.         ssize_t read(int fd, void* buf, size_t count);
复制代码
参数:
    fd:文件描述符
    buf:从文件中读取的字符所存放的空间
    count:传入你要读取的字符个数

函数使用演示
  1. //测试write
  2. #include <iostream>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. using namespace std;
  8. int main()
  9. {
  10.         umask(002);
  11.         int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
  12.           char buff[64] = "write some buffer to log.txt\n";
  13.         write(fd, buff, sizeof(buff));
  14.                                                                                                 
  15.         close(fd);
  16.         return 0;
  17. }
复制代码


[code]//测试read#include #include     #include     #include     #include     using namespace std;    int main(){  int fd = open("log.txt", O_RDONLY);  char buffer[64];  read(fd, buffer, sizeof(buffer));    cout

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作