Linux系统学习Day04 阻塞特性,文件状态及文件夹查询
知识点4【文件的阻塞特性】
文件描述符 默认为 阻塞 的
比如:我们读取文件数据的时候,如果文件缓冲区没有数据,就需要等待数据的到来,这就是阻塞
当然写入的时候,如果发现缓冲区是满的,也需要等待刷新缓冲区,才可写入,这也是阻塞
注意:阻塞和非阻塞都是对文件而言的,并不是read和write的属性
下面 我来介绍两种设置文件非阻塞的方法:
- 通过open函数再打开文件的时候,设置文件为非阻塞
注意:文件描述符 事先不存在 才使用open的方法
案例1:open打开文件,默认为阻塞特性
这里补充一个知识点,当我们需要 打开终端时,终端的目录是 /dev/tty,下面我们在Linux中查看一下

好了现在我们实现从终端中读数据
代码演示
- 带有阻塞特性
int main(int argc, char const *argv[]){//打开文件int fd = open("/dev/tty",O_RDONLY | O_NONBLOCK);if(fd < 0){perror("open");return 0;}//读取文件到数组printf("非阻塞特性展示\n");printf("请输入字符数据\n");char buf[128] = "";read(fd,buf,sizeof(buf));printf("buf = %s\n",buf);//关闭文件close(fd);return 0;}

可以看到有一个等待的过程
- 非阻塞特性
仅展示主要代码
int fd = open("/dev/tty",O_RDONLY | O_NONBLOCK);

- 使用fcntl函数在文件打开后设置文件为非阻塞
文件描述符 事先存在
fcntl函数介绍
int fcntl(int fd,int cmd,…/*arg*/)
功能介绍
改变已打开文件描述符的文件性质,针对文件描述符提供控制
参数
fd:文件描述符
cmd:操作方式
arg:cmd不同,arg会不同
返回值
成功:不同的cmd,会有不同
失败:-1
cmd:
fcntl函数有5种功能:
1) 复制一个现有的描述符(cmd=F_DUPFD)
2) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
3) 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
4) 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
5) 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)
这里我们设置阻塞特性主要使用 cmd=F_GETFL或F_SETFL
但这里我提一下 文件状态标记和文件描述符标记是不同的,大家可以自行使用ChatGPT搜索区别,若仍有疑问可以评论留言
设置一个存在的文件描述符的阻塞特性的步骤
- fcntl先得到的文件描述符的状态标记
- 修改文件的状态标记
- 将修改后的状态标记应用到文件描述符上
代码演示
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(int argc, char const *argv[]){//提取文件状态标记int flag = fcntl(0,F_GETFL);//处理文件状态标记flag = flag | O_NONBLOCK;//应用文件状态标记fcntl(0,F_SETFL,flag);//阻塞特性验证char buf[128] = "";printf("请输入数据\n");read(0,buf,sizeof(buf));printf("buf = %s\n",buf);return 0;}
代码运行结果

知识点5【获取文件状态】
int stat(const char *path,struct stat *buf);
int lstat(const char *path,struct stat *buf);
思想补充
我们能知道如果要想要函数内部修改函数外部的值,参数为指针类型
我们反过来也许知道
如果函数参数是指针类型,我们就需要知道这个函数需要是对其进行赋值操作的
stat和lstat的区别
概念复习
这里帮大家复习一个概念
链接方式分为软链接和硬链接
软连接:类似于快捷方式,操作其链接文件数据,源文件数据也会改变,但是如果源文件被删除,链接文件不能正常使用
软链接:类似于快捷方式,操作其链接文件数据,源文件数据也会改变,但是如果源文件被删除,链接文件不能正常使用
硬链接:类似于文件的拷贝(不是简单的拷贝,有链接),操作其链接文件数据,源文件数据也会改变,但是如果源文件被删除,链接文件能正常使用
区别
当我们查看链接文件的文件信息的时候
stat:会获得源文件的文件信息
lstat:会获得链接文件的文件信息
查看源文件的文件信息的时候,没有区别,最好使用stat
这两个函数的参数,返回值都一样
函数介绍
参数
path:文件的路径及文件名
buf:保存文件信息的结构体
返回值
成功:0
失败:-1




案例1:获取文件的属性、大小
这里主要介绍两种文件模式的判断方式
- 使用宏,这里 的都是宏,我们只需要使用宏函数可以直接判断

- 使用按位与的操作
if((s.st_mode & S_IRWXU) == S_IRWXU)
注意:这里的()必须加,优先级问题
代码演示
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(int argc, char const *argv[]){struct stat s;stat("./text.txt",&s);//方式一判断文件类型if(S_ISDIR(s.st_mode)){printf("text是一个目录\n");}//方式二判断文件类型else if((s.st_mode & S_IFREG) == S_IFREG){printf("text是一个普通文件\n");}//文件权限 有上面的man 2 stat 可知 判断只能使用 方式二if((s.st_mode & S_IRUSR) == S_IRUSR){printf("text文件所有者可读\n");}if((s.st_mode & S_IWUSR) == S_IWUSR){printf("text文件所有者可写\n");}if((s.st_mode & S_IXUSR) == S_IXUSR){printf("text文件所有者可执行\n");}return 0;}
代码运行结果

知识点6【文件目录操作函数】(重点)
常用文件目录操作函数:opendir readdir closedir 下面详细介绍
- 得到文件目录的句柄 opendir
句柄
句柄就是结构体指针
句柄我们在文件操作中也用到过,比如我们得到的FILE*就是一个文件句柄。FILE * 是一个结构体指针,结构体中存储的是文件信息
在文件目录的介绍中,我们先函数介绍功能,然后通过一个整体的项目带大家了解其功能
函数介绍
DIR *opendir(const char *name)
功能
打开一个目录
参数
name:目录名
返回值
成功:返回指向该目录的 结构体的指针(目录句柄)
失败:NULL
- 读取目录readdir
函数介绍
struct dirent *readdir(DIR *dirp)
功能介绍
读取目录,调用一次只能读取一个文件
参数
dirp:opendir的返回值
返回值
成功:目录结构体指针
失败:NULL
struct dirent 结构体介绍

d_type相关数据
- 关闭目录closedir
函数介绍
int close(DIR *dirp)
功能介绍
读取目录,调用一次只能读取一个文件
参数
dirp:opendir的返回值
返回值
成功:0
失败:1
代码演示
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
void readDir(char *name);
int main(int argc, char const *argv[])
{readDir("..");return 0;
}/*** 读取一个目录中的内容** @param const char *name 目录名* @return 添加成功返回 1,否则返回 0*/
void readDir(char *name)
{//打开一个文件夹,并判断打开文件是否有效DIR *dirp = opendir(name);//读取文件夹 循环struct dirent *read_dir; while(read_dir = readdir(dirp)){if((read_dir->d_type & DT_REG) == DT_REG){printf("%s是一个普通文件\n",read_dir->d_name);}else if((read_dir->d_type & DT_DIR) == DT_DIR){//测试时 发现文件夹中有.. 和 . 文件夹,因此去掉if (strcmp(read_dir->d_name, ".") == 0 || strcmp(read_dir->d_name, "..") == 0) {continue; // 跳过本次循环}//处理递归目标目录char dir_name[512] = "";sprintf(dir_name,"%s/%s",name,read_dir->d_name);//printf("dir_name = %s\n",dir_name);printf("\n%s是一个文件夹,它的内部文件为:\n",read_dir->d_name);readDir(dir_name);}}//关闭目录closedir(dirp);
}
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏夹关注,谢谢大家!!!
相关文章:
Linux系统学习Day04 阻塞特性,文件状态及文件夹查询
知识点4【文件的阻塞特性】 文件描述符 默认为 阻塞 的 比如:我们读取文件数据的时候,如果文件缓冲区没有数据,就需要等待数据的到来,这就是阻塞 当然写入的时候,如果发现缓冲区是满的,也需要等待刷新缓…...
Module模块化
导出:export关键字 export var color "red"; 重命名导出 在模块中使用as用导出名称表示本地名称。 import { add } from "./05-module-out.js"; 导入: import关键字 导入单个绑定 import { sum } from "./05-module-out.js&…...
Python基础——Pandas库
对象的创建 导入 Pandas 时,通常给其一个别名“pd”,即 import pandas as pd。作为标签库,Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说,列表之于字典,就如 NumPy 之于 Pandas。Pandas 中,所有数…...
C++: 类型转换
C: 类型转换 (一)C语言中的类型转换volatile关键字 修饰const变量 (二)C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI (一)C语言中的类型转换 在C语言中…...
[ctfshow web入门] 零基础版题解 目录(持续更新中)
ctfshow web入门 零基础版 前言 我在刷题之前没有学过php,但是会python和C,也就是说,如果你和我一样会一门高级语言,就可以开始刷题了。我会以完全没学过php的视角来写题解,你也完全没有必要专门学习php,这…...
【蓝桥杯】动态规划:线性动态规划
1. 最长上升子序列(LIS) 1.1. 题目 想象你有一排数字,比如:3, 1, 2, 1, 8, 5, 6 你要从中挑出一些数字,这些数字要满足两个条件: 你挑的数字的顺序要和原来序列中的顺序一致(不能打乱顺序) 你挑的数字要一个比一个大(严格递增) 问:最多能挑出多少个这样的数字? …...
STM32——DAC转换
DAC简介 DAC,全称:Digital-to-Analog Converter,扑指数字/模拟转换器 ADC和DAC是模拟电路与数字电路之间的桥梁 DAC的特性参数 1.分辨率: 表示模拟电压的最小增量,常用二进制位数表示,比如:…...
Kafka的索引设计有什么亮点
想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Kafka的索引设计有什么亮点? Kafka 之所以能在海量数据的传输和处理过程中保持高…...
在深度学习中,如何统计模型的 FLOPs(浮点运算次数) 和 参数量(Params)
在深度学习中,统计模型的FLOPs(浮点运算次数)和参数量(Params)是评估模型复杂度和计算资源需求的重要步骤。 一、参数量(Params)计算 参数量指模型中所有可训练参数的总和,其计算与…...
智能手表该存什么音频和文本?场景化存储指南
文章目录 为什么需要“场景化存储”?智能手表的定位手机替代不了的场景碎片化的场景存储 音频篇:智能手表该存什么音乐和音频?运动场景通勤场景健康场景 文本篇:哪些文字信息值得放进手表?(部分情况可使用图…...
Linux之Shell脚本--命令提示的写法
原文网址:Linux之Shell脚本--命令提示的写法-CSDN博客 简介 本文介绍Linux的Shell脚本命令提示的写法。 场景描述 在写脚本时经常会忘记怎么使用,需要进行命令提示。比如:输入-h参数,能打印用法。 实例 新建文件:…...
Logo语言的进程
Logo语言的进程与发展 引言 Logo语言是一种专为儿童和教育目的而设计的编程语言,其独特之处在于其简洁的语法和直观的图形化界面,旨在帮助学生理解程序设计的基本概念。由于其在教育领域的广泛应用,Logo语言在编程教育史上占据了重要的地位…...
Day19 -实例:xcx逆向提取+微信开发者工具动态调试+bp动态抓包对小程序进行资产收集
思路: 拿到源码后的测试方向: Step1、xcx逆向提取源码 00x1 先将曾经使用小程序记录删除 00x2 访问小程序 例:汉川袁老四小程序 00x3 将文件给xcx进行逆向解包 xcx工具的目录下,wxpack文件夹内 Step2、微信开发者工具进行动态…...
鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续
飞机大战可以把飞机改成图片,目前包含无敌模式,自动射弹,暂停和继续的功能 代码如下: // 定义位置类 class GamePosition {x: numbery: numberconstructor(x: number, y: number) {this.x xthis.y y} }Entry Component struct…...
ECharts配置优化
优化 ECharts 配置可以从性能优化、视觉优化和可维护性优化三个方面入手,下面我给你详细展开几个实用方向: ✅ 一、性能优化(大数据量 or 页面卡顿时重点考虑) 使用 setOption 的 notMerge 和 lazyUpdate chart.setOption(option,…...
从基础算力协作到超智融合,超算互联网助力大语言模型研习
一、背景 大语言模型(LLMs)的快速发展释放出了AI应用领域的巨大潜力。同时,大语言模型作为 AI领域的新兴且关键的技术进展,为 AI 带来了全新的发展方向和应用场景,给 AI 注入了新潜力,这体现在大语言模型独…...
M1使用docker制作镜像xxl-job,供自己使用
很苦逼一个情况,m1的docker假如不翻墙,我们找不到xxl-job,所以我们要自己制作 首先先去下载xxl-job源码https://gitee.com/xuxueli0323/xxl-job 你把它拉去到idea中 拉去成功后,进入这个xxl-job目录 执行 mvn clean package -Dmaven.test.skiptrue(这一步…...
Spring Boot 集成Redis 的Lua脚本详解
1. 对比Lua脚本方案与Redis自身事务 对比表格 对比维度Redis事务(MULTI/EXEC)Lua脚本方案原子性事务命令序列化执行,但中间可被其他命令打断,不保证原子性Lua脚本在Redis单线程中原子执行,不可中断计算能力仅支持Red…...
第一个简易SSM框架项目
引言 这是一个简易SSM整合项目,适合后端入门的练习项目,其中没有太多的业务操作,主要是这个框架,以及编码的顺序,希望大家有所收获 首先需要先配置环境 数据库环境 创建一个存放书籍的数据库表 create database s…...
Node.js局部生效的中间件
目录 1. 目录结构 2. 代码实现 2.1 安装Express 2.2 app.js - 主文件 2.3 authMiddleware.js - 局部生效的中间件 3. 程序运行结果 4. 总结 在Node.js的Express框架中,局部生效的中间件是指仅在特定路由或路由组中生效的中间件。它可以用于权限验证、数据过滤…...
Nginx 常见面试题
一、nginx常见错误及处理方法 1.1 404 bad request 一般原因:请求的Header过大 解决办法: 配置nginx.conf 相关设置1. client_header_buffer_size 16k; 2. large_client_header_buffers 4 64k;1.2 413 Request Entity Too Large 一般原因࿱…...
golang 计时器内存泄露问题 与 pprof 性能分析工具
(上图用 go tool pprof 工具分析生成) 这种会造成内存泄露 因为每次for都会新建一个time对象,只有到期后会被回收。 解决方法:用time.NewTimer与time.Reset每次重新激活定时器 背景 我先贴一下会发生内存泄漏的代码段,…...
C#调用C++动态库时出现`System.DllNotFoundException`错误的解决思路
文章目录 1. DLL文件路径问题2. 依赖的运行时库缺失3. 平台不匹配(x86/x64)4. 导出函数名称不匹配5. DLL文件损坏或权限问题6. 运行时库冲突(MT/MD不匹配)7. 使用DLLImport时的常见错误总结步骤 在C#中调用C动态库时出现System.Dl…...
深度学习的下一个突破:从图像识别到情境理解
引言 过去十年,深度学习在图像识别领域取得了惊人的突破。从2012年ImageNet大赛上的AlexNet,到后来的ResNet、EfficientNet,再到近年来Transformer架构的崛起,AI已经能在许多任务上超越人类,比如人脸识别、目标检测、医…...
oracle查询是否锁表了
--查看当前数据库中被锁定的表数量 SELECT COUNT(*) FROM v$locked_object; select * from v$locked_object; --查看具体被锁定的表 SELECT b.owner, b.object_name, a.session_id, a.locked_mode FROM v$locked_object a, dba_objects b WHERE b.object_id a.object_id…...
从Oracle和TiDB的HTAP说起
除了数据库行业其他技术群体很多不知道HTAP的 时至今日还是有很多人迷信Hadoop,觉得大数据就是Hadoop。这是不正确的。也难怪这样,很多人OLTP和OLAP也分不清,何况HTAP。 Oracle是垂直方向实现 TiDB是水平方向实现 我个人认为这是两种流派…...
深入解析Spring Boot自动装配:原理、设计与最佳实践
引言 Spring Boot作为现代Java开发中的一股清流,凭借其简洁、快速和高效的特性,迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中,自动装载(Auto-configuration)无疑是最为耀眼的明珠之一。本文将深入剖析Sp…...
初识数据结构——算法效率的“两面性”:时间与空间复杂度全解析
📊 算法效率的“两面性”:时间与空间复杂度全解析 1️⃣ 如何衡量算法好坏? 举个栗子🌰:斐波那契数列的递归实现 public static long Fib(int N) {if(N < 3) return 1;return Fib(N-1) Fib(N-2); }问题…...
【USRP】srsRAN 开源 4G 软件无线电套件
srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括: srsUE - 具有原型 5G 功能的全栈 SDR 4G UE 应用程序srsENB - 全栈 SDR 4G eNodeB 应用程序srsEPC——具有 MME、HSS 和 S/P-GW 的轻量级 4G 核心网络实现 安装系统 Ubuntu 20.04 USRP B210 sudo …...
《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 《从零搭建Vue3项目实战》(AI辅助…...
