当前位置: 首页 > news >正文

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate

Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c.

题目要求:实现find ,即在某个路径中,找出某个文件

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"
#include "kernel/fcntl.h"char* fmt_name(char *path){static char buf[DIRSIZ+1];char *p;//find first character after last slashfor(p=path+strlen(path);p>=path&&*p!='/';p--);p++;memmove(buf,p,strlen(p)+1);return buf;
}void eq_print(char *fileName,char *findName){if(strcmp(fmt_name(fileName),findName)==0){printf("%s\n",fileName);}
}
void find(char *path,char *findName){char buf[512], *p;int fd;struct dirent de;struct stat st;if((fd = open(path, O_RDONLY)) < 0){fprintf(2, "ls: cannot open %s\n", path);return;}if(fstat(fd, &st) < 0){fprintf(2, "ls: cannot stat %s\n", path);close(fd);return;}/*int fd;声明一个文件描述符变量 fd,用于在程序中表示打开的文件或目录。struct dirent de;定义了一个结构体 dirent 变量 de,通常用于存储读取目录时的目录项信息。struct stat st;:定义了一个结构体 stat 变量 st,用于存储文件或目录的状态信息。if((fd = open(path, O_RDONLY)) < 0){ ... }:尝试以只读模式打开指定路径的文件或目录。如果 open() 函数返回的文件描述符小于 0(表示打开失败),则输出错误信息,并返回。if(fstat(fd, &st) < 0){ ... }:如果文件或目录成功打开,则使用 fstat() 函数获取文件描述符 fd 对应文件或目录的状态信息,并将结果存储在 st 结构体中。如果获取状态信息失败(fstat() 返回值小于 0),则输出错误信息,并关闭文件描述符后返回。  */switch(st.type){case T_DEVICE:case T_FILE:eq_print(path,findName);break;case T_DIR:if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){printf("find: path too long\n");break;}strcpy(buf, path);p = buf+strlen(buf);*p++ = '/';while(read(fd, &de, sizeof(de)) == sizeof(de)){if(de.inum ==0||de.inum==1||strcmp(de.name,".")==0 || strcmp(de.name,"..")==0)continue;memmove(p, de.name, strlen(de.name));p[strlen(de.name)] = 0;find(buf,findName);}break;
/*循环:遍历目录项 read(fd, &de, sizeof(de)):使用read函数从文件描述符 fd中读取一个目录项的内容,并将读取的内容存储在 de 变量中。只要 read 函数成功读取一个目录项的大小(sizeof(de)),就会继续执行循环。循环内部:首先,通过检查 de.inum(目录项的inode号码)是否等于0或1,以及检查目录项的名称是否是.或..,来过滤掉特殊的目录项。.(点)表示当前目录,..(点点)表示父目录,它们在此处被跳过,不做进一步处理。如果目录项既不是特殊目录项.(点)或 ..(点点),也不是 inode 号码为 0 或 1,则会执行以下操作:memmove(p, de.name, strlen(de.name));:将目录项的文件名 de.name 复制到一个指定的缓冲区 buf 中,从指针 p 指向的位置开始存储。这里使用 memmove 函数是为了确保将文件名正确复制到指定的位置。p[strlen(de.name)] = 0;:在复制文件名后,将字符串末尾添加一个空字符 \0,以确保字符串以空字符结尾,形成一个 C 风格的字符串。最后,调用 find(buf, findName);,以递归方式在当前路径下的子目录中继续查找名为 findName 的文件或目录。在当前目录下的每个子目录中进行深度优先的查找操作。
*/}close(fd); 
}
/*
void find(char *path, char *findName):递归函数,接收两个参数,path 表示要搜索的路径,findName 表示要查找的文件或目录名。
代码开始通过 open() 函数尝试打开指定的路径,如果失败则会输出错误信息并返回。
使用 fstat() 函数获取文件的状态信息,如果失败也会输出相应的错误信息并关闭文件描述符后返回。
接下来 定义了一个缓冲区buf和指针p,用于构建要查找的文件或目录的完整路径。
使用 switch 语句检查文件类型:
T_FILE:表示当前路径是一个文件,则调用 eq_print() 函数
T_DIR:表示当前路径是一个目录,则进行目录的遍历和递归查找。首先检查路径长度是否过长,如果是,则输出相应错误信息。然后将当前路径复制到 buf 中,并在其末尾添加 /。接着使用 read() 函数读取目录项,并在循环中遍历目录下的所有文件和子目录。在目录遍历的循环中,会检查每个目录项的 inum 值是否为0或1(通常表示未使用的或损坏的inode),以及是否是.或..目录(表示当前目录和父目录).如果是则跳过不处理。
将当前目录项的名字添加到 buf 中,并递归调用 find() 函数,以此在当前目录中查找与 findName 匹配的文件或目录。
最后关闭打开的文件描述符 fd。
*/int main(int argc, char *argv[])
{if(argc>3){printf("find: find <path> <fileName>\n");exit(0);}find(argv[1],argv[2]);exit(0);
}

fmtname函数示意图 

