Linux文件I/O:基本概念

Linux是一个开源的操作系统,它提供了一套丰富的文件I/O(输入/输出)接口,让用户和程序可以方便地对文件进行读写操作。文件I/O是操作系统中最基本也最重要的功能之一,它涉及到文件的打开、关闭、读取、写入、定位、锁定等操作。本文将介绍Linux文件I/O的一些基本概念,包括文件描述符、标准输入输出、文件类型、文件权限、文件系统等。

文件描述符

文件描述符(file descriptor)是一个非负整数,它表示一个已打开的文件的引用。每个进程都有一个文件描述符表,用来记录该进程打开的所有文件。当一个进程打开一个文件时,操作系统会分配一个最小的未使用的文件描述符给该文件,并将其加入到文件描述符表中。当一个进程关闭一个文件时,操作系统会释放该文件的文件描述符,并将其从文件描述符表中删除。文件描述符可以用来对文件进行读写操作,也可以用来传递给其他函数或系统调用,例如dup、dup2、fcntl、ioctl等。

文件描述符的分配和释放可以用open和close函数实现,例如:

// 打开一个文件,返回一个文件描述符
int fd = open("test.txt", O_RDONLY); // 以只读方式打开test.txt文件
if (fd == -1) {perror("open"); // 如果打开失败,打印错误信息exit(1); // 退出程序
}// 对文件进行读写操作,使用read和write函数
char buf[1024]; // 定义一个缓冲区
int n = read(fd, buf, sizeof(buf)); // 从文件中读取数据到缓冲区
if (n == -1) {perror("read"); // 如果读取失败,打印错误信息exit(1); // 退出程序
}
printf("Read %d bytes from file: %s\n", n, buf); // 打印读取的数据// 关闭一个文件,释放一个文件描述符
int ret = close(fd); // 关闭文件
if (ret == -1) {perror("close"); // 如果关闭失败,打印错误信息exit(1); // 退出程序
}

标准输入输出

每个进程都有三个预定义的文件描述符,分别是标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。它们的文件描述符分别是0、1和2。标准输入通常是键盘,标准输出和标准错误通常是屏幕。这三个文件描述符可以被重定向,也就是说,可以将它们指向其他的文件或设备。例如,可以使用>或>>符号将标准输出或标准错误重定向到一个文件中,或者使用<符号将一个文件作为标准输入。也可以使用管道(|)符号将一个进程的标准输出作为另一个进程的标准输入,实现进程间的通信。

标准输入输出的重定向和管道可以用shell命令实现,例如:

# 将ls命令的标准输出重定向到filelist.txt文件中,覆盖原有内容
ls > filelist.txt# 将cat命令的标准错误追加到error.log文件中
cat nonexist.txt 2>> error.log# 将test.txt文件作为wc命令的标准输入,统计文件的行数、单词数和字节数
wc < test.txt# 将ps命令的标准输出作为grep命令的标准输入,筛选出包含bash的进程
ps | grep bash

文件类型

Linux中的文件可以分为以下几种类型:

  • 普通文件(regular file):这是最常见的文件类型,它包含了一些数据,可以是文本、二进制、图片、音频、视频等。普通文件的文件名可以是任意的,没有特定的后缀名。普通文件可以用cat、cp、mv、rm等命令进行操作。
  • 目录文件(directory file):这是一种特殊的文件,它用来存储其他文件的信息,包括文件名、大小、类型、权限、时间戳等。目录文件可以看作是一个文件的集合,它可以包含其他的目录文件,形成一个层次结构。目录文件的文件名通常以/结尾,表示它是一个目录。目录文件可以用ls、cd、mkdir、rmdir等命令进行操作。
  • 符号链接文件(symbolic link file):这是一种特殊的文件,它用来指向另一个文件或目录,类似于一个快捷方式。符号链接文件的文件名通常以@结尾,表示它是一个链接。符号链接文件可以用ln、readlink等命令进行操作。
  • 设备文件(device file):这是一种特殊的文件,它用来表示一个物理设备,例如硬盘、键盘、鼠标、打印机等。设备文件可以分为两种,一种是字符设备文件(character device file),它表示一个字符流设备,例如键盘、鼠标等。另一种是块设备文件(block device file),它表示一个块存储设备,例如硬盘、光驱等。设备文件的文件名通常以c或b开头,表示它是一个字符设备或块设备。设备文件可以用lsblk、mount、umount等命令进行操作。
  • 套接字文件(socket file):这是一种特殊的文件,它用来表示一个网络连接,例如TCP、UDP、UNIX等。套接字文件可以用来实现进程间或机器间的通信。套接字文件的文件名通常以=开头,表示它是一个套接字。套接字文件可以用netstat、nc、telnet等命令进行操作。
  • 管道文件(pipe file):这是一种特殊的文件,它用来表示一个内存中的缓冲区,可以用来实现进程间的通信。管道文件有两种,一种是命名管道(named pipe),它有一个文件名,可以被多个进程共享。另一种是匿名管道(anonymous pipe),它没有文件名,只能被父子进程共享。管道文件的文件名通常以|开头,表示它是一个管道。管道文件可以用mkfifo、cat、tee等命令进行操作。

