我对 C 非常陌生,并且在一个操作系统类中,我需要用 C 编写一个基本的 shell(是的)。它实际上已经完成了一半,我只是想在完成工作的同时学习 C 基础知识。
我正在尝试在分叉后使用 exec 并暂时调用 mkdir。争论需要通过我一点点,但我一直试图弄清楚,并希望有人能告诉我哪里出错了。
} else {
//fork exec
int pid = fork();
if (pid == 0) {
printf("%s",my_argv[0]);
execve("/bin/mkdir",my_argv,0);
} else wait(NULL);
}
这是我响应 mkdir 调用的部分。现在,我有一个 line[] 是用户输入的,该命令采用
command = strtok(line, DELIMITERS);
参数是:
arg = strtok(0,DELIMITERS);
my_argv[0] = arg;
一切都编译得很好,但 mkdir 永远不会工作。打印 my_argv[0] 给出了我期望的正确论点。我敢肯定这是愚蠢的,但任何提示将不胜感激。
所有代码:
int main(int argc, char *argv[])
{
char *command;
char line[MAXLINE];
char *arg = NULL;
char *my_argv[];
while(1) {
printf(PROMPT);
if (fgets(line,MAXLINE,stdin) != NULL) {
//take out \n
line[strlen(line)-1] = '\0';
}
//looks for first delimiter, saves as the command
command = strtok(line, DELIMITERS);
//start looking at what command it is by comparing
if (strcmp(command,"cd")==0) {
//if they equal zero, they match
//this is a cd command, must have following arg
if (argv[1] == NULL) chdir("/");
else chdir(argv[1]);//chdir is the system call for cd
} else if (strcmp(command,"exit")==0) {
break;
} else if (strcmp(command,"mkdir")==0){
arg = strtok(0,DELIMITERS);
my_argv[0] = arg;
my_argv[1] = NULL;
if (!arg) {
printf("Usage: mkdir missing arg\n");
} else {
//fork exec
int pid = fork();
if (pid == 0) {
printf("%s",my_argv[0]);
//mkdir(arg);
execve("/bin/mkdir",my_argv,0);
} else wait(NULL);
}
}
}
return 0;
}