Lab 1: Unix utilities汇总

这个实验主要学习了常用的一些系统调用。

Lab 1: Unix utilities

Boot xv6 (easy)

git克隆,切换分支,qemu。根据要求进行操作即可。

$ git clone git://g.csail.mit.edu/xv6-labs-2020
$ cd xv6-labs-2020
$ git checkout util
$ make qemu

sleep (easy)

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"int main(int argc ,char *argv[])
{if(argc < 2 ){fprintf(2,"please enter a number!");exit(1);}else{int n = atoi(argv[1]);sleep(n);exit(0);}}

在 Makefile 中将 sleep 加入构建目标里。

UPROGS=\$U/_cat\$U/_echo\$U/_forktest\$U/_grep\$U/_init\$U/_kill\$U/_ln\$U/_ls\$U/_mkdir\$U/_rm\$U/_sh\$U/_stressfs\$U/_usertests\$U/_grind\$U/_wc\$U/_zombie\$U/_sleep\ .   # here !!!

pingpong (easy)

管道题,使用 fork() 复制本进程创建子进程,然后使用管道进行相互通信。

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"int main(int argc ,char *argv[])
{int pp2c[2],pp2p[2];pipe(pp2c);pipe(pp2p);int n = fork();if(n != 0 ){write(pp2c[1],"a",1);char buff;read(pp2p[0],&buff,1);printf("%d: received pong\n",n);}else{char buff;read(pp2c[0],&buff,1);printf("%d: received ping\n",n);write(pp2p[1],&buff,1);}exit(0);}

primes (moderate) / (hard)

观察下图进行进行理解,使用fork实现素数筛的功能。
在这里插入图片描述