find函数示意图:

 

实验结果:

相关文章:

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求&#xff1a;实现find &#xff0c;即在某个路径中&#xff0c;找出某…...

百度爬虫的工作原理解析

百度作为中国最大的搜索引擎&#xff0c;其工作原理备受关注。本文将深入探讨百度爬虫的工作原理&#xff0c;介绍其基本流程以及关键技术&#xff0c;帮助读者更好地理解搜索引擎背后的技术核心。 百度爬虫是百度搜索引擎的重要基石&#xff0c;它们被广泛用于收集互联网上的网…...

Linux入门必备指令

Linux学习之路起始篇——Linux基本指令 文章目录 Linux学习之路起始篇——Linux基本指令**一、ls指令****二、pwd命令****三、cd命令****四、touch指令****五、mkdir命令****六、rm命令****七、man 命令****八、cp命令****九、mv命令****10、cat 指令****十一、tac命令** 前言&…...

linux系统环境下mysql安装和基本命令学习

此篇文章为蓝桥云课--MySQL的学习记录 块引用部分为自己的实验部分&#xff0c;其余部分是课程自带的知识&#xff0c;链接如下&#xff1a; MySQL 基础课程_MySQL - 蓝桥云课 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多&am…...

Monitor 原理

每个 Java 对象都可以关联一个 Monitor 对象&#xff0c;如果使用 synchronized 给对象上锁&#xff08;重量级&#xff09;之后&#xff0c;该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。 Monitor组成内容 EntryList&#xff08;入口列表&#xff09; 当一个线…...

Java核心知识点整理大全7-笔记

目录 4.1.9. JAVA 锁 4.1.9.1. 乐观锁 4.1.9.2. 悲观锁 4.1.9.3. 自旋锁 4.1.9.4. Synchronized 同步锁 Synchronized 作用范围 Synchronized 核心组件 Synchronized 实现 4.1.9.5. ReentrantLock Lock 接口的主要方法 非公平锁 公平锁 ReentrantLock 与 synchronized …...

Flink Operator 使用指南 之 全局配置

背景 在上一个章节中已经介绍了基本的Flink-Operator安装,但是在实际的数据中台的项目中,用户可能希望看到Flink Operator的运行日志情况,当然这可以通过修改Flink-Operator POD的文件实现卷挂载的形势将日志输出到宿主机器的指定目录下,但是这种办法对数据中台的产品不是…...

手把手教你通过CODESYS V3进行PLC编程(一)

教程背景 宏集MC系列模块化控制器是基于Raspberry Pi的高性能4核控制器&#xff0c;运动控制循环时间最快可达500微秒&#xff0c;实现了计算能力和成本之间的最佳平衡&#xff0c;适用于多轴运动控制和CNC控制。 教程目的 本系列教程将使用宏集MC系列控制器&#xff0c;详细…...

《算法通关村—进制转换问题处理模板》

《算法通关村—进制转换问题处理模板》 先来一个题热热身 504. 七进制数 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; …...

python接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…...

s28.CentOS、Ubuntu、Rocky Linux系统初始化脚本v6版本

CentOS、Ubuntu、Rocky系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell 可以去上面的Gitee或Github仓库代码拉取脚本。 版本功能v6版更新内容1.由于CentOS 6…...

go同步锁 sync mutex

goroutine http://127.0.0.1:3999/concurrency/11 go tour 到此 就结束了. 继续 学习 可以 从 以下网站 文档 https://golang.org/doc/ https://golang.org/doc/code https://golang.org/doc/codewalk/functions/ 博客 https://go.dev/blog/ wiki 服务器教程 服务器…...

使用项目自动生成的dokcerfile第一次构建时把加载aps5.0失败无法找到加载的文件

第一次构建初始化项目自带的dockerfile,内容如下: #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.#FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #WORKDIR /a…...

ACREL DC energy meter Application in Indonesia

安科瑞 华楠 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuring current,voltage and energy together with hall current sensor. 1.Project Overview This company is located in Indonesia a…...

报错!Jupyter notebook 500 : Internal Server Error

Jupyter notebook 报错 500 : Internal Server Error 问题背景 tensorflow-gpu环境&#xff0c;为跑特定代码专门开了一个环境&#xff0c;使用conda安装了Jupyter notebook&#xff0c;能够在浏览器打开Jupyter notebook&#xff0c;但是notebook打开ipynb会报错。 问题分析…...

2023.11.21使用<button>元素来触发form表单和数据提交

2023.11.21使用&#xff1c;button&#xff1e;元素来触发form表单和数据提交 除了使用<input>中的submit方式进行form表单和数据提交&#xff0c;还可以使用button方式&#xff0c;两种方式视使用场景&#xff0c;各有优点。 方法一&#xff1a;可以将<button>放…...

leetcode:504. 七进制数

一、题目&#xff1a; 链接&#xff1a; 504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; char* convertToBase7(int num) 二、思路 本题要将十进制数转换为二进制数&#xff0c;只要将十进制num数模7再除7&#xff0c;直到num等于0 每次将模7的结…...

