Linux系统学习Day04 阻塞特性,文件状态及文件夹查询

知识点4【文件的阻塞特性】

文件描述符 默认为 阻塞 的

比如:我们读取文件数据的时候,如果文件缓冲区没有数据,就需要等待数据的到来,这就是阻塞

当然写入的时候,如果发现缓冲区是满的,也需要等待刷新缓冲区,才可写入,这也是阻塞

注意:阻塞和非阻塞都是对文件而言的,并不是read和write的属性

下面 我来介绍两种设置文件非阻塞的方法:

  1. 通过open函数再打开文件的时候,设置文件为非阻塞

注意:文件描述符 事先不存在 才使用open的方法

案例1:open打开文件,默认为阻塞特性

这里补充一个知识点,当我们需要 打开终端时,终端的目录是 /dev/tty,下面我们在Linux中查看一下

好了现在我们实现从终端中读数据

代码演示

  1. 带有阻塞特性
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;}

可以看到有一个等待的过程

  1. 非阻塞特性

仅展示主要代码

int fd = open("/dev/tty",O_RDONLY | O_NONBLOCK);

  1. 使用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搜索区别,若仍有疑问可以评论留言

设置一个存在的文件描述符的阻塞特性的步骤
  1. fcntl先得到的文件描述符的状态标记
  2. 修改文件的状态标记
  3. 将修改后的状态标记应用到文件描述符上

代码演示

#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:获取文件的属性、大小

这里主要介绍两种文件模式的判断方式

  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  下面详细介绍

  1. 得到文件目录的句柄 opendir

句柄

句柄就是结构体指针

句柄我们在文件操作中也用到过,比如我们得到的FILE*就是一个文件句柄。FILE * 是一个结构体指针,结构体中存储的是文件信息

在文件目录的介绍中,我们先函数介绍功能,然后通过一个整体的项目带大家了解其功能

函数介绍

DIR *opendir(const char *name)

功能

打开一个目录

参数

name:目录名

返回值

成功:返回指向该目录的 结构体的指针(目录句柄)

失败:NULL

  1. 读取目录readdir

函数介绍

struct dirent *readdir(DIR *dirp)

功能介绍

读取目录,调用一次只能读取一个文件

参数

dirp:opendir的返回值

返回值

成功:目录结构体指针

失败:NULL

struct dirent 结构体介绍

d_type相关数据

  1. 关闭目录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);
}

结束

代码重在练习!

代码重在练习!

代码重在练习!

今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏夹关注,谢谢大家!!!

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

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

相关文章

vue 3 从零开始到掌握

vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…

Mysql专题篇章

一、事务的四大特性&#xff1f; 1、原子性&#xff1a;是指事务包含的所有操作要么全部成功&#xff0c;要么全部失败回滚。 2、一致性&#xff1a;是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有100块&#xff0c;两人之间转账之后无论成功还是失败…

CAD插件实现:自动递增编号(前缀、后缀、位数等)——CADc#实现

cad中大量输入一定格式的递增编号时&#xff0c;可用插件实现&#xff0c;效果如下&#xff1a; ①本插件可指定数字位数、起始号码、加前缀、后缀、文字颜色等&#xff08;字体样式和文字所在图层为cad当前图层和当前字体样式&#xff09;。 ②插件采用Jig方式&#xff0c;即…

k8s1.24升级1.28

0、简介 这里只用3台服务器来做一个简单的集群&#xff0c;当前版本是1.24.17目标升级到1.28.17 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 因为1.24已经更换过了容器运行时&#xff0c;所以之后的升级相对就会简单&am…

4.3-2 jenkins

一.登录jenkins 二.修改密码 三.配置节点 新建节点 编辑节点名称 编辑节点配置 激活节点 将jar下载到指定的路径 再到dos命令下的路径 E:\az\wx 执行 配置节点成功 四. 安全设置中&#xff0c;勾选代理 五.新建项目 编辑项目名称 编辑项目执行的 路径&#xff1a;C:\Users\Ad…

js对象与数组的互转

js对象与数组的互转 文章目录 js对象与数组的互转一、数组转对象1.使用forEach,for in,es6展开运算符,assign2. 使用 Object.fromEntries()3. 将数组转为键值对对象4. 使用 reduce()4. 数组元素为对象时提取属性 二、对象转数组1. 提取键/值/键值对2. 转换为特定结构的数组 三、…

HTTPS在信息传输时使用的混合加密机制,以及共享、公开密钥加密的介绍。

