我要创建一个简单的命令解释器,允许用户像在任何命令行中一样输入命令,但在 2 个参数后发生错误
I am to create a simple Command Interpreter that allows user to input commands like in any command line, but error occurs after 2 arguments
命令行/输出
Enter command: mkdir one
Enter command: touch one/file one/other one/more
Error: Bad address
Enter command: ^Z
c++源代码
int main(int argc, char *argv[]){
int rs;
int count = 0;
pid_t pid;
char input[100];
char* temp;
char* arg[6] = { (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0 };
//command arg1 arg2 arg3 arg4 NULL
while(true){
cout << "Enter command: ";
cin.getline(input, 100);
for( temp = strtok(input, " "); temp; temp = strtok(NULL, " ") )
{
arg[count++] = temp;
}
pid = fork();
if(pid == -1){
perror("Error");
exit(EXIT_FAILURE);
}
if(pid == 0){
/*child process*/
/*if(count < 2){
rs = execlp(arg[0],arg[0],arg[1],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1] << endl;
}
else if(count < 3){
rs = execlp(arg[0],arg[0],arg[1],arg[2],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << endl;
}
else if(count < 4){
rs = execlp(arg[0],arg[0],arg[1],arg[2],arg[3],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << "arg[3]: " << arg[3] << endl;
}
else if(count < 5){
rs = execlp(arg[0],arg[0],arg[1],arg[2],arg[3],arg[4],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << "arg[3]: " << arg[3]
<< "arg[4]: " << arg[4] << endl;
}*/
rs = execvp(arg[0],arg);
if(rs == -1){
perror("Error");
exit(EXIT_FAILURE);
}
}
else{
/*parent process*/
wait(NULL);
}
}//end-while
}//end program
你可以看到我评论的 if-else 尝试不同路线的语句,但在 all.I 没有帮助假设我的问题是使用 execvp 但我没有明白为什么。感谢任何反馈。
arg[count++]
您需要在执行每个命令后将 count
重置为 0
。
命令行/输出
Enter command: mkdir one
Enter command: touch one/file one/other one/more
Error: Bad address
Enter command: ^Z
c++源代码
int main(int argc, char *argv[]){
int rs;
int count = 0;
pid_t pid;
char input[100];
char* temp;
char* arg[6] = { (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0 };
//command arg1 arg2 arg3 arg4 NULL
while(true){
cout << "Enter command: ";
cin.getline(input, 100);
for( temp = strtok(input, " "); temp; temp = strtok(NULL, " ") )
{
arg[count++] = temp;
}
pid = fork();
if(pid == -1){
perror("Error");
exit(EXIT_FAILURE);
}
if(pid == 0){
/*child process*/
/*if(count < 2){
rs = execlp(arg[0],arg[0],arg[1],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1] << endl;
}
else if(count < 3){
rs = execlp(arg[0],arg[0],arg[1],arg[2],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << endl;
}
else if(count < 4){
rs = execlp(arg[0],arg[0],arg[1],arg[2],arg[3],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << "arg[3]: " << arg[3] << endl;
}
else if(count < 5){
rs = execlp(arg[0],arg[0],arg[1],arg[2],arg[3],arg[4],NULL);
cout << "arg[0]: " << arg[0] << "arg[1]: " << arg[1]
<< "arg[2]: " << arg[2] << "arg[3]: " << arg[3]
<< "arg[4]: " << arg[4] << endl;
}*/
rs = execvp(arg[0],arg);
if(rs == -1){
perror("Error");
exit(EXIT_FAILURE);
}
}
else{
/*parent process*/
wait(NULL);
}
}//end-while
}//end program
你可以看到我评论的 if-else 尝试不同路线的语句,但在 all.I 没有帮助假设我的问题是使用 execvp 但我没有明白为什么。感谢任何反馈。
arg[count++]
您需要在执行每个命令后将 count
重置为 0
。