C语言 linux文件操作(一)

文章目录

    • 一、linux文件权限
      • 1.1文件描述符
      • 1.2文件描述符的范围和默认值
      • 1.3打开文件和文件描述符
      • 1.4标准文件描述符
      • 1.5文件描述符的重定向和关闭
      • 1.6I/O 操作
      • 1.7使用文件描述符进行进程通信
      • 1.8资源限制
    • 二、C语言文件读写
      • 2.1open 函数
      • 2.2 flags参数详解
      • 2.3 lseek 函数

一、linux文件权限

字符表示法 二进制 十进制  		  说明
r - -     100      4     		  仅可读
- w -     010      2     		  仅可写
- - x     001      1     		  仅可执行
r w -     110      6     		  可读可写
r - x     101      5     		  可读可执行
- w x     011      3     		  可写可执行
r w x     111      7     		  可读可写可执行
- - -     000      0     		  无权限

1.1文件描述符

在 Linux 系统中,文件描述符是用于访问文件、设备、套接字和其他 I/O 资源的抽象概念。它是一个非负整数,用于唯一标识一个打开的文件或者 I/O 通道。Linux 将所有的 I/O 资源(包括文件、管道、套接字等)都视为文件,并通过文件描述符进行访问。

下面是文件描述符的一些关键特性和使用情况:

1.2文件描述符的范围和默认值

  • 文件描述符的范围通常是从 0 开始递增的整数。0、1 和 2 分别是标准输入、标准输出和标准错误输出的文件描述符。在大多数情况下,系统会将第一个打开的文件赋予文件描述符 3,然后依次递增分配给其他打开的文件或者 I/O 通道。

1.3打开文件和文件描述符

  • 使用系统调用如 open()socket()pipe() 等来打开文件或创建 I/O 通道时,会返回一个文件描述符。
  • 例如,open() 打开文件后返回一个文件描述符,你可以使用这个描述符进行读取、写入或其他操作。

1.4标准文件描述符

  • 0:标准输入(stdin)
  • 1:标准输出(stdout)
  • 2:标准错误输出(stderr)

1.5文件描述符的重定向和关闭

  • 可以使用系统调用如 dup()dup2() 来复制文件描述符或者将一个文件描述符重定向到另一个文件描述符上。
  • 使用 close() 可以关闭一个文件描述符,释放系统资源。关闭文件描述符后,相应的文件或 I/O 通道不再被该描述符引用。

1.6I/O 操作

  • 通过文件描述符,可以进行读取、写入、定位文件指针和其他 I/O 操作。
  • 例如,read()write() 等系统调用使用文件描述符来执行对文件的读取和写入操作。

1.7使用文件描述符进行进程通信

  • 文件描述符在进程间通信(IPC)中扮演重要角色,比如通过管道、套接字、匿名管道等进行进程间通信时,文件描述符的传递和共享是常见的做法。

1.8资源限制

  • 系统对文件描述符数量有限制,可通过 ulimit 命令查看和设置文件描述符的数量限制。

文件描述符的使用对于在 Linux 系统下进行 I/O 操作和进程通信非常重要。它提供了一种标准化的方法来访问不同类型的 I/O 资源,简化了对文件和其他 I/O 设备的操作。

二、C语言文件读写

int open(const char *pathname, int flags);

2.1open 函数

open 函数用于打开一个文件,并返回一个文件描述符(file descriptor),这个描述符可以用于后续的文件读写操作。

语法

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname 是要打开的文件的路径名。

  • flags 是打开文件时的标志,它可以指定文件的打开方式(例如只读、只写、追加等)。一些常用的标志包括:

    • O_RDONLY: 只读方式打开文件
    • O_WRONLY: 只写方式打开文件
    • O_RDWR: 读写方式打开文件
    • O_CREAT: 如果文件不存在则创建文件
    • O_APPEND: 追加方式打开文件
    • 等等(可以使用按位或 | 连接多个标志)。
  • mode 是一个权限参数,仅在使用 O_CREAT 标志创建文件时才需要。它指定了文件的权限,比如 0644

返回值

  • 如果成功,open 函数返回一个非负整数的文件描述符,可以用于后续的文件 I/O 操作。
  • 如果失败,返回值为 -1,并设置全局变量 errno 表示出错的原因。

示例

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>int main() {int fd;fd = open("example.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");return 1;}// 可以在这里进行文件写操作等close(fd);return 0;
}

2.2 flags参数详解

  1. O_CREAT:在文件打开过程中创建新文件
  2. O_RDONLY:以只读方式打开文件。
  3. O_WRONLY:以只写方式打开文件。
  4. O_RDWR:以读写方式打开文件。
  5. O_APPEND:在文件末尾追加数据,而不是覆盖现有内容。
  6. O_TRUNC:如果文件已经存在,将其截断为空文件。
  7. O_EXCL:与 O_CREAT 一起使用时,如果文件已经存在,则 open() 调用将失败。
  8. O_SYNC:使文件写操作变为同步写入,即将数据立即写入磁盘。
  9. O_NONBLOCK:以非阻塞方式打开文件,即使无法立即进行读写操作也不会被阻塞。

当文件为空的时候,文件指针初始化指向0的位置,随着写入,文件指针会落到最后一个字符的后面。当文件描述符被关闭后,重新使用open函数文件指针会指向0。

2.3 lseek 函数

lseek 函数用于移动文件描述符指向文件中的位置。

语法

