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

MIT 6.1810: Lab util: Unix utilities

手搓巨量代码耗费了我大概10个小时才完成这个lab,但确实让我对Unix系统调用有了新的认知

具体代码实现见 MIT6.1810-whyTeaFo

Boot xv6

简单介绍下xv6操作系统,这是Unix的一个简化版,具体细节在xv6 book中可以了解到,我的其他文章有更新
关于使用方法,在本地目录运行make qemu,编译并运行xv6,就可以进入xv6操作系统的shell

xv6 kernel is booting hart 2 starting hart 1 starting init: starting sh $

按下ctrl + a紧接着按下x退出xv6

sleep

使用系统调用pause即可

sixfive

打印文件内所有被分隔的数字中5或6的倍数,“被分隔”的数字满足其左侧与右侧均为" -\r\t\n./,"中的分隔符,文件开头与结尾被视为隐性的分隔符
e.g. “12 xv6/55,” 中 12 与 55 满足条件,6 由于左侧字符 v 不是分隔符不会被打印

strchr

判断一个字符串中是否含特定字符时,使用char* strchr(const char *s, char c)若找到则返回字符首次出现位置的char*,否则返回0
sixfive.c中判断左右侧字符是否为分隔符,可以转化为判断字符串" -\r\t\n./,"中是否含左右侧字符

intisSeparators(charc){returnstrchr(separators,c)!=0;}

memdump

关于C语言指针的练习,下面分别列举每个要求的实现思路

i: print the next 4 bytes of the data as a 32-bit integer, in decimal.
32位整数用int存储,十进制打印使用%d
p: print the next 8 bytes of the data as a 64-bit integer, in hex.
64位整数在"kernel/types.h"中定义为uint64,十六进制打印使用%lx
h: print the next 2 bytes of the data as a 16-bit integer, in decimal.
16位整数在"kernel/types.h"中定义为uint16,十进制打印使用%d
c: print the next 1 byte of the data as an 8-bit ASCII character.
字符用char存储,字符打印使用%c
s: the next 8 bytes of the data contain a 64-bit pointer to a C string; print the string.
64位指针用定义在"kernel/types.h"中的uint64存储,字符串打印使用%s
S: the rest of the data contains the bytes of a null-terminated C string; print the string.
字符串打印使用%s

find

递归寻找当前目录和当前目录的子目录中,文件名为filename的文件
Unix在当前目录的子目录中包含了...这两个目录,为防止无限递归,需要跳过递归这两个目录的中的文件

memmove & strcpy

在复制字符串时,明确知道当前指针结尾有'\0',且两个字符串之间没有重合部分,采用strcpy,strcpy保证了将字符串末尾的'\0'也复制过去

char*strcpy(char*s,constchar*t){char*os;os=s;while((*s++=*t++)!=0)// 若字符串有重合部分,更新s时可能覆盖t中未复制的值;returnos;}

其他情况则使用memmove,需要计算复制内存的长度,不需要考虑内存重合部分,memmove函数会自己处理

void*memmove(void*vdst,constvoid*vsrc,intn){char*dst;constchar*src;dst=vdst;src=vsrc;if(src>dst){//灵活选择从前向后/从后向前复制保证复制过程不受重合部分影响while(n-->0)*dst++=*src++;}else{dst+=n;src+=n;while(n-->0)*--dst=*--src;}returnvdst;}

close(fd)

打开fd记得关闭close(fd)!!!
打开fd记得关闭close(fd)!!!
打开fd记得关闭close(fd)!!!

exec

为find添加-exec选项,使得find [directory] [filename] -exec [cmd]不打印找到的每个filename文件的路径,而是cmd filename的结果
更改filename函数签名,添加变量int cmd_flag, char* cmd_argv[]记录是否含-exec选项和要执行的命令

最后贴一个./grade-lab-util的成功 结果

http://www.jsqmd.com/news/759573/

相关文章:

  • 别再为VTK+Qt编译报错头疼了!手把手教你解决‘VTKCOMMONEXECUTIONMODEL_EXPORT’等常见库引用问题
  • 创业团队如何借助Taotoken多模型聚合能力低成本验证产品创意
  • WindowResizer实战秘籍:三步解决Windows窗口尺寸困扰
  • ADXL372数据手册没细说的那些事:手把手教你配置高通/低通滤波器与ODR(附避坑指南)
  • win11拒绝弹出广告设置和后台运行
  • 告别开机龟速!详解/etc/fstab配置:为什么我推荐你用UUID而不是/dev/sdb来挂载磁盘
  • 如何让经典游戏在现代Windows重获新生:IPXWrapper终极指南
  • 【2026年最新600套毕设项目分享】基于微信小程序的社区门诊管理系统(30227)
  • 电机械制动系统振动故障检测与减振分析试验研究【附代码】
  • 隐藏ip进网站,隐藏ip进网站的作用
  • 别再手动备份数据湖了!用LakeFS+MinIO搭建你的第一个Git式数据仓库(保姆级教程)
  • Taotoken 审计日志功能在满足企业合规与安全审计要求中的应用价值
  • 为什么你的.NET 9项目无法启用低代码调试?7个被忽略的.csproj配置陷阱与修复清单
  • claw.events:为AI智能体设计的实时消息总线,简化分布式通信
  • 基于数字孪生的掘进机截割头故障诊断深度学习【附代码】
  • FigmaCN:3分钟让英文Figma变中文,设计师的终极翻译神器
  • flv.js:在Web浏览器中实现高性能FLV播放的技术解析与实践指南
  • 解锁学习密码:男孩女孩的兴趣养成与软件指南
  • 向量引擎才是AI Agent的隐藏主角:别只追热点,真正的机会藏在“知识连接”里
  • 教育科技产品如何利用 Taotoken 实现自适应学习路径的 AI 推荐
  • 终极Switch游戏文件管理神器:NSC_BUILDER让你的游戏库井井有条
  • 考虑驾驶风格的混合驾驶交通流换道策略ACO-BP【附代码】
  • 再学串串(五):谁会不喜欢可爱的小马(拉车)呢?
  • 安卓虚拟摄像头VCAM:5个步骤解决摄像头替换与隐私保护问题
  • 用了这个AI视频智能分割工具,我批量处理素材的效率提升了10倍!(附详细教程)
  • PostgreSQL备份进阶:避坑指南,物理逻辑备份选择,分钟级误删恢复详解
  • SkillLite AI 智能体提示和记忆自进化演示
  • 从Matlab验证到FPGA实现:CORDIC算法的精度、速度与资源权衡实战分析
  • WarcraftHelper终极指南:让魔兽争霸III在现代电脑上重生
  • linux增加SWAP虚拟内存