2016-04-21 16 views
0

Befehlszeile/AusgabeIch bin einen einfachen Befehlsinterpreter zu erstellen, die Benutzer der Eingabe von Befehlen wie in jeder Befehlszeile ermöglicht, aber Fehler treten nach 2 Argumenten

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

C++ Quellcode

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 

Sie können sehen, meine kommentierte if-else Aussagen von einem anderen Weg versuchen, aber überhaupt nicht geholfen.Ich nehme an, mein Problem ist mit execvp, aber ich verstehe nicht warum. Ich freue mich über jede Rückmeldung.

Antwort

0
arg[count++] 

Sie müssen nach der Ausführung jedes Befehls count-0 zurücksetzen.

+0

Es hat funktioniert! Ich fing an, verrückt zu werden und überschätzte, was getan werden musste. Vielen Dank! – Xenu