#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
  • fd 是文件描述符,通过 open 函数获取。
  • offset 是偏移量,可以是正数、负数或零,用来指定相对于 whence 的偏移量。
  • whence 用于确定 offset 是相对于文件开始位置、当前位置还是文件末尾位置,有三个可选值:
    • SEEK_SET:偏移量相对于文件开头
    • SEEK_CUR:偏移量相对于当前位置
    • SEEK_END:偏移量相对于文件末尾

返回值

  • 如果成功,lseek 函数返回从文件开头到新的文件位置的偏移量。
  • 如果失败,返回值为 -1,并设置全局变量 errno 表示出错的原因。

示例

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>int main() {int fd;off_t offset;fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}// 设置文件偏移量到文件末尾offset = lseek(fd, 0, SEEK_END);if (offset == -1) {perror("lseek");close(fd);return 1;}printf("File size: %ld bytes\n", offset);close(fd);return 0;
}

这些函数是 C 语言中用于文件操作的基础函数,可以通过它们来进行文件的打开、关闭、读写以及定位操作。

下面是一个操作文件的例子

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{char *buf = "你好啊 世界!"; int fd = open("./file1", O_RDWR); // 尝试以读写模式打开名为 "file1" 的文件if (fd == -1){printf("open file1 failed\n"); // 如果文件打开失败,输出错误消息fd = open("./file1", O_RDWR | O_CREAT, 0600); // 以读写模式和创建标志创建名为 "file1" 的新文件,文件权限为 0600if (fd > 0){printf("create file1 success!\n"); // 如果成功创建文件,输出成功消息}}printf("open success: fd = %d\n", fd); // 打印文件描述符int write_num = write(fd, buf, strlen(buf)); // 向文件写入内容,返回写入的字节数if (write_num != -1){printf("write %d bytes to file\n", write_num); // 打印成功写入的字节数}off_t offset = -21; // 设置偏移量为负数lseek(fd, -21, SEEK_CUR); // 在当前位置偏移 -21 个字节// 读取数据char *temp = (char*)malloc(sizeof(char) * write_num + 1);read(fd,temp,100);printf("%s\n",temp);close(fd); // 关闭文件return 0;
}

在这里插入图片描述

参考文章

推荐文章:Linux 文件基本属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

竞赛保研 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具&#xff0c;用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为&#xff0c;自动访问网页&#xff0c;提取感兴趣的数据&#xff0c;并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

Lichee Nano(F1C100s) Linux 开发环境搭建

Lichee Nano是基于全志科技的F1C100s(ARM 926EJS内核)高性能soC芯片设计的迷你开发板。开发板设计小巧精致&#xff0c;将芯片的所有资源都引出&#xff0c;板载USB、Flash、TF卡、4OP LCD接口等&#xff0c;并把所有IO资源引出&#xff0c;方便开发者拓展使用&#xff0c;非常…

24年软件测试的晋升之路与能力要求,“我“该何去何从?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试人员的…

java中如何使用elasticsearch—RestClient操作文档(CRUD)

目录 一、案例分析 二、Java代码中操作文档 2.1 初始化JavaRestClient 2.2 添加数据到索引库 2.3 根据id查询数据 2.4 根据id修改数据 2.4 删除操作 三、java代码对文档进行操作的基本步骤 一、案例分析 去数据库查询酒店数据&#xff0c;导入到hotel索引库&#xff0…

程序员必知!适配器模式的实战应用与案例分析

适配器模式是一种结构型设计模式&#xff0c;它允许不同接口的对象协同工作&#xff0c;它通过将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得不兼容的类可以一起工作。适配器模式提高了类的复用性、系统的灵活性和可扩展性&#xff0c;并降低了系统间的耦合度&a…

React快速入门之组件

目录 组件JSX在标签使用{}嵌入JS表达式使用组件组件嵌套以&#x1f332;树的方式管理组件间的关系组件纯粹原则 组件 文件&#xff1a;Profile.js export default function Profile({isPacked true&#xff0c;head,stlyeTmp,src,size 80}) {if (isPacked) {head head &q…

在SpringBoot中自定义指标并使用Prometheus监控报警

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享 在10 分钟教你使用Prometheus监控Spring Boot工程中介绍了如何使用Prometheus监控Spring Boot提供的默认指标&#xff0c;这篇介绍如何自定义业务指标&#xff0c;并使用Prometheus进行…

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1&#xff09;操作符左右一定有空格&#xff0c; 2&#xff09;分隔符&#xff08;, 和;&#xff09;前一位没有空格&#xff0c;后一位保持空格&#xff0c;例如&#xff1a; 3&#xff09;大括号和函数保持同一行&#xff0c;并有一个空格…

JavaScript Class类 | 类的继承 - 类的使用 -原型与原型链

文章目录 JavaScript class类基础概念属性与方法相关概念私有字段类的name属性 返回类的名字类的访问器方法super关键字 new的过程中发生了什么extends继承 重写-重载 语法细节类声明与类表达式补充理解:let和const的作用域提升规则 类的继承原型与隐式原型链特殊原型链 原型链…

【C++核心编程(一)】

一、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的。 全局区&#xff1a;存放全局变量和静态变量以及常量。 栈区&#xff1a;由编译器自动分配释放,存放函数的…

第52周,第三期技术动态

大家好&#xff0c;才是真的好。 今天周五&#xff0c;我们主要介绍与Domino相关产品新闻&#xff0c;以及互联网或其他IT行业动态等。 一、HCL Domino将重新开发和发布应用市场 为了持续吸引新客户&#xff0c;现有客户以及技术爱好者和专业人士&#xff0c;在2023年的 Col…