Linux文件操作基础及基本I/O函数使用

news2024/9/21 20:23:11

文章目录

  • 前言
  • 一、基础命令简单讲解
  • 二、文件描述符
  • 三、open、read、write函数讲解
    • 1.open函数
    • 2.read函数
    • 3.write函数
  • 四、使用open、read、write操作标准输入输出
  • 总结


前言

Linux是一个基于文件系统的操作系统,文件操作是其中一项最基本的任务之一。通过文件操作,用户可以创建、移动、复制、读取和修改文件及目录等。

一、基础命令简单讲解

1.ls:列出目录中的文件和子目录。

ls -a:显示所有包括隐藏文件。
ls -l:使用长格式输出文件详细信息。
ls -h:显示文件大小时使用易读的格式。
cd:切换当前目录。

2.cd /:切换到根目录。
cd ~:切换到当前用户的主目录。
cd …:切换到上级目录。
mkdir:创建目录。

3.mkdir dir1:创建一个名为“dir1”的目录。
mkdir -p dir1/dir2:创建多层目录。
rm:删除文件或目录。

4.rm file1:删除一个名为“file1”的文件。
rm -r dir1:删除整个名为“dir1”的目录。
cp:复制文件或目录。

5.cp file1 file2:将“file1”复制到“file2”。
cp -r dir1 dir2:将“dir1”及其内容复制到“dir2”。
mv:移动文件或目录。

6.mv file1 dir1:将“file1”移动到“dir1”中。
mv dir1 new_dir:将“dir1”重命名为“new_dir”。
touch:创建空文件或者修改文件访问时间和修改时间。

7.touch file1:创建一个名为“file1”的空文件。
touch -a file1:修改“file1”的访问时间。
touch -m file1:修改“file1”的修改时间。
cat:显示文件内容。

8.cat file1:显示“file1”的内容。
cat file1 file2:顺序显示“file1”和“file2”的内容。
grep:在文件中搜索特定的字符串。

grep “my text” file1:搜索“file1”中包含“my text”的行。

具体的命令讲解可以看我之前写的文章这里就不做过多讲解。本篇文章主要来学习基本I/O函数的使用。

二、文件描述符

在 Linux 系统中,每一个打开的文件或者流都会分配一个唯一的整数标识符,称为文件描述符。文件描述符是操作系统用来标识一个进程所持有的文件或者数据流的方式。

文件描述符是一个非负整数值,通常是一个小于或等于进程打开文件限制的值。标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的文件描述符分别为0,1和2。

文件描述符在打开文件和数据流时由操作系统赋予。当操作系统打开文件或数据流时,会分配一个文件描述符并返回给调用进程。进程可以使用此文件描述符进行读写操作。

三、open、read、write函数讲解

1.open函数

man手册查看用法:
在这里插入图片描述
在man手册中可以查看到所需要的头文件和函数原型。
函数原型:

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

下面是open()函数的参数详解:

pathname:文件路径名字符串,为要打开的文件的绝对或相对路径名。

flags:打开标志位参数,可通过将不同的标志位进行按位或运算来组合使用,其值为以下标志位的按位或:

O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件。
O_RDWR:以读写方式打开文件。
O_CREAT:如果文件不存在,则创建文件。必须与mode_t位运算标志位O_WRONLY、O_RDWR组合使用。
O_EXCL:如果同时设置了O_CREAT标志,而文件已经存在,则返回错误。
O_TRUNC:如果文件存在并且以写方式打开,则清空文件所有数据。
O_APPEND:以追加方式打开文件。在写入时,总是从文件末尾开始添加数据。
O_NONBLOCK:以非阻塞方式打开文件。如果文件没有准备好,那么读取操作和写入操作将直接返回错误而不是等待。
O_SYNC:由于写入将是同步的,因此所有上层缓存都将被刷新。这通常会降低文件I/O的性能。
O_DIRECTORY:要求pathname必须是一个目录。
mode:默认权限,指定了文件创建时的访问权限。它是一个八进制数,由三个低权限位(对应文件所有者、组和其它人)以及三个特殊位(SGID、SUID和sticky位)构成。特殊位通常默认设置为0。

在调用open()之后,如果文件打开成功,它将返回一个文件描述符(file descriptor)。返回的文件描述符就是要操作的文件句柄,我们可以使用它进行读、写等各种操作,如果返回-1则表示打开文件失败,此时可以使用errno来获取失败原因。

2.read函数

man手册查看用法:
函数原型:
read函数是Linux系统提供的输入函数之一,通常用于从文件或套接字中读取数据

ssize_t read(int fd, void *buf, size_t count);

参数解析:
fd:要读取数据的文件描述符,通常是打开文件时返回的文件描述符,也可以是套接字描述符等。
buf:读取数据后存储的位置,一般为一块已分配的内存地址。
count:要读取的字节数。
return值解释如下:

成功时,返回实际读取的字节数(可能小于count);
如果已经到达文件末尾,则返回0;
如果发生错误,则返回-1,并设置全局变量errno来指示发生的错误类型。
read函数在执行时有以下三种基本情况:

