操作系统实验7.3.1_构造一个小的操作系统_实验记录

一、答案

1.mysh.c

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
    int size = 20;
    int pid;
    char pos[size];
    char command[size];
    while(1)
    {
        getcwd(pos,size);
        printf("%s$\n",pos);
        scanf("%s",command);
        if(!strcmp(command,"cd"))
        {
            char path[size];
            scanf("%s",path);
            chdir(path);
        }
        else if(!strcmp(command,"sync"))
        {
            sync();
        }
        else if(!strcmp(command,"exit"))
        {
            exit(0);
        }
        else if(!strcmp(command,"ls"))
        {
            char ls_command[size];
            strcpy(ls_command,"ls ");
            strcat(ls_command,pos);
            // sprinf(ls_command,"ls %s", pos);
            system("ls");
        }
        else if(!strcmp(command,"cat"))
        {
            char filename[size];
            char cat_command[size];
            scanf("%s",filename);
            strcpy(cat_command,"cat ");
            if(filename[0] != '/')
            {
                strcat(cat_command,pos);
                strcat(cat_command,"/");
            }
            strcat(cat_command,filename);
            // sprintf(cat_command,"cat %s/%s",pos, filename);
            system(cat_command);
        }
    }
}

2.mysh.c注释版

/*注:在Bochs虚拟机中不用添加头文件*/
#include<unistd.h>/*getcwd、chdir、sync等系统调用*/
#include<stdio.h>/*scanf、printf等函数*/
#include<stdlib.h>/*system函数*/
#include<string.h>/*str开头的函数*/
void main()
{
    int size = 20;
    int pid;/*未使用*/
    char pos[size];
    char command[size];
    while(1)
    {
    	/*getcwd:将当前的(mysh中的)路径的值赋给第一个参数*/
        getcwd(pos,size);
        printf("%s$\n",pos);
        scanf("%s",command);
        /*strcmp:两个参数匹配则返回值为0*/
        if(!strcmp(command,"cd"))
        {
            char path[size];
            scanf("%s",path);
            /*chdir:将mysh中的目录切换为path,其中..对应上一级目录*/
            chdir(path);
        }
        else if(!strcmp(command,"sync"))
        {
            sync();
        }
        else if(!strcmp(command,"exit"))
        {
            exit(0);
        }
        else if(!strcmp(command,"ls"))
        {
            char ls_command[size];
            strcpy(ls_command,"ls ");
            strcat(ls_command,pos);
            // sprinf(ls_command,"ls %s", pos);
            system("ls");
        }
        else if(!strcmp(command,"cat"))
        {
            char filename[size];
            char cat_command[size];
            scanf("%s",filename);
            strcpy(cat_command,"cat ");
            if(filename[0] != '/')
            {
            	/*strcat:将第二个参数加到第一个参数的末尾,并将返回值赋给第一个参数*/
                strcat(cat_command,pos);
                strcat(cat_command,"/");
            }
            strcat(cat_command,filename);
            // sprintf(cat_command,"cat %s/%s",pos, filename);
            system(cat_command);
        }
    }
}

二、实验过程中遇到的问题

1.没有按照实验准备中给的命令解释器程序的一般结构来组织本文命令解释器的结构

在这里插入图片描述
主要是因为自己没有想明白创建子进程和父进程等待子进程结束这两个过程的意义。

2.未使用execvpexecve这两个函数

在使用上述两个函数的时候出现了未知原因的段segament fault,这里本文并没有做深入探究,猜想应该和进程调度相关内容有关(本文没有使用的fork),而是改为经常使用的stdlib.h库中的system函数。
在这里插入图片描述

3.sprintf函数

在bochs虚拟机中可以正常调用sprintf函数,在评测的时候则不可以,于是改用了strcpy和strcat这两个函数来实现相关功能。

4.exit函数

bochs虚拟机中可以直接使用exit(),而评测的时候必须给exit加上参数。

5.变量声明

变量声明必须放在每一个代码结构的最起始位置,比如if语句中,如果在scanf语句后声明一个变量,bochs虚拟机中gcc编译时将会报错。

6.为一个字符串赋值

=为字符串赋值的方法是错误的,尽量使用string.h中的函数

7.scanf函数

写代码的时候一直觉得scanf的写法为scanf("%s", &str),但是在评测时这样的写法报错,不能够加&符号。加&的时scanf中的%d等格式化字符串。

8.mysh执行时的显示的目录与系统所在目录不同步

这个问题导致了在mysh使用cd命令切换了当前所在目录后,使用system函数直接调用ls命令会出现现实的内容与当前mysh目录不一致,这就需要mysh中的ls调用system函数时,需要ls的参数为当前mysh显示的路径。cat同理,但是cat的参数为相对路径和绝对路径时,所进行的操作是不一样的。
本文代码实现的ls命令是不完善的,当前实现的功能仅为查看当前目录的内容,未考虑ls命令之后有参数的情况。

9.ls显示的内容没有mylsmycat等文件

主要是觉得没有必要。

三、educoder的上传文件的功能

可以上传代码到实验环境
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu 是一个编译器工具链,用于支持在x86_64平台上交叉编译aarch64架构的程序。它采用Linaro团队开发的GCC 7.3.1版本,是一个开源的C/C++编译器。该工具链提供了一系列的命令行工具,包括编译器、链接器和调试器等,用于将源代码转换成可执行的二进制文件。 在嵌入式系统和嵌入式Linux开发中,交叉编译器是必不可少的工具之一。由于不同平台的硬件架构差异较大,以及开发环境和目标环境的不同,直接在我们的开发机上编译目标平台的程序是不可行的。因此,需要使用交叉编译器,将源代码在开发机上编译成适用于目标平台的二进制文件。gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu 就是为了支持在x86_64平台上编译aarch64架构的程序而设计的工具链。 使用这个工具链,我们可以在x86_64平台上使用GCC编译器来编译适用于aarch64架构的程序。这对于嵌入式开发和Linux内核开发非常有用。通过使用该工具链,开发人员可以更方便地进行交叉编译,提高开发效率,并且确保生成的可执行文件在目标平台上能够正确运行。 总之,gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu 是一个用于在x86_64平台上交叉编译aarch64架构程序的工具链。它提供了GCC编译器和其他一系列命令行工具,用于将源代码转换成可在目标平台上运行的二进制文件。在嵌入式系统和嵌入式Linux开发中,这个工具链非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值