日期:2019/3/23

内容:

实现内容

要求

mysys.c

实现函数mysys,用于执行一个系统命令。

  • mysys的功能与系统函数system相同,要求用进程管理相关系统调用自己实现一遍
  • 使用fork/exec/wait系统调用实现mysys
  • 不能通过调用系统函数system实现mysys

sh1.c

实现shell程序,要求具备如下功能。

  • 支持命令参数

$ echo arg1 arg2 arg3

$ ls /bin /usr/bin /home

  • 实现内置命令cd、pwd、exit

$ cd /bin

$ pwd

/bin

 

 

  • mysys.c

 

/*************************************************************************

    > File Name: mysys.c

    > Author: sinkinben

    > E-mail: sinkinben@qq.com

    > Created Time: Sat 23 Mar 2019 08:06:40 AM CST

************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/types.h>

#include <sys/wait.h>

#define SIZE 1024

static
char program[SIZE];

void mysys(const
char *command)

{

    if(command == NULL)

    {

        return;

    }

    //execl("/bin/bash", "bash", "-c", command, NULL); //这样做当前的进程就会清空,无法返回main

    memset(program, 0, sizeof(program));

    strcpy(program, command);

    char *arg;

    strtok(program, " ");

    arg = strtok(NULL, "");

    pid_t pid = fork();//新建一个进程

    if(pid == 0)

    {

        execlp(program, program, arg, NULL);

        exit(-1);

    }

    int status;

    wait(&status);//等待子进程结束

    if(status != 0)

        printf("command '%s' does not exist...\n", command);

}

 

int main()

{

    printf("--------------------------------------------------\n");

    mysys("ls /");

    printf("--------------------------------------------------\n");

    mysys("echo HELLO WORLD");

    printf("--------------------------------------------------\n");

    mysys("ls -a");

    printf("--------------------------------------------------\n");

    mysys("not exist command");

    printf("--------------------------------------------------\n");

    return
0;

}

 

 

 

  • myshell.c

 

/*************************************************************************

    > File Name: myshell.c

    > Author: sinkinben

    > E-mail: sinkinben@qq.com

    > Created Time: Sat 23 Mar 2019 10:46:26 AM CST

************************************************************************/

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#define BUFF_SIZE 1024*2

static
char buffer[BUFF_SIZE];

static
char *usr = "shell@sin:";

 

void shell_handler(char *command)

{

    char *arg;

    int status;

    pid_t pid;

    strtok(command, " ");

    arg = strtok(NULL, ""); //arg maybe NULL

 

    if(strcmp(command, "cd") == 0)

    {

        chdir(arg);

        return;

    }

    pid = fork();

    if(pid == 0)

    {

        execlp(command, command, arg, NULL);

        exit(-1);

    }

    wait(&status);

    if(status != 0)

    {

        printf("command '%s' does not exist...\n", command);

    }

 

}

 

int main(int argv, char *argc[])

{

    puts("Welcome to MyShell :) ");

    printf("%s", usr);

    while( gets(buffer) != NULL)

    {

        if(strcmp(buffer, "exit") == 0)

            break;

        shell_handler(buffer);

        memset(buffer, 0, sizeof(buffer));

        printf("%s", usr);

    }

    puts("Exit MyShell :)");

    return
0;

}

 

OSLab课堂作业2的更多相关文章

  1. OSLab课堂作业1

        日期:2019/3/16 作业:实现命令cat, cp, echo. myecho命令 #include <stdio.h> int main(int argc, char *ar ...

  2. 栋哥你好,让我们回顾最初认识C++的时候(课堂作业)

    计算器的第一步,至今还记记忆犹新,本次的课堂作业,便是那个框架.闲话少叙,代码如下传送门: Main.cpp #include "stdafx.h" #include<ios ...

  3. 20155213 第十二周课堂作业MySort

    20155213 第十二周课堂作业MySort 作业要求 模拟实现Linux下Sort -t : -k 2的功能 参考 Sort的实现 提交码云链接和代码运行截图 初始代码 1 import java ...

  4. 课堂作业-Bag类的实现

    课堂作业-Bag类的实现 要求: 代码运行在命令行中,路径要体现学号信息,IDEA中,伪代码要体现个人学号信息 参见Bag的UML图,用Java继承BagInterface实现泛型类Bag,并对方法进 ...

  5. Java课程课堂作业代码

    前言 本文章只是单纯记录课堂老师布置的课堂作业代码,题目都比较简单,所以没有写解题思路,相信大家都能理解,当然其中有的解法和代码不是最优的,当时只是为了完成题目,后来也懒得改了,如果有不恰当或者不正确 ...

  6. Java课堂作业详解

    今天的Java课堂留下了一个作业:使用Eclipse编写一个程序,使输入的两个数进行加和,并且输出他们的和.对于这个题目,我们首先可以把它分解成为三个不同的小步骤 第一步就是输入这两个数,因为我们无需 ...

  7. 百度前端学院js课堂作业合集+分析(更新中...)

    第一课:简陋的登录框 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. 面向对象程序设计_课堂作业_01_Circle

    The 1st classwork of the C++ program 题目: Create a program that asks for the radius of a circle and p ...

  9. C++ 课堂作业1.0

    c++第一次课堂作业点这里 题目要求:输入半径,计算圆的面积,在调用外部函数,无需使用类.

随机推荐

  1. catkin_make 与cmake

    http://blog.csdn.net/zyh821351004/article/details/50388429 1.  catkin_make 与cmake的关系 程序在cmake编译的流程: ...

  2. C# Socket网络编程精华篇

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...

  3. DOMNodeInserted监听div内容改变

    $('.cw-icon .ci-count').on('DOMNodeInserted',function(){ $(".settleup-content .cont_loading&quo ...

  4. loadrunner--常用函数列表【转】

    1.        Intweb_reg_save_param("参数名","LB=左边界","RB=右边界",LAST);/注册函数,在参 ...

  5. 品味性能之道<七>:索引基础

    一.索引概述      索引(index),它是数据库必不可少的一部分.它其实很简单呐!很好理解.      索引好比如一本书的目录,一张地图,一个写字楼里挂在大堂墙上的公司名录,一个地铁站的出口指示 ...

  6. 项目管理心得:一个项目经理的个人体会、经验总结(zz)

    本人做项目经理工作多年,感到做这个工作最要紧的就是要明白什么是因地制宜.因势利导,只有最合适的,没有什么叫对的,什么叫错的,项目经理最忌讳 的就是完美主义倾向,尤其是做技术人员出身的,喜欢寻找标准答案 ...

  7. hdu-1069(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:一群猴子,给出n块砖的长x宽y高z,用这些砖拼起的高度最高是多少, 要求底下的砖的长宽都要 ...

  8. C++标准模板库(STL)和容器

    1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...

  9. sql笔试练习

    转:http://www.360doc.com/content/16/0919/17/14804661_592046675.shtml 本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑 ...

  10. oracle11g 导出空表

    --对已存在的表 执行如下 ,要经过统计分析后 num_rows=0 才准确select 'alter table '||table_name||' allocate extent;' from us ...