c - 可以使用 execvp 和 fork 退出和更改目录的简单 Shell

标签 c shell

我正在为操作系统类创建一个简单的 shell 程序

我们只允许使用 printf、fgets、strcmp、chdir、fork、wait 和 execvp

我遇到的问题是更改目录并让 ls 和 ls-l 工作

这是完整的程序

  #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define BUFFER_LEN 1024
void  parse(char *line, char **argv)
{
     while (*line != '\0') {
          while (*line == ' ' || *line == '\t' || *line == '\n')
               *line++ = '\0';
          *argv++ = line;
          while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n')
               line++;
     }
     *argv = NULL;
}


int main(){
    char line[BUFFER_LEN];  //get command line
    char* argv[100];        //user command

    while(1){
        printf("Timmy>> ");

        fgets(line, BUFFER_LEN, stdin);
        parse(line, argv);

        if(strcmp(line, "exit")==0){            //check if command is exit
                break;
        }
        else if(strcmp(line, "cd")==0){         //checks if command is cd
                chdir(*argv);
        }
        else{
                int pid= fork();           //fork child
                if(pid==0){                //Child
                        execvp(*argv, argv);
                        printf("could not do process\n");}
                else{                      //Parent
                        wait(NULL);}
        }
   }
        return 0;
}

预期结果是列出所有文件并能够更改目录我相信我的问题在于解析函数和 argv 数组

最佳答案

在解析中分配 NULL 之前,您应该递减 argv。只需在 parse 末尾执行 *--argv = NULL 即可。要修复cdchdir(argv[1])。另外,处理封闭的标准输入。用户应该能够通过显式键入 exit 或关闭 stdin 来退出 shell。也就是说,当 fgets 返回 NULL 时中断。另外:

execvp(*argv, argv);
perror(*argv);

错误消息应该提供信息。

关于c - 可以使用 execvp 和 fork 退出和更改目录的简单 Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58229294/

相关文章:

linux - 搜索以特定扩展名结尾的数据类型的递归文件,以便删除文件

bash - 在文件的每一行上运行命令

c - 使用 OpenMP 并行化 while 循环

c - 查找给定数字的等效二进制数

c - 链接列表: Assigning values to a node?

c++ - 为什么我的 C++ 应用程序在 Core i7 上比我的 C 应用程序(使用相同的库)快

c - Base64 解码 - 字符串长度不正确

java - 无法获取配置文件 : export: Command not found

r - 如何打印\n 作为文本而不在 R cat 中的引号内创建换行符

java - 通过 "source"Java 代码的 shell 脚本设置和获取环境变量