我正在创建一个简单的shell。用户输入系统调用,我在子进程上分叉并调用execvp,无论用户输入什么命令。我调试了,似乎我传递给execvp的args是不正确的。有人可以帮助我,我是C的新手
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80
int main(void){
char *args[MAXLINE/2 + 1];
char buf[MAXLINE/2 + 1];
int should_run = 1;
printf("Shell\n");
fgets(buf, MAXLINE,stdin);
buf[strlen(buf)-1] = '\0';
int i=0;
char *token;
token = strtok(buf," ");
while(token != NULL){
args[i++] = token;
token = strtok(NULL," ");
}
while(should_run){
if(strcmp(args[0],"exit") == 0){
should_run = 0;
break;
}
pid_t pid;
pid = fork();
//child process
if(pid == 0){
execvp(args[0],args);
}
else{
wait(0);
//Also how do I make it so that the program starts from top again, meaning it lets the user enter another system call
}
}
}
答案 0 :(得分:0)
eval
函数要求您对列表本身进行NULL终止。目前,您的令牌化循环不会在最后一个令牌上放置docker exec
,因此行为未定义(您从未初始化过您的数组)。
紧凑(但不是很漂亮)的解决方案是重新排列你的循环:
execvp