Lab1 Xv6 and Unix utilities

实现几个unix实用工具,熟悉xv6的开发环境以及系统调用
实验环境搭建:使用Ubuntu20.04

  1. Sleep (easy)
    参考user/echo.c,添加头文件
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

参考user/ulib.c,把命令行参数string类型转换为int,使用atoi
在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\ 

代码:

#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\n");
        exit(1);
    } else {
        sleep(atoi(argv[1]));
        exit(0);
    }
}

测试
注意:评测脚本是python程序
第一行修改为:

!/usr/bin/ python

测试命令修改为:
python3 grade-lab-util sleep

捕获.PNG
  1. pingpong(easy)
    管道是一个小的内核缓冲区,它以文件描述符对的形式提供给进程,一个用于写操作,一个用于读操作。按照惯例,进程从文件描述符0读入(标准输入),从文件描述符1输出(标准输出)。
    方式一:创建2个管道,分别用于父子进程之间两个方向的数据传输
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int 
main(int argc, char *argv[])
{
    int p2c[2], c2p[2];
    pipe(p2c);
    pipe(c2p);

    if (fork() != 0) {
        write(p2c[1], "f", 1);
        char buf;
        read(c2p[0], &buf, 1);
        printf("%d: received pong\n", getpid());
        wait(0);
    } else {
        char buf;
        read(p2c[0], &buf, 1);
        printf("%d: received ping\n", getpid());
        write(c2p[1], &buf, 1);
    }

    exit(0);
}

测试结果:


pingpong2.PNG
pingpong1.PNG

方式二:创建1个管道
父子进程复用管道

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

int 
main(int argc, char *argv[])
{
    int p[2];
    pipe(p);

    if (fork() == 0) {
        char buf;
        read(p[0], &buf, 1);
        close(p[0]);

        printf("%d: received ping\n", getpid());
        write(p[1], "c", 1);

        close(p[1]);
        exit(0);
    } else {
        char buf;
        write(p[1], "f", 1);
        close(p[1]);

        wait(0);

        read(p[0], &buf, 1);
        close(p[0]);
        printf("%d: received pong\n", getpid());
        exit(0);
    }
}

测试结果:


pingpong4.PNG
pingpong3.PNG

primes (hard)
使用多进程和管道,每个进程作为一个节点,筛掉某个素数的所有倍数
注意:关闭不用的管道。

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

void primes(int p[2])
{   
    // 子进程只需要读,关闭写
    close(p[1]);
    int num;
    read(p[0], &num, sizeof(num)); //读取第一个数
    if (num == -1) {
        exit(0);
    }
    printf("prime %d\n", num);

    int p2[2];
    pipe(p2); // 创建用于下一阶段的管道

    if (fork() == 0) {
        close(p[0]); // 关闭读
        primes(p2);
    } else {
        close(p2[0]); // 主进程关闭读
        int num2;
        while (read(p[0], &num2, sizeof(num)) && num2 != -1) {
            if (num2 % num != 0) {
                write(p2[1], &num2, sizeof(num2));
            }
            
        }
        num2 = -1;
        write(p2[1], &num2, sizeof(num2));
        wait(0);
        exit(0);
    }
}

int
main(int argc, char *argv[]) 
{
    int p[2];
    pipe(p);

    if (fork() == 0) {
        primes(p);
        exit(0);
    } else {
        // 主进程只需要写,不需要读
        close(p[0]);
        int i;
        for (i = 2; i <= 35; i++) { // 管道里写入2-35
            write(p[1], &i, sizeof(i));
        }
        i = -1;
        write(p[1], &i, sizeof(i));
        close(p[1]); // 关闭写
        wait(0);
    }

    exit(0);
}

测试结果:


primes1.PNG
primes2.PNG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容