// primes.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"void sieve(int pleft[2]){int p ;read(pleft[0] ,&p,sizeof(p));if(p == -1){exit(0);}printf("prime %d\n", p);int pright[2];pipe(pright);if(fork() == 0){// 子进程close(pright[1]);close(pleft[0]);sieve(pright);}else{close(pright[0]);int buff ;while(read(pleft[0] ,&buff,sizeof(buff)) && buff != -1){if(buff %p != 0 ){write(pright[1] ,&buff,sizeof(buff));}}buff = -1;write(pright[1] ,&buff,sizeof(buff));wait(0);exit(0);}
}int main(int argc,char* argv[]){int inputpipe[2];pipe(inputpipe);if(fork() == 0){// 子进程close(inputpipe[1]);sieve(inputpipe);exit(0);}else{close(inputpipe[0]);int i ;for( i = 2 ; i <=35;i++){write(inputpipe[1] ,&i,sizeof(i) );}i =-1;write(inputpipe[1] ,&i,sizeof(i) );}wait(0);exit(0);
}

find (moderate)

根据ls.c 改造得到

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"void find(char *path,char *target)
{char buf[512], *p;int fd;struct dirent de;struct stat st;if((fd = open(path, 0)) < 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;}switch(st.type){case T_FILE:if(strcmp(path+strlen(path) - strlen(target) ,target) == 0)printf("%s\n", path);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|| strcmp(de.name, ".")==0 || strcmp(de.name, ".." )==0 )continue;memmove(p, de.name, DIRSIZ);//每次循环都会被覆盖p[DIRSIZ] = 0;if(stat(buf, &st) < 0){printf("find: cannot stat %s\n", buf);continue;}// printf(buf);// printf("\n");find(buf, target); // 递归查找}break;}close(fd);
}int main(int argc, char *argv[])
{if(argc < 3){exit(0);}char target[512];target[0] = '/'; // 为查找的文件名添加 / 在开头strcpy(target+1, argv[2]);find(argv[1], target);exit(0);
}

xargs (moderate)

xargs介绍

整体思路:

  • 将xargs命令传入的参数保存至指针数组,每个指针指向一个参数;
  • 解析输入参数,如果遇到’ ’ 或者\n 就将参数保存至指针数组,每次读取完成一行就使用exec进行运行
  • 最后一行进行单独判断运行,万一最后一行没有换行符
// xargs.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"void run(char *program , char ** args)
{if(fork() == 0 ){exec(program,args);exit(0);}return ;
}
int main(int argc,char* argv[]){char buf[2048]; // 读入时使用的内存池char *p = buf, *last_p = buf; // 当前参数的结束、开始指针char *argsbuf[128]; // 全部参数列表,字符串指针数组,包含 argv 传进来的参数和 stdin 读入的参数char **args = argsbuf; // 指向 argsbuf 中第一个从 stdin 读入的参数for(int i=1;i<argc;i++) {// 将 argv 提供的参数加入到最终的参数列表中*args = argv[i];args++;}char **pa = args;while(read(0,p,1) != 0 ){if(*p == ' ' || *p == '\n'){*p = '\0';*(pa++) = last_p;last_p = p+1;if(*p == '\n'){*pa = 0;run(argv[1],argsbuf);pa = args;}}p++;}if(pa != args) { // 如果最后一行不是空行// 收尾最后一个参数*p = '\0';*(pa++) = last_p;// 收尾最后一行*pa = 0; // 参数列表末尾用 null 标识列表结束// 执行最后一行指令run(argv[1], argsbuf);}while(wait(0) != -1) {}; exit(0);
}

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

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

相关文章

idea将jar包deploy到本地仓库

1、pom.xml文件引入配置&#xff0c;如下参考&#xff1a; <distributionManagement><snapshotRepository><id>maven-snapshots</id><url>http://nexus1.coralglobal.cn/repository/maven-snapshots/</url></snapshotRepository><…

唐老师讲电赛

dc-dc电源布局要点

【C++】:日期类实现

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

cesium图标漂移分析与解决

漂移现象如下 什么是图标漂移&#xff1f; 随着视野改变&#xff0c;图标相对于地面发生了相对位置的变化 让人感觉到图标有飘忽不定的感觉 原因分析 图标是静止的&#xff0c;它的位置在世界坐标系中是绝对的、静止的。 漂移大部分的原因是&#xff1a; 透视关系发生了错…

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目&#xff1a;FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址&#xff1a;https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…

gin 框架的 JSON Render

gin 框架的 JSON Render gin 框架默认提供了很多的渲染器&#xff0c;开箱即用&#xff0c;非常方便&#xff0c;特别是开发 Restful 接口。不过它提供了好多种不同的 JSON Render&#xff0c;那么它们的区别是什么呢&#xff1f; // JSON contains the given interface obje…

三、WebGPU Uniforms

三、WebGPU Uniforms Uniform有点像着色器的全局变量。你可以在执行着色器之前设置它们的值&#xff0c;着色器的每次迭代都会有这些值。你可以在下一次请求GPU执行着色器时将它们设置为其他值。我们将再次从第一篇文章中的三角形示例开始&#xff0c;并对其进行修改以使用一些…

【初识Jmeter】【接口自动化】

jmeter的使用笔记1 Jmeter介绍与下载安装介绍安装配置配置与扩展组件 jmeter的使用基本功能元素登陆请求与提取cookie其他请求接口关联Cookie-响应成功聚合报告查看 Jmeter介绍与下载安装 介绍 jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&…

nio 文件传输

transferto方法一次只能传输2个g的数据 文件大于2个g时

C# Windows 窗体控件中的边距和填充

可以将 Margin 属性、Left、Top、Right、Bottom 的每个方面设置为不同的值&#xff0c;也可以使用 All 属性将它们全部设置为相同的值。 在代码中设置Margin&#xff0c;元素的左边设置为5个单位、上边设置为10个单位、右边设置为15个单位和下边设置为20个单位。 TextBox myT…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础&#xff0c;是一个重点和难点&#xff0c;在实际编程中似乎看不它们的身影&#xff0c;但是它们有随处不在&#xff0c;如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记&#xff0c;合集文章列表如下&#…

数据安全防护:云访问安全代理(CASB)

云访问安全代理&#xff08;Cloud Access Security Broker&#xff0c;CASB&#xff09;&#xff0c;是一款面向应用的数据防护服务&#xff0c;基于免应用开发改造的配置方式&#xff0c;提供数据加密、数据脱敏功能。数据加密支持国密算法&#xff0c;提供面向服务侧的字段级…

Springboot+vue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的企业OA管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业OA管理系统&#xff0c;采用M&#xff08;m…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

揭秘 Go 中的 new() 和 make() 函数

Go&#xff08;或 Golang&#xff09;是一种现代、静态类型、编译型的编程语言&#xff0c;专为构建可扩展、并发和高效的软件而设计。它提供了各种内置的函数和特性&#xff0c;帮助开发人员编写简洁高效的代码。其中包括 new() 和 make() 函数&#xff0c;这两个函数乍看起来…

有哪些值得推荐的Java 练手项目?

大家好&#xff0c;我是 jonssonyan 我是一名 Java 后端程序员&#xff0c;偶尔也会写一写前端&#xff0c;主要的技术栈是 JavaSpringBootMySQLRedisVue.js&#xff0c;基于我学过的技术认真的对每个分享的项目进行鉴别&#xff0c;今天就和大家分享我曾经用来学习的开源项目…

【置顶】关于博客的一些公告

所谓 万事开头难&#xff0c;最开始的两个专栏 《微机》 和 《骨骼动作识别》 定价 29.9 &#xff0c;因为&#xff1a; 刚开始确实比较困难&#xff0c;要把自己学的知识彻底搞懂讲给别人&#xff0c;还要 码字排版&#xff0c;从 Markdown 语法开始学起&#xff08;这都是 花…

【Java 进阶篇】CSS 属性

当你学习CSS时&#xff0c;了解CSS属性是非常重要的&#xff0c;因为这些属性控制了网页上元素的外观和布局。本文将详细介绍一些常见的CSS属性&#xff0c;包括文本属性、盒子模型属性、背景和边框属性、定位属性等。我们还将为每个属性提供示例代码&#xff0c;以便你更好地理…

Go 复合类型之字典类型介绍

Go 复合类型之字典类型介绍 文章目录 Go 复合类型之字典类型介绍一、map类型介绍1.1 什么是 map 类型&#xff1f;1.2 map 类型特性 二.map 变量的声明和初始化2.1 方法一&#xff1a;使用 make 函数声明和初始化&#xff08;推荐&#xff09;2.2 方法二&#xff1a;使用复合字…

家政服务行业做开发微信小程序可以实现什么功能

家政服务行业开发微信小程序可以实现多种功能&#xff0c;从而提升服务品质和效率&#xff0c;下面我们来详细介绍一些可能实现的功能。 一、展示服务信息 家政服务微信小程序可以展示各种服务信息&#xff0c;包括各类家政服务项目、价格、服务流程、服务人员信息等。用户可以…