在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);
}
}
}
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以获取可能的错误列表。
真的应该是'printf(“chdir error:%s \ n”,strerror(errno));'' –
要实现您自己的shell,您需要直接从stdin
输入输入,而不是从另一个shell的命令行参数(argv
)中输入。其基本模式是这样的:
- 读取输入
- 执行命令
- 打印效果
- 循环回到步骤1
哪里'input'从何而来?你宣布了它,然后你检查它的价值。但是你没有编写任何设置其价值或从任何地方获得它的代码。另外,在处理命令行参数时,您需要确定它们是否作为参数存在。检查'argc'中'argv []'有多少有效值。 – lurker
为什么你'chdir'两次?第二次电话会失败或无关紧要。另外,使用'perror'或者调用'strerror'来得到一个合理的错误信息。 –
编译所有警告和调试信息('gcc -Wall -Wextra -g'),然后学习使用调试器('gdb')和[valgrind](http://valgrind.org/) –