我正在为操作系统类创建一个简单的 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
即可。要修复cd
,chdir(argv[1])
。另外,处理封闭的标准输入。用户应该能够通过显式键入 exit
或关闭 stdin 来退出 shell。也就是说,当 fgets
返回 NULL 时中断。另外:
execvp(*argv, argv);
perror(*argv);
错误消息应该提供信息。
关于c - 可以使用 execvp 和 fork 退出和更改目录的简单 Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58229294/