【发布时间】:2014-03-17 20:49:32
【问题描述】:
我正在尝试编写一个 C 程序,它将 Luunix 命令读取为字符串,将字符串解析为 char*[],然后使用 evecvp 执行命令。
这是我的代码:
解析字符串
char *args[40];
char command[80];
fgets (command, MAX_LINE, stdin);
int counter = 0;
token = strtok(command," ");
args[0] = token;
//printf("%s\n",args[0]);
while(should_run == 1){
token = strtok(NULL," ");
if (token == NULL){
break;
}
counter++;
args[counter] = token;
printf("%s\n",token);
}
args[counter+1] = NULL;
executeCommands(args, counter, -1);
执行命令
void executeCommands(char *args[], int counter, int histCounter){
/*int j;
for (j = 0; j <= counter; j++){
printf("%s",args[j]);
}*/
printf("\n");
pid_t pid;
pid = fork();
if (pid == 0){
execvp(args[0], args);
printf("exec failed: %s\n", strerror(errno));
}
else{
if(counter == -1 && histCounter == 1){
wait(NULL);
}
else if(*args[counter] == '&'){
wait(NULL);
}
}
}
当我输入诸如“ls”或“pwd”之类的简单输入时,它会输出“exec failed: No such file or directory”。唯一有效的命令是“pwd &”,它输出“忽略非选项参数”,后跟正确的当前路径。
【问题讨论】:
-
仔细阅读Advanced Linux Programming 和execve(2)。使用strace(1) 和你的
gdb调试器。使用gcc -Wall -g编译。研究一些免费shell的源代码(例如GNU bash ....)