文件类型可以用ls -l命令查看,例如:

# 查看当前目录下的所有文件的类型和权限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目录文件
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符号链接文件
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符设备文件
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 块设备文件
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= #套接字文件

文件权限

Linux中的每个文件都有一组权限,用来控制对该文件的访问。文件权限分为三类,分别是用户权限(user permission)、组权限(group permission)和其他权限(other permission)。每类权限又分为三种,分别是读权限(read permission)、写权限(write permission)和执行权限(execute permission)。读权限表示可以读取该文件的内容,写权限表示可以修改该文件的内容,执行权限表示可以运行该文件(如果是可执行文件)。文件权限可以用ls -l、chmod、chown、chgrp等命令进行查看和修改。

文件权限的表示方法有两种,一种是符号表示法(symbolic notation),它用r、w、x分别表示读、写、执行权限,用-表示没有权限,用u、g、o分别表示用户、组、其他,用+、-、=分别表示添加、删除、设置权限。另一种是数字表示法(numeric notation),它用0-7分别表示没有权限、执行权限、写权限、写执行权限、读权限、读执行权限、读写权限、读写执行权限,用三位数字分别表示用户、组、其他的权限。例如:

# 查看当前目录下的所有文件的权限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目录文件,用户、组、其他都有读写执行权限
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件,用户有读写权限,组、其他只有读权限
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符号链接文件,用户、组、其他都有读写执行权限
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件,用户有读写权限,组、其他只有读权限
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符设备文件,用户、组、其他都有读写权限
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 块设备文件,用户、组有读写权限,其他没有权限
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= # 套接字文件,用户有读写执行权限,组、其他只有执行权限# 修改file文件的权限,使用户、组、其他都有读写权限,使用符号表示法
chmod ugo+rw file# 修改dir目录的权限,使用户有读写执行权限,组有读执行权限,其他没有任何权限,使用数字表示法
chmod 740 dir

文件系统

Linux中的文件系统是一种用来组织和管理文件的方式,它定义了文件的存储、访问和操作的规则。Linux支持多种文件系统,例如ext2、ext3、ext4、xfs、btrfs、fat、ntfs等。每种文件系统都有自己的特点和优缺点,例如性能、可靠性、兼容性等。文件系统可以用mkfs、fsck、mount、umount等命令进行创建、检查、挂载和卸载。

文件系统的创建可以用mkfs命令实现,它可以指定文件系统的类型、大小、标签等参数,例如:

# 创建一个ext4类型的文件系统,大小为1G,标签为data,分配给/dev/sdb1分区
mkfs -t ext4 -L data -b 1024 /dev/sdb1

文件系统的检查可以用fsck命令实现,它可以检测和修复文件系统的错误,例如:

# 检查并修复/dev/sdb1分区的文件系统,使用交互模式,询问用户是否修复
fsck -t ext4 -r /dev/sdb1

文件系统的挂载可以用mount命令实现,它可以将一个文件系统关联到一个目录,使之可以被访问,例如:

# 挂载/dev/sdb1分区的文件系统到/mnt/data目录,使用默认选项
mount /dev/sdb1 /mnt/data

文件系统的卸载可以用umount命令实现,它可以将一个文件系统和一个目录解除关联,使之不再被访问,例如:

# 卸载/mnt/data目录的文件系统,使用默认选项
umount /mnt/data

 

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

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

相关文章

centos无法进入系统之原因解决办法集合

前言 可爱的小伙伴们&#xff0c;由于精力有限&#xff0c;暂时整理了两类。如果没有你遇到的问题也没有关系&#xff0c;欢迎底下留言评论或私信&#xff0c;小编看到后第一时间帮助解决 一. Centos 7 LVM xfs文件系统修复 情况1&#xff1a; [sda] Assuming drive cache:…

Bean基本注解开发

Commponent 使用Component注解代替<bean>标签 <!--注解扫描:扫描指定的基本包及其子包下的类&#xff0c;识别使用了Component注解的文件--><context:component-scan base-package"org.xfy"></context:component-scan> package org.xfy.Dao.…

【Web】preg_match绕过相关例题wp

目录 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 简单回顾一下基础 参考文章 p牛神文 preg_match绕过总的来讲就三块可利用 数组绕过、PCRE回溯次数限制、换行符 ①[FBCTF 2019]rceservice 先贴出附件给的源码 &l…

使用electron工具打包web端到PC端应用程序

根据electron官网快速入门示例可以方便的构建mac端包&#xff0c;我们在此基础上构建windows端exe包. 1在package.json文件的script字段增加以下配置 "scripts": {..."build": "electron-builder --win"}, 2然后在终端执行以下命令 npm run b…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳转&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年开发&#xff0c;是一种工业现场总线协议标准。 Modbus 通信协议具有多个变种&#xff0c;支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的…

基于STM32的数字图像处理与模式识别算法优化

