3. 文件与I/O

  1. 文件与I/OO

read系统调用

函数原型

  • 一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打并的,就可以用read()系统调用从该文件中读取字节
  • 函数原型:
  • ssize_t read(int fd, void buf, size_t count);
  • 参数
  • fd:想要读的文件的文件描述符
  • buf :指向内存块的指针,从文件中读取来的字节放到这个内存块中
  • count :从该文件复制到buf中的字节个数
  • 返回值
  • *如果出现错误,返回-1 , 读文件结束,返回0,否则返回从该文件复制到规定的缓冲f区中的字节数d

wirte系统调用

write

  • 用write()系统调用将数据写到一个文件中
  • 函数原型:
  • ssize_t write(int fd,const void*buf, size_t count);
  • ssize_t 为有符号数
  • 函数参数:
  • fd:要写入的文件的文件描述符
  • buf:指向内存块的指针,从这个内存块中读取数据写入到文件中
  • count:要写入文件的字节个数
  • 返回值
  • *如果出现错误,返回-1,如果写入成功,则返回写入到文件中的字节个数

读操作一般意味着数据已经从外存读到缓冲区了,但写操作不一定意味着从缓冲区写到外存,除非指定了同步选项(open函数指定 O_SYNC 的标志 或者通过函数fsync()进行同步)

3. 文件与I/O

例子

   1 /* ************************************************************************
  2 > File Name:     01cp.c
  3 > Author:        sansuitaibai
  4 > email:         2657302908@qq.com
  5 > Created Time:  2022年09月18日 17时31分29秒 CST
  6 > Description:
  7  ************************************************************************/
  8 #include
  9 #include
 10 #include
 11
 12 #include
 13 #include
 14 #include
 15 #include
 16 #include
 17
 18 #define ERR_EXIT(m) \
 19     do{ \
 34     if(infd < 0){
 35         ERR_EXIT("infd oped faul: ");
 36     }
 37     outfd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC , 0644);
 38     if(outfd  0){
 44
 45         write(outfd,buf , nread);
 46     }
 47
 48     close(infd);
 49     close(outfd);
 50
 51
 52
 53     return 0;
 54 }
 55

结果:

3. 文件与I/O

文件的随机读写

  • 到目前为止的所有文件访问都是顺序访问。这是因为所有的读和写都从当前文件的偏移位置开始,然后文件偏移值自动地增加到刚好超出读或写结束时的位置,使它为下一次访问作好准备。
  • 有个文件偏移这样的机制,在Linux系统中,随机访问就变得很简单,你所需做的只是将当前文件移值改变到有关的位置,它将迫使一次read()或write()发生在这一位置。(除非文件被O_APPEND打开,在这种情况下,任何write调用仍将发生在文件结束处)

lseek

此函数为linux系统调用,对应c库中的fseek

  • 功能说明:通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位curp,这取决于lseek()函数中指定的位置
  • 原型:
  • off_t lseek (int fd,off_t offset,int base);
  • 参数
  • fd:需设置的文件标识符
  • offset:偏移量
  • base:搜索的起始位置,见下表
  • *返回值:返回新的文件偏移值

base 文件位置 SEEK_SET 从文件开始处计算偏移 SEEK_CUR 从当前文件的偏移值计算偏移 SEEK_END 从文件的结束处计算偏移

上述标识在头文件

3. 文件与I/O