HTTPS在信息传输时使用的混合加密机制&#xff0c;其中包括了共享密钥加密和公开密钥加密&#xff0c;我们先来介绍一下这两种加密方式。 共享密钥加密&#xff08;对称密钥&#xff09; 对称加密是指加密和解密使用的是同一个密钥。就像家里的门锁&#xff0c;钥匙只有一把&…

Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作

文章目录 Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作VECTOR 数据类型基本语法Vector 维度限制和向量大小向量存储格式&#xff08;DENSE vs SPARSE&#xff09;1. DENSE存储2. SPARSE存储3. 内部存储与空间计算 Oracle VECTOR数据类型的声明格式VECTOR基本操…

机器学习——ROC曲线、PR曲线

一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴&#xff08;假正率&#xff0c;FPR&#xff09;&#xff1a; 表示负样本被错误分类为正的比例&#xff08;越小越好&#xff09; 2.纵轴&#xff08;真正率&#xff0c;TPR&#xff0c;即召回率&#xff09;&#xff1a; 表示正样…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__上

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

昂贵的DOM操作:一次DOM导致的性能问题排查记录

公司来了一个前端实习生&#xff0c;踏实&#xff0c;勤快&#xff0c;很快得到老大的认可&#xff0c;分配给她一个需求&#xff0c;大概如下&#xff1a;构建一个公司产品的评论展示页面&#xff0c;页面可以滚动加载新的内容&#xff0c;同时如果已经加载的内容发生变化&…

前端服务配置详解:从入门到实战

前端服务配置详解&#xff1a;从入门到实战 一、环境配置文件&#xff08;.env&#xff09; 1.1 基础结构 在项目根目录创建 .env 文件&#xff1a; # 开发环境 VUE_APP_API_BASE_URL http://localhost:3000/api VUE_APP_VERSION 1.0.0# 生产环境&#xff08;.env.produc…

【学习笔记】计算机网络(七)—— 网络安全

第7章 网络安全 文章目录 第7章 网络安全7.1 网络安全问题概述7.1.1 计算机网络面临的安全性威胁7.1.2 安全的计算机网络7.1.3 数据加密模型 7.2 两类密码体制7.2.1 对称密钥密码体制7.2.2 公钥密码体制 7.3 鉴别7.3.1 报文鉴别7.3.2 实体鉴别 7.4 密钥分配7.4.1 对称密钥的分配…

我用Cursor + DeepSeek + Claude-3.7-Sonnet + DevBox,10分钟开发了一个系统

大家好&#xff0c;我是袁庭新。Cursor最近可谓是火的一塌糊涂&#xff0c;于是我深度体验了一波。我用的环境是Cursor Claude-3.7-Sonnet DevBox&#xff0c;整个过程我一行代码都没有写&#xff0c;10分钟帮我开发了一个系统&#xff0c;且前后端联调一把通过。惊出一身冷汗…

SpringBoot企业级开发之【用户模块-登录】

开发之前我们先看一下接口文档的要求&#xff1a; 开发思路&#xff1a; 开发实操&#xff1a; 因为我们之前开发注册的时候&#xff0c;就有了一些相关的操作&#xff0c;所以在这里我们只需要定义登录的controller即可&#xff1a; //用户登录PostMapping("/login"…

mysql 8.0.27-docker

安装 可以略过本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 镜像查询与安装 先查询&#xff1a; docker search mysql 明显会报错 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…

Pgvector的安装

Pgvector的安装 向量化数据的存储&#xff0c;可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意&#xff1a;在安装vector扩展之前&#xff0c;请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址&#xff1a; https://visualstudio.microso…

Python高阶函数-sorted(深度解析从原理到实战)

一、sorted()函数概述 sorted()是Python内置的高阶函数&#xff0c;用于对可迭代对象进行排序操作。与列表的sort()方法不同&#xff0c;sorted()会返回一个新的已排序列表&#xff0c;而不改变原数据。 基本语法 sorted(iterable, *, keyNone, reverseFalse)二、核心参数详…

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面对ArcGIS Pro/GeoScene Pro复杂的操作界面和脚本开发需求&#xff0c;你是否还在为功能定位、代码调试和效率优化而烦恼&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能将革新你的GIS工作方式&#xff01;无论是界面操作指引、一键生…

如何将本地更改的README文件同步到自己的GitHub项目仓库

如何将本地更改的 README 文件同步到 GitHub 仓库 在你 git clone 下来的工程目录下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 将你的更改Copy到你git下来的工程中&#xff08;上面的命令会自动处理&#xff0c;例如只会C…