6.s081 学习实验记录(二)xv6 and unix utilities

news2024/11/25 15:51:31

文章目录

    • 一、boot xv6
    • 二、sleep
    • 三、pingpong
    • 四、primes
    • 五、find
    • 六、xargs

该实验主要用来熟悉xv6以及其系统调用

一、boot xv6

实验目的:

  • 启动xv6系统,并使用提供的命令
  • ls,列出系统所有的文件
  • ctrl + p,打印当前运行的进程
  • ctrl + a,再按 x,退出qemu

实验结果:
在这里插入图片描述

二、sleep

实验目的:

  • 通过xv6提供的sleep系统调用实现用户层的sleep函数,代码编写在user/sleep.c文件中
  • 需要将sleep添加到Makefile的UPROGS中,这样执行make qemu会将sleep编译
  • ./grade-lab-util sleep 进行验证(在虚拟机中执行,不是在xv6中执行)

实验代码:

#include "kernel/types.h"
#include "user/user.h"


int
main(int argc, char *argv[]){
    int num;
    if(argc != 2){
        fprintf(2, "sleep must have 1 parameters!\n");
        exit(1);
    }
    num = atoi(argv[1]);
    printf("(nothing happens for a little while)\n");
    sleep(num);
    exit(0);
}

需要在Makefile中添加sleep的编译项:
在这里插入图片描述

实验结果:
在这里插入图片描述

三、pingpong

实验要求:

  • 编写一个pingpong程序,父进程发送一个字节给子进程,子进程收到后,打印 < PID>:received ping,然后写一个字节给父进程并退出,父进程收到后打印 < pid>:received pong,然后退出
  • 使用 pipe 创建一对管道
  • 使用 fork创建子进程
  • 使用read、write读写通道
  • 使用 getpid 获取进程ID

实验代码:

#include "kernel/types.h"
#include "user/user.h"


int
main(int argc, char *argv[]){
    char msg = 'm';
    int length = sizeof(msg);
    int p1[2]; //父-->子
    int p2[2]; //子-->父
    pipe(p1);
    pipe(p2);

    if(fork() == 0){
        close(p1[1]);
        close(p2[0]);
        //子进程
        if(read(p1[0], &msg, length) != length){
            printf("child read parent msg error\n");
            exit(1);
        }
        printf("%d: received ping\n", getpid());
        if(write(p2[1], &msg, length) != length){
            printf("child send msg to parent error\n");
            exit(1);
        }
        exit(0);
    }

    close(p1[0]);
    close(p2[1]);
    if(write(p1[1], &msg, length) != length){
        printf("parent send msg to child error\n");
        exit(1);
    }
    if(read(p2[0], &msg, length) != length){
        printf("parent read child msg error\n");
        exit(1);
    }
    printf("%d: received pong\n", getpid());

    wait(0); //不关心子进程的退出状态
    exit(0);
}

实验结果:
在这里插入图片描述
在这里插入图片描述

四、primes

实验要求:

  • 使用管道来计算2-35之间的所有素数
  • 父进程输入 2 -35
  • 对于每个素数,都会产生一个子进程,从管道接收数据,打印当前素数,并将剩下的素数写入另一个管道

实验代码:

#include "kernel/types.h"
#include "user/user.h"

void find_prime(int *input, int num){
	if(num == 1){
		printf("prime %d\n", *input);
		return;
	}
	int p[2],i;
	int prime = *input;
	int temp;
	printf("prime %d\n", prime);
	pipe(p);
    for(i = 0; i < num; i++){
        temp = *(input + i);
        write(p[1], (char *)(&temp), 4);
    }

	close(p[1]);
	if(fork() == 0){
		int counter = 0;
		char buffer[4];
		while(read(p[0], buffer, 4) != 0){
			temp = *((int *)buffer);
			if(temp % prime != 0){
				*input = temp;
				input += 1;
				counter++;
			}
		}
		find_prime(input - counter, counter);
		exit(0);
    }
	wait(0);
}

