zoukankan      html  css  js  c++  java
  • 20155212 mybash的实现

    mybash的实现

    题目

    • 使用fork,exec,wait实现mybash
    • 写出伪代码,产品代码和测试代码
    • 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

    准备

    通过man命令了解fork、exec和wait

    • fork

    • exec

    • wait

    编程实现

    • 伪代码

      while(1)
      {
          fgets(命令行输入);
          if(内置的shell命令)
          {
              解释命令;
          }
          else if(可执行文件)
          {
              新的子进程加载并运行文件;
          }
      }
      
    • 产品代码

      #include <stdio.h>
      #include <unistd.h>
      #include <sys/types.h>
      #include <sys/wait.h>
      #include <stdlib.h>
      #include <string.h>
      #define MAX 128
      
      void eval(char *cmdline);
      int parseline(char *buf, char **argv);
      int builtin_command(char **argv);
      
      int main()
      {
      	char cmdline[MAX];
      
      	printf("This is 20155212's bash!
      ");
      	while(1)
      	{
      		printf("> ");
      		fgets(cmdline, MAX, stdin);
      		if(feof(stdin))
      			exit(0);
      		eval(cmdline);
      	}
      }
      
      void eval(char *cmdline)
      {
      	char *argv[MAX];
      	char buf[MAX];
      	int bg;
      	pid_t pid;
      	strcpy(buf,cmdline);
      	bg = parseline(buf,argv);
      	if(argv[0]==NULL)
      		return;
      	if(!builtin_command(argv))
      	{
      		if((pid=fork()) == 0)
      		{
      			if(execvp(argv[0],argv) < 0)
      			{
      				printf("%s : Command not found.
      ",argv[0]);
      				exit(0);
      			}
      		}
      	}
      	if(!bg)
      	{
      	    int status;
      		if(waitpid(-1,&status,0) < 0)
      		printf("waitfg: waitpid error!");
      	}
      	else
      	{
      		printf("%d %s",pid, cmdline);
      		return;
      	}
      }
      
      int builtin_command(char  **argv)
      {
          if(!strcmp(argv[0], "quit"))
      		exit(0);
      	if(!strcmp(argv[0],"&"))
      		return 1;
      	return 0;
      }
      
      int parseline(char *buf,char **argv)
      {
          char *delim;
      	int argc;
      	int bg;
      
      	buf[strlen(buf)-1]=' ';
      	while(*buf && (*buf == ' '))
      		buf++;
      
      	argc=0;
      	while( (delim = strchr(buf,' ')))
      	{
      		argv[argc++] = buf;
      		*delim= '';
      		buf = delim + 1;
      		while(*buf && (*buf == ' '))
      			buf++;
      	}
      	argv[argc] = NULL;
      	if(argc == 0)
      		return 1;
      	if((bg=(*argv[argc-1] == '&')) != 0)
      		argv[--argc] = NULL;
      
          return bg;
      }
      
      
    • 测试代码

      ls
      ls -a
      git --version
      
    • 运行结果

    • 码云链接

  • 相关阅读:
    sql性能查询
    ASP.Net Web应用程序与EXCEL交互时遇到的权限问题
    Connection strings for Excel 2007
    获取异常的具体出处dbms_utility.format_error_backtrace
    C#获取Excel架构信息的方法
    Oracle强杀进程
    C#游标溢出(访问数据库)解决方案。
    Visual C# 2008 调试技巧一
    【POI】修改Excel内容
    【Eclipse】在Eclipse工具中自定义类注释
  • 原文地址:https://www.cnblogs.com/dky20155212/p/7712476.html
Copyright © 2011-2022 走看看