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

news2025/4/17 13:15:17

知识点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.coloradmin.cn/o/2330744.html

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

相关文章

Python基础——Pandas库

对象的创建 导入 Pandas 时&#xff0c;通常给其一个别名“pd”&#xff0c;即 import pandas as pd。作为标签库&#xff0c;Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说&#xff0c;列表之于字典&#xff0c;就如 NumPy 之于 Pandas。Pandas 中&#xff0c;所有数…

C++: 类型转换

C: 类型转换 &#xff08;一&#xff09;C语言中的类型转换volatile关键字 修饰const变量 &#xff08;二&#xff09;C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI &#xff08;一&#xff09;C语言中的类型转换 在C语言中…

STM32——DAC转换

DAC简介 DAC&#xff0c;全称&#xff1a;Digital-to-Analog Converter&#xff0c;扑指数字/模拟转换器 ADC和DAC是模拟电路与数字电路之间的桥梁 DAC的特性参数 1.分辨率&#xff1a; 表示模拟电压的最小增量&#xff0c;常用二进制位数表示&#xff0c;比如&#xff1a…

Kafka的索引设计有什么亮点

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Kafka的索引设计有什么亮点&#xff1f; Kafka 之所以能在海量数据的传输和处理过程中保持高…

在深度学习中,如何统计模型的 ​​FLOPs(浮点运算次数)​​ 和 ​​参数量(Params)

在深度学习中&#xff0c;统计模型的FLOPs&#xff08;浮点运算次数&#xff09;和参数量&#xff08;Params&#xff09;是评估模型复杂度和计算资源需求的重要步骤。 一、参数量&#xff08;Params&#xff09;计算 参数量指模型中所有可训练参数的总和&#xff0c;其计算与…

Linux之Shell脚本--命令提示的写法

原文网址&#xff1a;Linux之Shell脚本--命令提示的写法-CSDN博客 简介 本文介绍Linux的Shell脚本命令提示的写法。 场景描述 在写脚本时经常会忘记怎么使用&#xff0c;需要进行命令提示。比如&#xff1a;输入-h参数&#xff0c;能打印用法。 实例 新建文件&#xff1a…

Day19 -实例:xcx逆向提取+微信开发者工具动态调试+bp动态抓包对小程序进行资产收集

思路&#xff1a; 拿到源码后的测试方向&#xff1a; Step1、xcx逆向提取源码 00x1 先将曾经使用小程序记录删除 00x2 访问小程序 例&#xff1a;汉川袁老四小程序 00x3 将文件给xcx进行逆向解包 xcx工具的目录下&#xff0c;wxpack文件夹内 Step2、微信开发者工具进行动态…

鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续

飞机大战可以把飞机改成图片&#xff0c;目前包含无敌模式&#xff0c;自动射弹&#xff0c;暂停和继续的功能 代码如下&#xff1a; // 定义位置类 class GamePosition {x: numbery: numberconstructor(x: number, y: number) {this.x xthis.y y} }Entry Component struct…

从基础算力协作到超智融合,超算互联网助力大语言模型研习

一、背景 大语言模型&#xff08;LLMs&#xff09;的快速发展释放出了AI应用领域的巨大潜力。同时&#xff0c;大语言模型作为 AI领域的新兴且关键的技术进展&#xff0c;为 AI 带来了全新的发展方向和应用场景&#xff0c;给 AI 注入了新潜力&#xff0c;这体现在大语言模型独…

M1使用docker制作镜像xxl-job,供自己使用

很苦逼一个情况,m1的docker假如不翻墙&#xff0c;我们找不到xxl-job,所以我们要自己制作 首先先去下载xxl-job源码https://gitee.com/xuxueli0323/xxl-job 你把它拉去到idea中 拉去成功后&#xff0c;进入这个xxl-job目录 执行 mvn clean package -Dmaven.test.skiptrue(这一步…

第一个简易SSM框架项目

引言 这是一个简易SSM整合项目&#xff0c;适合后端入门的练习项目&#xff0c;其中没有太多的业务操作&#xff0c;主要是这个框架&#xff0c;以及编码的顺序&#xff0c;希望大家有所收获 首先需要先配置环境 数据库环境 创建一个存放书籍的数据库表 create database s…

golang 计时器内存泄露问题 与 pprof 性能分析工具

&#xff08;上图用 go tool pprof 工具分析生成&#xff09; 这种会造成内存泄露 因为每次for都会新建一个time对象&#xff0c;只有到期后会被回收。 解决方法&#xff1a;用time.NewTimer与time.Reset每次重新激活定时器 背景 我先贴一下会发生内存泄漏的代码段&#xff0c…

深度学习的下一个突破:从图像识别到情境理解

引言 过去十年&#xff0c;深度学习在图像识别领域取得了惊人的突破。从2012年ImageNet大赛上的AlexNet&#xff0c;到后来的ResNet、EfficientNet&#xff0c;再到近年来Transformer架构的崛起&#xff0c;AI已经能在许多任务上超越人类&#xff0c;比如人脸识别、目标检测、医…

深入解析Spring Boot自动装配:原理、设计与最佳实践

引言 Spring Boot作为现代Java开发中的一股清流&#xff0c;凭借其简洁、快速和高效的特性&#xff0c;迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中&#xff0c;自动装载&#xff08;Auto-configuration&#xff09;无疑是最为耀眼的明珠之一。本文将深入剖析Sp…

【USRP】srsRAN 开源 4G 软件无线电套件

srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括&#xff1a; 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后台管理项目)零基础入门系列第二篇:项目创建和初始化

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…

简单线程池实现

线程池的概念 线程池内部可以预先去进行创建出一批线程&#xff0c;对于每一个线程&#xff0c;它都会周期性的进行我们的任务处理。 线程内部在维护一个任务队列&#xff0c;其中我们外部可以向任务队列里放任务&#xff0c;然后内部的线程从任务队列里取任务&#xff0c;如…

CentOS7 安装 LLaMA-Factory

虚拟机尽量搞大 硬盘我配置了80G&#xff0c;内存20G 下载源码 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git 如果下载不了&#xff0c;可以进入github手动下载&#xff0c;然后在传入服务器。 也可以去码云搜索后下载 安装conda CentOS7安装conda…

最新扣子(Coze)案例教程:最新抖音视频文案提取方法替代方案,音频视频提取文案插件制作,手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb; 星球群同学反馈&#xff0c;扣子平台的视频提取插件已下架&#xff0c;很多智能体及工作流不能使用&#xff0c;斜杠君这里研究了一个替代方案分享给大家。 方案原理&#xff1a;无论是任何视频或音频转文案&#xff0c;我们提取的方式首先都是要…

adb检测不到原来的设备List of devices attached解决办法

进设备管理器-通用串行总线设备 卸载无法检测到的设备驱动 重新拔插数据线