在C中的基本CLI程序

在C中的基本CLI程序

问题描述:

好吧总体来说,我试图完成一个基本的CLI C程序,它将完成诸如clear,quit,cd,ls,help(调出unix man)等功能。我修改了我的代码,到目前为止,我有这个,即时尝试执行该程序的cd命令部分,即时获取分段错误,(即时通讯btw非常新);在C中的基本CLI程序

#include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
    #include<unistd.h> 

    int main (int argc, char *argv[]) 
    { 
     char input[] = " "; 
     char *argument; 
    while(strcmp(input, "quit")!= 0) 
     { 


     printf("$"); 
     scanf ("%s", input); 

    if(strcmp(input,"clear") == 0) 
    { 
     printf("\e[1;1H\e[2J"); 
     } 

    else if(strcmp(argv[1],"cd") == 0) 
    { 


     if(chdir(argv[2]) == -1) 
     { 
     printf("\n directory does not exists"); 
     } 

    } 



    else if(strcmp(input, "echo") == 0) 
    { 
    char str[50]; 
    scanf("%[^\n]+", str); 

    printf(" %s", str); 
    } 





    } 

} 
+3

哪里'input'从何而来?你宣布了​​它,然后你检查它的价值。但是你没有编写任何设置其价值或从任何地方获得它的代码。另外,在处理命令行参数时,您需要确定它们是否作为参数存在。检查'argc'中'argv []'有多少有效值。 – lurker

+0

为什么你'chdir'两次?第二次电话会失败或无关紧要。另外,使用'perror'或者调用'strerror'来得到一个合理的错误信息。 –

+0

编译所有警告和调试信息('gcc -Wall -Wextra -g'),然后学习使用调试器('gdb')和[valgrind](http://valgrind.org/) –

input被声明为''(空格)字符。它永远不会匹配'cd'。

这可能是沿着你想要实现的,其中第一个参数是命令(CD),什么线多,第二个是目录:

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

    char *argument; 

    if(strcmp(argv[1],"cd") == 0) 
{ 


    if(chdir(argv[2]) == -1) 
    { 
     printf("\n directory does not exists"); 
    } 

    } 

编辑同时请注意不需要其他处理。如果chdir没有返回错误,它将改变目录,因此不需要在else中再次调用它。

另外,一般情况下使用系统调用的另一个提示是,如果打印系统调用失败时系统返回的错误号,将会有很大的帮助。当事情开始出错时,这会让事情变得更容易。要做到这一点只需包括<errno.h>' and modify the printf to print errno`这使有关该错误的具体细节:

printf("Chdir error: %d", errno); 

例如chdir()不仅返回时,目录不存在错误,而且例如,如果您没有权限查看目录的内容。请参阅man page以获取可能的错误列表。

+1

真的应该是'printf(“chdir error:%s \ n”,strerror(errno));'' –

要实现您自己的shell,您需要直接从stdin输入输入,而不是从另一个shell的命令行参数(argv)中输入。其基本模式是这样的:

  1. 读取输入
  2. 执行命令
  3. 打印效果
  4. 循环回到步骤1