int main(){
    int input[34];
	int i = 0;
	for(; i < 34; i++){
		input[i] = i+2;
	}
	find_prime(input, 34);
    exit(0);
}

实验结果:
在这里插入图片描述

五、find

实验要求:

  • 编写 find 的简易版,可以查找具有特定名称的所有文件
  • 使用递归,查找子目录
  • 不要递归查找 . 和 ..目录

实验代码:

在这里插入代码片

实验结果:

六、xargs

实验要求:

  • 将前一个命令的输出附加到后一个命令上
  • echo hello too | xargs echo bye,则echo hello too的输出 hello too,作为附加参数给 echo bye指令

实验代码:

#include "kernel/types.h"
#include "user/user.h"
#include "kernel/param.h"

int main(int argc, char *argv[]){
    int i;
    int cmd_len = 0;
    int buf_len;
    char buf[32];
    char *cmd[MAXARG];
    //读取 xargs 后面的参数,即最终要执行的命令
    for(i = 1; i < argc; i++){
        cmd[cmd_len++] = argv[i];      
    }
    //read读取管道的输出,即面前的命令的执行结果,并进行处理
    while((buf_len = read(0, buf, sizeof(buf))) > 0){
        
        char xargs[32] = {"\0"}; //追加参数
        cmd[cmd_len] = xargs;

        for(i = 0; i < buf_len; i++){
            if(buf[i] == '\n'){
                if(fork() == 0){
                    exec(argv[1], cmd);
                }                
                wait(0);
            } else {
                xargs[i] = buf[i];
            }
        }
    }
    exit(0);
}

实验结果:
在这里插入图片描述

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

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

相关文章

Ubuntu22.04使用kubeadm安装k8s 1.26版本高可用集群

目录阿里云ACK集群的架构ACK实例的创建过程如下安装前的准备主机规划基线准备所有k8s master、worker节点安装kubeadmkubectlkubelet创建集群负载均衡器HAproxy安装keepalived 和haproxy配置haproxy配置keepalivedkubeadm部署第一台master节点Calico网络组件一键安装安装完成阿…

mPEG-Biotin,甲氧基-聚乙二醇-生物素科研实验用试剂

​​ 英文名称&#xff1a;mPEG-Biotin 中文名称&#xff1a;甲氧基-聚乙二醇-生物素 mPEG生物素可通过与链霉亲和素和抗生物素结合进行聚乙二醇化&#xff0c;具有高亲和力和特异性。生物素通过稳定的酰胺连接物与线性PEG结合。 提示&#xff1a;避免频繁的溶解和冻干&…

node.js+uni计算机毕设项目基于微信的同学会小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

GraphQL在Django中的使用

简介 特点 请求你所要的数据&#xff0c;不多不少获取多个资源&#xff0c;只用一个请求描述所有的可能&#xff0c;类型系统几乎所有语言支持 谁在用 文档 Graphene-PythonGraphQL | A query language for your API 背景 传统restful的接口定义类型多&#xff0c;试图简…

WordPress 添加百度主动推送代码,加速网站收录保护原创文章

WordPress是世界上使用人数最多开源程序之一&#xff0c;它的优点有很多&#xff0c;譬如&#xff0c;简单易用、样式丰富&#xff0c;模板众多&#xff0c;安全性能高&#xff0c;对搜索引擎友好&#xff0c;收录快、扩展性强&#xff0c;功能强大等等&#xff0c;其中我最喜欢…

JVM的类加载机制

一、类加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内****&#xff0c;然后在堆区创建一个java.lang.Class对象&#xff0c;用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&…

六、应用层(三)文件传输协议(FTP)

将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中&#xff0c;是一项基本的网络应用&#xff0c;即文件传送。 文件传送协议FTP&#xff08;File Transfer Protocal&#xff09;是因特网上使用得最广泛的文件传送协议。 FTP提供交互式的访问&#xff0c;允许…

欢祝圣诞——北斗星的爱!

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ ★★给大家推荐两首我很喜欢的歌曲&#xff0c;第一首是标题同名歌曲&#xff1a;1.张杰的《北斗星的爱》&#xff1b;另一首是&#xff1a;2.张杰的《星星》&#xff0c;这两首歌真的很震撼很好听&#xff01; 我…

