• 大小: 5KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: 其他
  • 标签: shell  

资源简介

设计简单的命令行myshell,并能在实验环境下运行。 要求支持的命令如下: 1. cd [directory] 将当前目录改为 [directory] 2. environ 列出所有环境变量 3. ls 列出指定目录下所有文件 4. help 显示所有支持的命令 5. echo 在屏幕上显示参数并换行 6. quit 退出 shell 7. 支持I/O重定向 8. 常见的目录和文件操作,比如新建目录或文件,目录或文件的删除、复制,显示文件内容等。 上述基础功能满分70分,完成下面各功能并在文档中说明可得到加分,每项功能最多加10分: 1. 支持管道符操作 2. 不限制命令参数个数 3. 实现彩色输出 4. 支持其它一些常见的linux命令 5. 自己认为比较重要或能体现自己水平的功能 如果是嘉大的,想要资源直接找我拿,就不用去买积分,1563602991

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
// 保存当前的命令行输入
char line[256];

// 根据命令行输入等到的命令参数
char args[10][80];

// 命令参数个数
int narg;
int redir;   //判断是否有重定向符号
char *file;  //记录重定向目标文件

// 将命令参数拷贝到当前命令中
void copy_args(char* cmd_args[]) {
    int i=0;
    for (i; i < narg; i++) {
        cmd_args[i] = args[i];
    }
    for( i=0; cmd_args[i] != NULL; i++ )
    {
        if( strcmp( cmd_args[i]“>“ ) == 0 )  //命令中有输出重定向
        {
            redir = 1;
        }
     }
   if( redir == 1 )           //命令只含有一个输出重定向符号
     {
        for( i=0; cmd_args[i] != NULL; i++ )
        {
            if( strcmp( cmd_args[i]“>“ )==0 )
            {
                file = cmd_args[i+1];
                cmd_args[i] = NULL;
            }
        }
    }
}

// 执行 ls 命令
void exec_ls() {
    int pid = fork();
    int fd;
    if (pid > 0) {
        waitpid(pid NULL 0);
        return;
    }  
    char* cmd_args[10] = {};
    copy_args(cmd_args);
    if(redir == 1){ //如果命令有重定向
        fd = open( fileO_RDWR | O_CREAT | O_TRUNC 0644 );
        dup2( fd1 );    //指定新文件描述符为11为标准输出,0为标准输入
    }
    execv(“/bin/ls“ cmd_args);
}

// 执行 pwd 命令
void exec_pwd() {
    char buffer[256];
    getwd(buffer);
    printf(“%s\n“ buffer);
}

// 执行 cd 命令
void exec_cd() {
    if (narg != 2) return;
    chdir(args[1]); 
    exec_pwd();
}
//执行environ 命令
void exec_env(){
 execlp(“env“““NULL);
}
//echo 在屏幕上显示参数并换行
void exec_echo(){
char array[999];
int s= strlen(line);
for(int i=5;i {
   array[i-5]=line[i];

}
printf(“%s\n“array);
}
//执行help
void exec_help(){
 int pid = fork();
    if (pid > 0) {
        waitpid(pid NULL 0);
        return;
    }  
 system(“help“);
}
//创建文件
void exec_vi() {  
  int pid = fork();    
  if (pid > 0) {       
    waitpid(pid NULL 0);       
    return;
    }   
  char* cmd_args[10] = {};    
  copy_args(cmd_args);    
  execvp(“vi“ cmd_args);  

}

//创建文件夹
void exec_mkdir() {  
  int pid = fork();    
  if (pid > 0) {       
    waitpid(pid NULL 0);       
    return;
    }   
  char* cmd_args[10] = {};    
  copy_args(cmd_args);    
  execvp(“mkdir“ cmd_args);  

}
//删除文件夹和文件夹
void exec_rm()
{
   int pid = fork();    
   if 

评论

共有 条评论