Search code examples
c++execcallsystemcommand-line-arguments

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


command line / output

Enter command: mkdir one
Enter command: touch one/file one/other one/more
Error: Bad address
Enter command: ^Z

c++ source code

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

You can see my commented if-else statements from trying a different route, but did not help at all.I assume my problem is using execvp but I do not understand why. I appreciate any feedback.


Solution

  • arg[count++]
    

    You need to reset count to 0 after executing each command.