MIT 6.1810: Lab util: Unix utilities
手搓巨量代码耗费了我大概10个小时才完成这个lab但确实让我对Unix系统调用有了新的认知具体代码实现见 MIT6.1810-whyTeaFoBoot xv6简单介绍下xv6操作系统这是Unix的一个简化版具体细节在xv6 book中可以了解到我的其他文章有更新关于使用方法在本地目录运行make qemu编译并运行xv6就可以进入xv6操作系统的shellxv6 kernel is booting hart 2 starting hart 1 starting init: starting sh $按下ctrl a紧接着按下x退出xv6sleep使用系统调用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*否则返回0sixfive.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存储十进制打印使用%dp: print the next 8 bytes of the data as a 64-bit integer, in hex.64位整数在kernel/types.h中定义为uint64十六进制打印使用%lxh: print the next 2 bytes of the data as a 16-bit integer, in decimal.16位整数在kernel/types.h中定义为uint16十进制打印使用%dc: print the next 1 byte of the data as an 8-bit ASCII character.字符用char存储字符打印使用%cs: the next 8 bytes of the data contain a 64-bit pointer to a C string; print the string.64位指针用定义在kernel/types.h中的uint64存储字符串打印使用%sS: the rest of the data contains the bytes of a null-terminated C string; print the string.字符串打印使用%sfind递归寻找当前目录和当前目录的子目录中文件名为filename的文件Unix在当前目录的子目录中包含了...这两个目录为防止无限递归需要跳过递归这两个目录的中的文件memmove strcpy在复制字符串时明确知道当前指针结尾有\0且两个字符串之间没有重合部分采用strcpystrcpy保证了将字符串末尾的\0也复制过去char*strcpy(char*s,constchar*t){char*os;oss;while((*s*t)!0)// 若字符串有重合部分更新s时可能覆盖t中未复制的值;returnos;}其他情况则使用memmove需要计算复制内存的长度不需要考虑内存重合部分memmove函数会自己处理void*memmove(void*vdst,constvoid*vsrc,intn){char*dst;constchar*src;dstvdst;srcvsrc;if(srcdst){//灵活选择从前向后/从后向前复制保证复制过程不受重合部分影响while(n--0)*dst*src;}else{dstn;srcn;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的成功 结果