当count大于零时,read函数一直等待直到读取指定数量的字节,或者读取到文件末尾。

当count等于零时,read函数不会读取数据,而只是返回0。

当count小于零时,read函数将返回EINVAL错误。

需要注意的是,read函数是一个阻塞函数,如果在读取数据时没有足够的数据可用,它将一直等待直到读取指定数量的字节或者遇到错误。为了避免read函数一直等待的问题,可以使用非阻塞的I/O或者使用select等函数来监视可读取的数据。

3.write函数

man手册查看用法:
函数原型:
在Linux系统中,write()函数是一个用于向文件描述符(file descriptor)写入数据的系统调用函数。

ssize_t write(int fd, const void *buf, size_t count);

参数解析:

fd:可通过open()函数或socket()函数创建。在Linux中,文件和设备都是通过文件描述符来访问的。例如,标准输入(standard input)的文件描述符是0,标准输出(standard output)的文件描述符是1,标准错误(standard error)的文件描述符是2。
buffer:指向要写入数据的缓冲区指针。注意,这里的缓冲区是指一个内存块,可以是栈上的数组变量、堆上动态分配的空间或静态分配的内存等。缓冲区最大长度为SSIZE_MAX,一般情况下为32767字节。
count:指定要写入的数据字节数。如果count为0,则write()函数不进行任何操作并返回0。如果count超过了缓冲区的长度,则只有缓冲区的长度部分的数据会被写入。

四、使用open、read、write操作标准输入输出

标准输入的文件路径是"/dev/stdin",标准输出的文件路径是"/dev/stdout"。使用open函数打开后会得到对应的文件标识符,得到文件描述符后就可以进行相应的读写操作了。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(void)
{
    char buffer[100];
    ssize_t nread;

    // 打开标准输入文件描述符
    int fd = open("/dev/stdin", O_RDONLY);

    // 从标准输入读取数据
    nread = read(fd, buffer, sizeof(buffer) - 1);
    if (nread == -1) {
        printf("read err\n");
    }
    buffer[nread] = '\0';
    printf("Read %zd bytes from standard input: %s", nread, buffer);

    // 关闭标准输入文件描述符
    close(fd);

    // 打开标准输出文件描述符
    fd = open("/dev/stdout", O_WRONLY);

    // 向标准输出写入数据
    char msg[] = "Hello, World!\n";
    ssize_t nwritten = write(fd, msg, sizeof(msg));
    if (nwritten == -1) {
        printf("write err");
    }
    printf("Write %zd bytes to standard output: %s", nwritten, msg);

    // 关闭标准输出文件描述符
    close(fd);
    
    return 0;
}

执行效果:
在这里插入图片描述

总结

本篇文章先介绍了一下文件在Linux中的重要性,然后介绍了几个常用于文件操作的函数,并且使用这几个函数直接操作了标准输入和输出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么!appium安装不上???快来试试这种方法吧!——appium的手动安装步骤教程

前言 相信你不少软件测试行业小伙伴应该在用npm安装appuim或者是cpm安装appuim途中也碰到下面一些报错吧&#xff0c;接下来小陈教你改为手动安装appium吧。 一、手动下载appium安装包 appuim手动安装包下载链接&#xff1a; appium / Appium.app / Downloads — Bitbucket &a…

《Netty》从零开始学netty源码(四十四)之PoolChunk释放内存

free 当PoolChunk需要释放内存空间时可调用free方法&#xff0c;具体的源码过程如下&#xff1a; 在这个过程中最重要的是第三步的collapseRuns方法&#xff0c;当释放了空间以后要更新runsAvail和runAvailsMap的信息&#xff0c;如果handle对应的内存空间的上边界以及下边界是…

什么是AMS?什么是WMS?

AMS和WMS AMS ActivityManagerService是Android系统中一个特别重要的系统服务&#xff0c;也是上层APP打交道最多的系统服务之一&#xff08;几乎所有的APP应用都需要与AMS打交道&#xff09;。 AMS与操作系统中的进程管理和调度模块很像&#xff0c;在Android系统中非常重要…

从“恰当”的项目管理工具中,了解自己的缺点

项目管理工具是为了帮助管理者&#xff0c;但管理者需要了解自己在特定情况下的“缺点”&#xff0c;才能从“恰当”的工具中获得“恰当”的帮助。如果你不知道在某个特定项目中自己&#xff08;作为项目经理&#xff09;的缺点&#xff0c;也不知道自己需要利用哪些好用的项目…

【Python_Opencv图像处理框架】边缘检测、轮廓检测、图像金字塔

写在前面 本篇文章是opencv学习的第四篇文章&#xff0c;主要讲解了边缘及轮廓检测的主要操作&#xff0c;并对两种图像金字塔简单的介绍了一下&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正&#x1f60d; …

Kafka3.0.0版本——生产者数据有序与乱序

目录 一、生产经验数据有序二、生产经验数据乱序2.1、kafka1.x版本之前保证数据单分区有序的条件2.2、kafka1.x版本及以后保证数据单分区有序的条件2.3、kafka1.x版本及以后开启幂等性数据单分区有序的原因 一、生产经验数据有序 单分区内&#xff0c;数据有序。如下图partion…