centos安装指定版本docker

centos7安装指定版本的docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、设…...

PPT幻灯片里的图片,批量提取

之前分享过如何将PPT文件导出成图片&#xff0c;今天继续分享PPT技巧&#xff0c;如何提取出PPT文件里面的图片。 首先&#xff0c;我们将PPT文件的后缀名&#xff0c;修改为rar&#xff0c;将文件改为压缩包文件 然后我们将压缩包文件进行解压 最好是以文件夹的形式解压出来…...

《Fine-Grained Image Analysis with Deep Learning: A Survey》阅读笔记

论文标题 《Fine-Grained Image Analysis with Deep Learning: A Survey》 作者 魏秀参&#xff0c;南京理工大学 初读 摘要 与上篇综述相同&#xff1a; 细粒度图像分析&#xff08;FGIA&#xff09;的任务是分析从属类别的视觉对象。 细粒度性质引起的类间小变化和类内…...

Linux系统下Filezilla FTP客户端的两种高效部署方案

1. 为什么选择Filezilla作为Linux平台的FTP客户端&#xff1f; 作为Linux用户&#xff0c;我们经常需要在服务器之间传输文件。虽然命令行工具如scp、sftp也能完成工作&#xff0c;但图形化客户端在批量文件操作和可视化管理方面优势明显。Filezilla作为老牌开源FTP解决方案&am…...

Next.js全栈开发模板:PostgreSQL+NextAuth+Tailwind一站式解决方案

1. 项目概述&#xff1a;一个现代化的全栈开发起点如果你最近在寻找一个能快速启动全栈Web应用开发的模板&#xff0c;那么由Vercel官方维护的这个“Next.js Postgres NextAuth Tailwind CSS”模板&#xff0c;很可能就是你一直在找的那个“瑞士军刀”。这不仅仅是一个简单的…...

使用Taotoken平台后API调用延迟与稳定性的实际体感观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken平台后API调用延迟与稳定性的实际体感观察 1. 迁移背景与初始考量 我们团队的一个内部知识库问答应用&#xff0c;原…...

GitHub MDC文件渲染优化:基于UserScript的Markdown预览增强方案

1. 项目概述&#xff1a;让GitHub读懂Cursor的“规则文件”如果你和我一样&#xff0c;是Cursor的深度用户&#xff0c;那你肯定没少和.mdc文件打交道。这些文件是Cursor AI的“规则集”&#xff08;Cursor Rules&#xff09;&#xff0c;本质上就是一份用Markdown语法写的项目…...

免费抠图软件一键抠图无水印有哪些?2026年最实用工具对比测试

最近很多粉丝问我&#xff0c;有没有真正免费、无水印、操作简单的抠图软件&#xff1f;说实话&#xff0c;市面上的抠图工具五花八门&#xff0c;但真正好用的没几个。我这次花了不少时间测试了十多款抠图软件&#xff0c;今天就把我的真实体验分享给大家。为什么你需要一个好…...

从DenseNet到特征复用:揭秘密集连接如何重塑卷积网络

1. 密集连接&#xff1a;卷积网络的第三次进化 记得我第一次跑图像分类任务时&#xff0c;用的还是传统的VGG网络。那时候为了提升准确率&#xff0c;只能不断堆叠卷积层&#xff0c;结果模型体积像吹气球一样膨胀到500MB。直到2017年遇到DenseNet&#xff0c;才发现原来只需要…...

如何让老旧安卓电视焕发新生:mytv-android实现流畅播放体验的完整指南

如何让老旧安卓电视焕发新生&#xff1a;mytv-android实现流畅播放体验的完整指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中那台反应迟钝、启动缓慢的旧电视而烦恼…...

Eclipse构建后处理:从ELF到HEX的自动化转换实践

1. 为什么需要从ELF转换到HEX&#xff1f; 在嵌入式开发领域&#xff0c;特别是汽车电子控制器&#xff08;ECU&#xff09;开发中&#xff0c;我们经常会遇到两种关键的可执行文件格式&#xff1a;ELF和HEX。ELF&#xff08;Executable and Linkable Format&#xff09;是编译…...

百度网盘群晖套件终极指南:3步实现NAS云存储完美整合

百度网盘群晖套件终极指南&#xff1a;3步实现NAS云存储完美整合 【免费下载链接】synology-baiduNetdisk-package 项目地址: https://gitcode.com/gh_mirrors/sy/synology-baiduNetdisk-package 想在群晖NAS上直接管理百度网盘文件&#xff1f;这个开源套件让你轻松实…...

【实战指南】Ubuntu SSH服务配置与XShell/Xftp高效连接全解析

1. 为什么需要SSH远程连接Ubuntu&#xff1f; 作为开发者或运维人员&#xff0c;我们经常需要管理远程服务器。想象一下&#xff0c;你正在咖啡馆用Windows笔记本&#xff0c;突然需要紧急修改线上Ubuntu服务器的配置——这时候SSH就是你的救命稻草。它就像一把安全钥匙&#x…...