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.mzph.cn/news/100958.shtml

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

相关文章

数据中心供配电及能效管理系统的设计要点

摘要&#xff1a;现代的数据中心中都包括大量的计算机&#xff0c;对于这种场所的电力供应&#xff0c;都要求供电系统需要在所有的时间都有效&#xff0c;这就不同于一般建筑的供配电系统&#xff0c;它是一个交叉的系统&#xff0c;涉及到市电供电、防雷接地、防静电、UPS不间…

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiGRU开普勒算法优化…

Visual Studio 2022新建项目时没有ASP.NET项目

一、Visual Studio 2022新建项目时没有ASP.NET项目 1、打开VS开发工具&#xff0c;选择工具菜单&#xff0c;点击“获取工具和功能” 2、选择“ASP.NET和Web开发”和把其他项目模板&#xff08;早期版本&#xff09;勾选上安装即可

ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com) 这题在移动不被挡板挡住以及不超过边界的情况下&#xff0c;每次走的越多那么次数就越少 只要两个每次都走b-a步&#xff08;已经是不被挡板挡住走的最多了&#xff09;&#xff0c;就不用考虑被挡板挡住的情况&#xff0c;只用单独考虑了&#xff0c;如果…

2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机分类模型

参数输入 输出 栅格 预测为负类的概率 预测为正类的概率 二值化结果 评估结果 ROC曲线

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层&#xff0c;最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

LLVM(5)ORC实例分析

ORC实例总结 总结 因为API茫茫多&#xff0c;逻辑上的一些概念需要搞清&#xff0c;编码时会容易很多。JIT的运行实体使用LLVMOrcCreateLLJIT可以创建出来&#xff0c;逻辑上的JIT实例。JIT实例需要加入运行库&#xff08;依赖库&#xff09;和用户定义的context&#xff08;…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…

点击、拖曳,15分钟搞定BI零售数据分析

早几年做数据分析还很依赖IT&#xff0c;过程复杂、耗时长、灵活性差&#xff0c;但这几年随着BI智能数据分析技术的成长&#xff0c;零售数据分析发生了翻天覆地的变化&#xff0c;其中最直观的一点就是&#xff1a;点击、拖曳&#xff0c;15分钟内就能搞定BI零售数据分析。 …

批量给每一段文字 段落加上符号

批量给每一段文字 段落加上符号 例如 要给下面的内容统一加上[xxxxxxxx] 查找替换–>查找内容 &#xff1a;输入前面统一的标识 替换为&#xff1a;–>特殊格式–>查找内容–>全部替换 先在前面加符号 在后面加符号&#xff1a; 最后效果&#xff1a;

QTableWidget 表格增删数据

QTableWidgetQTableWidgetQTableWidget部分使用方法&#xff0c;如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时&#xff0c;设置了条件判断如正则表达式&#xff0c;若用户输入的数据不合法&#xff0c;则添加失败并提示用户错误的地方&#xff0c;便于用户修…

3.3 使用广播信道的数据链路层

思维导图&#xff1a; 3.3.1 局域网的数据链路层 ### 3.3 使用广播信道的数据链路层 #### 简介 - 广播信道支持一对多通信。 - 局域网技术在20世纪70年代末兴起&#xff0c;现在在计算机网络中占有主导地位。 #### 3.3.1 局域网的数据链路层 **局域网的特点&#xff1a;** 1…

9-AJAX-上-原理详解

一、定义 1、什么是Ajax Ajax&#xff1a;即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与进行少量数据交换&#xff0c;Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。而传统的…

FairGuard游戏加固无缝兼容 Android 14 正式版

北京时间10月4日&#xff0c;谷歌公司在“Made by Google 2023”硬件发布会上公开了新版安卓操作系统—— Android 14 正式版。 为保证产品的加固效果并提供更优质的服务&#xff0c;FairGuard游戏加固团队第一时间组织人员进行了相关测试。 据测试&#xff0c;FairGuard游戏…

架构师选择题--计算机网络

架构师选择题--计算机网络 22年考题21年考题20年考题19年真题2017考题 22年考题 d http:80 https:httpssl &#xff1a;443 b b pop3是邮件接收协议&#xff1a;110 SMTP是邮件发送协议&#xff1a;25 http:80 A 网络隔离&#xff1a;防火墙&#xff08;逻辑&#xff09;&…

聊聊JDK19特性之虚拟线程 | 京东云技术团队

1.前言 在读《深入理解JVM虚拟机》这本书前两章的时候整理了JDK从1.0到最新版本发展史&#xff0c;其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性&#xff0c;在调研JDK19新增特性的时候了解到了虚拟线程这个概念&#xff0c;于是对虚拟线程进行学习整理内…

APK大小缩小65%,内存减少70%:如何优化Android App

APK大小缩小65&#xff05;&#xff0c;内存减少70&#xff05;&#xff1a;如何优化Android App 我们一直在努力为我们的Android应用程序构建MVP产品。在开发MVP产品后&#xff0c;我们发现需要进行应用程序优化以提高性能。经过分析&#xff0c;我们发现了以下可以改进的应用…

提取log文件中的数据,画图

要提取的log格式如下&#xff1a; 代码如下&#xff1a; import reimport matplotlib.pyplot as plt import numpy as npimport argparse from os import path from re import searchclass DataExtractor(object): DataExtrator class def __init__(self, infile, keyword, out…

Docker基本操作【一篇学会项目部署】

文章目录 一、Docker简介二、Docker安装三、配置镜像加速四、Docker部署五、Docker基础操作1. 常见命令2. 操作演示3. 数据卷①nginx的html目录挂载②分析匿名数据卷③MySQL的本地目录挂载 4. 自定义镜像①Dockerfile②构建镜像 5. 网络①常见命令②自定义网络 六、DockerCompo…