2022细胞生物学实验原理复习资料汇总

2022细胞生物学实验原理复习资料汇总1.2022年考试复习题及参考答案2.2021年考试复习题及参考答案3.2020年之前考试复习题汇总4.复习重点&#xff08;汇总&#xff09;5.排版好的PDF高清版 获取途径&#xff08;资源2021年版&#xff0c;链接2022年最新版本&#xff09;1.2022年…

Linux网络编程之epoll多路转接服务器

Linux网络编程之epoll多路转接服务器 一、epoll的基本概念 epoll是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率&#xff0c;因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待…

基于自动模糊聚类的图像分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

kubernetes之数据存储详解

目录 一、存储卷的作用 二、数据卷概述 三、数据卷emptyDir 四、数据卷hostPath 五、数据卷&#xff1a;NFS 六、持久卷概述 6.1PV静态供给 6.2PV 动态供给(StorageClass) 6.3 PV 生命周期 6.3.1 ACCESS MODES (访问模式) 6.3.2 RECLAIM POLICY (回收策略) 6.3.3 S…

【Redis场景2】缓存更新策略(双写一致)

在业务初始阶段&#xff0c;流量很少的情况下&#xff0c;通过直接操作数据是可行的操作&#xff0c;但是随着业务量的增长&#xff0c;用户的访问量也随之增加&#xff0c;在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力&#xff1b;所谓遇事不决&#xff0c;那就加一…

vue 基础入门:vue 的调试工具

1. 安装 vue-devtools 调试工具 vue 官方提供的 vue-devtools 调试工具&#xff0c;能够方便开发者对 vue 项目进行调试与开发。 Chrome 浏览器在线安装 vue-devtools &#xff1a;https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajb…

六、应用层(五)万维网(www)

目录 5.1 WWW的概念与组成结构 5.2 超文本传输协议&#xff08;HTTP&#xff09; 5.2.1 HTTP的操作过程 5.2.2 HTTP的特点 5.2.3 HTTP的报文结构 5.1 WWW的概念与组成结构 万维WWW&#xff08;World Wide Web&#xff09;简称web并非某种特殊的计算机网络。它…

商城管理系统

商城管理系统 文章目录商城管理系统要求&#xff1a;项目结构图AddProductServlet添加商品&#xff1a;AddToCart将商品添加至购物车ClearCart清空购物车DeleteProductServlet删除商品EditProductServlet修改商品FindProductServlet查找商品LoginServlet登录ProductControl商品…

初级C语言之【数组】

&#x1f996;作者&#xff1a;学写代码的恐龙 &#x1f996;博客主页&#xff1a;学写代码的恐龙博客主页 &#x1f996;专栏&#xff1a;【初级c语言】 &#x1f996;语录&#xff1a;❀未来的你&#xff0c;一定会感谢现在努力奋斗的自己❀ 初级C语言之【数组】一&#xff…

Swagger在线API文档

Swagger 解决的问题 随着互联网技术的发展&#xff0c;现在的网站架构基本都由原来的后端渲染&#xff0c;变成了前后端分离的形态&#xff0c;而且前端技术和后端技术在各自的道路上越走越远。前端和后端的唯一联系&#xff0c;变成了 API 接口&#xff0c;所以 API 文档变成…

C++进阶---C++11

本篇主要是介绍C11中新添加的一些特性。 文章目录 1.C11简介2.列表初始化3.变量类型推导4.新增容器---静态数组array5.右值引用6.lambda表达式7.包装器8.新的类功能9.可变参数模板一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字…

Python高阶函数装饰器

“ 从CANoe vTESTstudio版本7开始&#xff0c;支持使用python编辑器编写python脚本。其中CANoe提供了许多API接口给python使用&#xff0c;大大扩展了python的可用性。在python中使用装饰器定义capl中的事件处理程序&#xff08;on key/on timer等&#xff09;。对此我们有必要…