例子:

  1 /* ************************************************************************
  2 > File Name:     02lseek.c
  3 > Author:        sansuitaibai
  4 > email:         2657302908@qq.com
  5 > Created Time:  2022年09月18日 18时10分27秒 CST
  6 > Description:
  7  ************************************************************************/
  8 #include
  9 #include
 10 #include
 11
 12 #include
 13 #include
 14 #include
 15 #include
 16 #include
 17
 18 #define ERR_EXIT(m) \
 19     do{ \
 20         perror(m); \
 21         exit(EXIT_FAILURE); \
 22     }while(0)
 23
 24 int main(){
 25
 26     int fd = open("test.txt",O_RDONLY);
 27     if(fd < 0){
 28         ERR_EXIT("open");
 29     }
 30     char buf[5];
 31     int nread = 0;
 32     nread =  read(fd,buf, 5);
 33     if(nread

结果:

3. 文件与I/O

lseek() 函数可以移动正在读取文件的当前的指针的位置。

空洞文件hole

  1 /* ************************************************************************
  2 > File Name:     02lseek.c
  3 > Author:        sansuitaibai
  4 > email:         2657302908@qq.com
  5 > Created Time:  2022年09月18日 18时10分27秒 CST
  6 > Description:
  7  ************************************************************************/
  8 #include
  9 #include
 10 #include
 11
 12 #include
 13 #include
 14 #include

 15 #include
 16 #include
 17
 18 #define ERR_EXIT(m) \
 19     do{ \
 20         perror(m); \
 21         exit(EXIT_FAILURE); \
 22     }while(0)
 23
 24 int main(){
 25
 26     int fd = open("hole.txt",O_RDWR);
 27     if(fd < 0){
 28         ERR_EXIT("open");
 29     }
 30     char buf[5];
 31     int nread = 0;
 32     nread =  read(fd,buf, 5);
 33     if(nread

结果:

3. 文件与I/O

od的用法

Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。

目录访问

opendir

  • 功能说明:打开一个目录
  • 原型:
  • _DIR opendir(charpathname);_
  • 参数
  • pathname: 路径名
  • *返回值:打开成功,返回一个目录指针打开失败,则返回0

readdir

  • 功能说明:访问指定目录中下一个连接的细节
  • 原型:
  • struct dirent readdir(DIR dirptr);
  • 参数
  • 目录指针
  • *返回值:返回一个指向dirent结构的指针,它包含指定目录中下一个连接的细节; 没有更多连接时,返回0
struct dirent {
    ino_t          d_ino;       /* Inode number */
    off_t          d_off;       /* Not an offset; see below */
    unsigned short d_reclen;    /* Length of this record */
    unsigned char  d_type;      /* Type of file; not supported
                                  by all filesystem types */
    char           d_name[256]; /* Null-terminated filename */
};

closedir

  • int closedir(DIR *dirptr);
  • 返回值: 成功返回0 ,失败返回-1

chmod和fchmod

  • 功能说明:用来改变给定路径名pathname的文件的权限位
  • int chmod(char* pathname , mode_t mode);
  • int fchmod(int fd , mode_t mode);
  • 返回值: 成功返回0 , 失败返回-1.
  • Linux chmod命令

chown和fchown

  • *功能说明:用来改变文件所有者的识别号(ownerid)或者它的用户组识别号(group lD)

  • int chown(char* pathname , uid_t owner , gid_t group);

  • int fchown(int fd, uid_t owner ,gid_t group);
  • fd 为文件描述符。
  • 返回值: 成功返回0 , 失败返回-1.
  • Linux chown 命令

rmdir

  • 删除一个空目录
  • int rmdir(char* pathname);
  • *返回值: 成功返回0 , 失败返回-1.

mkdir

  • 用来创建一个称为 pathname 的新目录,权限为设置为 mode
  • int mkdir(char* pathname , mode_t mode);
  • *返回值: 成功返回0 , 失败返回-1.

Linux下DIR,dirent,stat等结构体详解

Linux下DIR,dirent,stat等结构体详解

例子

  1 /* ************************************************************************
  2 > File Name:     02lseek.c
  3 > Author:        sansuitaibai
  4 > email:         2657302908@qq.com
  5 > Created Time:  2022年09月18日 18时10分27秒 CST
  6 > Description:
  7  ************************************************************************/
  8 #include
  9 #include
 13 #include
 14 #include
 15 #include
 16 #include
 17 #include
 18
 19 #define ERR_EXIT(m) \
 20     do{ \
 21         perror(m); \
 22         exit(EXIT_FAILURE); \
 23     }while(0)
 24
 25 int main(){
 26
 27
 28     mkdir("A",0755);
 29     mkdir("B",0644);
 30     rmdir("A");
 31     DIR* dir = opendir(".");
 32     struct dirent* de = NULL;
 33     while((de = readdir(dir)) != NULL){
 34         if(strncmp(de->d_name , "." , 1) == 0)
 35             continue;
 36         printf("%s\n",de->d_name);
 37     }
 38     chmod("B",0755);
 39     closedir(dir);
 40
 41
 42     return 0;
 43 }
 44

结果:

3. 文件与I/O

Original: https://www.cnblogs.com/sansuitaibai/p/16705723.html
Author: sansuitaibai
Title: 3. 文件与I/O

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577617/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • IDEA出现Could not autowire. No beans of ‘xxx’ type found.解决

    Plan A File → Project Structure… Facets → Spring → 右键删除即可 Plan B File → Settings → E…

    Linux 2023年6月13日
    092
  • 【开源打印组件】vue-plugin-hiprint初体验

    vue-plugin-hiprint的学习与应用 😄 生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学…

    Linux 2023年6月6日
    0172
  • jQuery的操作方式以及动画效果

    jQuery的操作标签 文本操作 $("选择符").html() // 读取指定元素的内容,如果$()函数获取了有多个元素,则提取第一个元素 $("选…

    Linux 2023年6月7日
    0110
  • 【Prometheus+Grafana系列】监控MySQL服务

    前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务。当时实现了监控服务器指标数据,是通过 node_exporter…

    Linux 2023年6月7日
    088
  • Python中的对象引用、浅拷贝与深拷贝

    最近项目中遇到一个Python浅拷贝机制引起的bug,由于对于Python中对象引用、赋值、浅拷贝/深拷贝机制没有足够的认识,导致调试了很久才发现问题,这里简单记录一下相关概念。 …

    Linux 2023年6月6日
    082
  • Ubuntu更换镜像源

    当修改 sources.list文件时,我们需要将下面任意一个镜像源的代码 复制粘贴到该文件中。 阿里源 阿里镜像源 deb http://mirrors.aliyun.com/u…

    Linux 2023年6月14日
    090
  • Docker私有仓库部署

    修改daemon.json 重启docker服务 镜像上传至私有仓库 标记此镜像为私有仓库的镜像 再次启动私服容器 Original: https://www.cnblogs.co…

    Linux 2023年6月8日
    070
  • WEB自动化-04-Cypress 测试用例编写和组织

    4 测试用例编写和组织 4.1 用例结构 Cypress是建立在 Mocha和 Chai之上,因此同时支持Chai的 BDD和 TDD两种风格。如果你熟悉JavaScript风格的…

    Linux 2023年6月7日
    0111
  • 自动化集成:Pipeline流水语法详解

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述Pipeline流水线用法。 一…

    Linux 2023年5月27日
    0114
  • 【原创】Linux中断子系统(三)-softirq和tasklet

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    0101
  • 网络安全常见术语

    黑客帽子之分 白帽 白帽:亦称白帽黑客、白帽子黑客,是指那些专门研究或者从事网络、计算机技术防御的人,他们通常受雇于各大公司,是维护世界网络、计算机安全的主要力量。很多白帽还受雇于…

    Linux 2023年6月14日
    087
  • 自动化服务器巡检的实现过程

    由于上级的工作安排,从今年5月开始,每天都要做一些服务器信息检查。 [En] Due to the work arrangement of the superior, it is …

    Linux 2023年5月27日
    090
  • MediaFire 网盘队列下载脚本

    MediaFire是一个国外的网盘。通常情况下,我们可以用浏览器下载MediaFire的文件,但是不能同时下载过多文件,只能几个几个地慢慢手动下载,比较费时间,所以我设计了这样一个…

    Linux 2023年6月6日
    0131
  • shell内置命令和外部命令的区别

    shell内置命令和外部命令的区别 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行…

    Linux 2023年6月7日
    078
  • Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先我们需要去官网下载显卡驱动 打开浏览器,在百度搜索框中搜索:显卡驱动 下载 在 手动搜索驱动程序一栏,根据自己的显卡进行…

    Linux 2023年6月14日
    0110
  • Docker镜像管理基础

    Docker镜像管理基础 1、镜像的概念 镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。 docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启…

    Linux 2023年6月7日
    0112
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球