基于STM32的数字图像处理与模式识别算法优化是一项涉及图像处理和机器学习领域的研究任务&#xff0c;旨在实现高效的图像处理和模式识别算法在STM32微控制器上的运行。本文将介绍基于STM32的数字图像处理与模式识别算法优化的原理和实现步骤&#xff0c;并提供相应的代码示例。…

图神经网络与图注意力网络

随着计算机行业和互联网时代的不断发展与进步&#xff0c;图神经网络已经成为人工智能和大数据的重要研究领域。图神经网络是对相邻节点间信息的传播和聚合的重要技术&#xff0c;可以有效地将深度学习的理念应用于非欧几里德空间的数据上。本期推送围绕图神经网络与图注意力网…

dockerfile多阶段构建

我理解多阶段构建 多阶段构建就是为了镜像更小更容易维护&#xff0c;易读&#xff0c;最终从一个阶段的核心内容复制到另一个阶段&#xff0c;而不必需要那些非核心的内容。 举例说明 FROM registry.cn-hangzhou.aliyuncs.com/2qqq/node:14 as build COPY ./app WORKDIR /app…

RK3588平台开发系列讲解(嵌入式AI篇)嵌入式AI模型的部署

文章目录 一、嵌入式AI模型的部署二、AI模型训练框架有哪些三、rknn-toolkit可支持转换的模型沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍嵌入式AI模型的部署。 一、嵌入式AI模型的部署 模型的部署,是指将训练好的模型放到运行环境中进行推理的…

【11月比赛合集】48场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;9场比赛&#xff09;阿里天池&#xff08;…

PHP curl常见CURLESSLCACERT (60)错误及get,post实例

常见的 CURLE_SSL_CACERT (60) 错误&#xff0c; 解决办法&#xff1a; 从 https://curl.haxx.se/ca/cacert.pem (opens new window)下载最新的 可直接下载2022 年 3 月 22 日 配置 php.ini 文件&#xff0c;搜索 [curl] &#xff0c;在下方添加 curl.cainfo "D:\php…

HarmonyOS(三)—— 应用程序入口—UIAbility

前言 学习过android的同学都是知道Activity&#xff0c;Activity是Android组件中最基本也是最为常见用的四大组件之一&#xff0c;用户可以用来交互为了完成某项任务。 Activity中所有操作都与用户密切相关&#xff0c;是一个负责与用户交互的组件&#xff0c;可以通过setCon…

10个容易被忽视的FastAPI实用功能

大家好&#xff0c;FastAPI是一种现代、高性能的Python Web框架&#xff0c;用于构建Web应用程序和API。它基于Python的异步编程库asyncio和await语法&#xff0c;以及类型注解和自动文档生成等特性&#xff0c;提供了快速、易用和可靠的开发体验&#xff0c;接下来本文将介绍1…

ElasticSearch之Nodes info API

查看当前集群中各节点的信息&#xff0c;执行如下命令&#xff1a; curl -X GET "https://localhost:9200/_nodes?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"本接口允许指定节点和指标。 当前支持的指标&#…

机器视觉公司为什么宁愿高薪招新人,也不愿加薪留老员工?老员工特殊时间特殊照顾,新人必须常照顾

​职场常出现的“薪酬倒挂”现象。其实这是正常的职场规律&#xff0c;实际上是企业管理不得不面对的一种选择。 很多企业宁愿老员工离职也不加薪&#xff0c;却高薪请新员工&#xff1f;这就是职场上的鲶鱼效应&#xff0c;一些高层领导认为一个企业&#xff0c;老员工好比沙…

基本的弹层,点击弹出

<div class"role"><el-button type"primary" size"mini" click"showDialog true">添加角色</el-button></div><!--控制弹框的显示隐藏visible .sync可以点击X关闭弹框 --> <el-dialog width"…

Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

文章目录 数据聚合聚合的种类DSL实现聚合RestAPI实现聚合 自动补全拼音分词器自定义分词器自动补全查询completion suggester查询RestAPI实现自动补全 数据同步数据同步思路分析实现elasticsearch与数据库数据同步 集群搭建ES集群创建es集群集群状态监控创建索引库1&#xff09…

【RocketMq系列-02】RocketMq的架构解析和高性能设计

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709【二】RocketMq的架构解析和高性能设计/font>https://zhenghuisheng.blog.csdn.net/article/details/134559514 RocketMq的架构解析和高性能设…

CentOS 防火墙查看已开发的端口

在CentOS上&#xff0c;你可以使用 firewall-cmd 命令来查询当前防火墙规则&#xff0c;以查看已经开放的端口。以下是一些常见的查询命令&#xff1a; 查询已开启的端口&#xff1a; sudo firewall-cmd --list-ports这将列出所有已经开启的端口。 查询已开启的服务&#xf…

leetcode:520. 检测大写字母

一、题目&#xff1a; 链接&#xff1a;520. 检测大写字母 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;bool detectCapitalUse(char* word) 二、思路&#xff1a; 本题较为简单&#xff0c;分为三种情况&#xff1a; 1.首字母大写&#xff0c;其余小写 2.首字…