React之购物车+动态获取参数+Hooks+Redux

1、redux-logger中间件 1️⃣&#xff1a;安装redux-logger依赖包 yarn add redux-logger 2️⃣&#xff1a;在store的配置文件index中配置 import {legacy_createStore as applyMiddleware,applyMiddleware} from reduximport counterReducer from ./counterReducerimport {c…

【论文写作】-我的第一篇论文形成记(投稿过程、课题来源、python与数学学习、实验设计、论文思路建立与写作、回复审稿人)

我的第一篇论文形成记 投稿过程背景记录课题来源-本科毕业设计python及数学学习实验设计调参阶段实验阶段 论文思路建立论文写作回复审稿人总结 投稿过程 2022年12月28日 投AIChE 2023年01月05日 AlChE编辑认为方向不太符合期刊定位&#xff0c;建议投其他期刊 2023年01月06日…

SpringCloud_服务调用OpenFeign和断路器Resilience4J

文章目录 一、负载均衡概论1、服务器负载均衡2、客户端负载均衡3、客户端负载均衡策略(SpringCloudRibbon)4、客户端负载均衡策略(SpringCloudLoadBalancer) 二、SpringCloudOpenFeign服务调用1、OpenFeign服务调用的使用2、OpenFeign服务调用的日志增强3、OpenFeign服务调用超…

Vector - CAPL - 检查DUT发出与dbc定义一致

目录 ChkCreate_UndefinedMessageReceived 代码示例 有回调函数 无回调函数 Trace报文 报告显示 ChkCreate_UndefinedMessage

一维离散小波变换原理和代码实现

基本原理&#xff1a; 离散小波变换&#xff1a;对连续小波变换的尺度因子和时移动因子采用不同的离散条件进行离散&#xff0c;得到Discrete Wavelet Transform(DWT)。降低计算量的同时&#xff0c;保持连续小波变换的光滑性、紧支性、对称性。 离散小波函数&#xff1a; ψ…

脚本函数基础

shell脚本编程系列 函数是一个脚本代码块&#xff0c;可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时&#xff0c;直接写函数名即可。称作调用函数。 创建函数 方式1&#xff1a; function name {commands }name定义了该函数的唯一名称&#xff0…

私有部署、重构企业软件,第四范式发布大模型“式说”

大模型领域再添重要一员&#xff01; 4月26日&#xff0c;第四范式首次向公众展示其大模型产品「式说3.0」&#xff0c;并首次提出AIGS战略&#xff08;AI-Generated Software&#xff09;&#xff1a;以生成式AI重构企业软件。式说将定位为基于多模态大模型的新型开发平台&…

ImageJ 用户手册——第五部分(菜单命令Process)

这里写目录标题 ImageJ 用户手册——第五部分29. Process29.1 Smooth29.2 Sharpen29.3 Find Edges29.4 Find Maxima29.5 Enhance Contrast29.6 Noise29.6.1 Add Noise29.6.2 Add Specified Noise29.6.3 Salt and Pepper29.6.4 Despeckle29.6.5 Remove Outliers29.6.6 Remove Na…

Shell编程条件语句 if case (愿此行终抵群星)

一、Shell条件语句 Shell环境根据命令执行后的返回状态值&#xff08;$?&#xff09;来判断是否执行成功&#xff0c;当返回值为0(真 true)时表示成功&#xff0c;返回值为非0值&#xff08;假 false)时表示失败或异常。 test 命令 更多操作可使用 man test 查看 1.条件表达式…

深度学习论文分享(二)Data-driven Feature Tracking for Event Cameras

深度学习论文分享&#xff08;二&#xff09;Data-driven Feature Tracking for Event Cameras&#xff08;CVPR2023&#xff09; 前言Abstract1. Introduction2. Related Work3. Method3.1. Feature Network3.2. Frame Attention Module3.3. Supervision 4. Experiments5. Con…

焕新时刻,移动云品牌升级燃动十一城

4月25日&#xff0c;在2023移动云大会上&#xff0c;移动云品牌形象全方位焕新&#xff0c;启用新品牌LOGO和品牌标语&#xff0c;在政府领导、院士专家、行业大咖等3000多位参会嘉宾见证下&#xff0c;吹响品牌进阶新号角。 24日晚&#xff0c;移动云品牌焕新亮灯仪式率先在苏…

C语言入门篇——指针篇

目录 1、指针 1.1内存地址 1.2基地址 1.3指针变量 2、指针类型 2.1指针-整数 2.2指针的解引用 3、特殊指针 3.1野指针 3.2空指针 4、指针运算 4.1指针-指针 4.2指针的关系运算 5、指针和数组 6、二级指针 7、指针数组 1、指针 1.1内存地址 内存是电脑上特别重…

剑指offer 26树的子结构

文章目录 题目详情分析判断A中有出现和B相同的结构和节点值递归主体&#xff0c;解决问题 完整代码总结 题目详情 树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节…

合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…