日期: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. Message: u'The given selector btn dropdown-toggle btn-info is either invalid or does not result in a WebElement

    html代码: <html> <head> <meta http-equiv="content-type" content="text/ht ...

  2. Windows 7 手动添加受信任证书教程

    步骤如下: 1.点击开始-运行,如下图: 2.弹出"控制台"窗口如下,如下图: 3.点击"文件-添加/删除管理单元",如下图: 4.选择"证书&quo ...

  3. Ubuntu12.04添加环境变量

    环境变量分为系统级和用户级. 系统级变量设置环境为/etc/environment和/etc/profile等,不要轻易修改,否则可能造成系统错误. 用户级变量设置路径为-/.bashrc和~/.pr ...

  4. Telnet 协议详解

    Telnet 协议详解 一.概述 ============================================================ Telnet 协议是 TCP/IP 协议族中 ...

  5. 3、基本的Get和Post访问(含代理请求)

    Get方式访问 HttpClient hc = new DefaultHttpClient(); HttpUriRequest request = new HttpGet("http://w ...

  6. centos6.5 redis 安装配置及java调用

    1.安装gcc 执行命令  yum install gcc 2. 安装ruby环境 yum install ruby yum install rubygems gem install redis 下载 ...

  7. KbmMW 4.5 发布

    We are happy to announce the release of kbmMW v. 4.50.00 Professional, Enterprise and CodeGear Editi ...

  8. xampp虚拟主机的配置

     ps:来源 https://blog.csdn.net/qq_17335153/article/details/52091869 一.修改httpd.conf   文件目录 xampp => ...

  9. hdu-1166(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 思路:线段树模板 #include<iostream> #include<cs ...

  10. RESTful架构概念

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...