2016-11-02 2 views
1

Ich versuche, die ||, && und ;-Operatoren in einer Bash-Shell zu implementieren, die ich mache. Was ich versuche zu tun, ist ein int als ein Flag, das auf 1 gesetzt würde, wenn es erfolgreich war oder 0, wenn es nicht war. Mein Problem ist, dass selbst wenn ich eine ungültige Operation eingeben wie ls -apples es die Flagge auf 1 setzt erhalte ich die Fehlermeldung auchImplementieren von Bash-Operatoren für Shell in C++

ls: ungültige Option - ‚e‘ ‚ls --help‘ Try für weitere Informationen

also denke ich, dass es bedeutet technisch ausgeführt wird? Wie kann ich verfolgen, ob execvp einen ungültigen Vorgang ausgeführt hat? Hier ist mein Code:

pid_t pid; 
    pid_t waitId; 
    int status; 
    //forks into two processes 
    pid = fork(); 
    //There was an error during fork 
    if (pid < 0) 
    { 
     successFlag = 0; 
     perror("There was an error"); 
    } 
    else if (pid == 0) 
    { 
     //must be cast because our function expects a char *const argv[] 
     if (execvp(command[0], (char**)command) < 0) 
     { 
      //error at execvp 
      successFlag = 0; 
      perror("There was an error executing the process"); 
     } 
      exit(EXIT_FAILURE); 
    } 

    else 
    { 
     do 
     { 
      waitId = waitpid(pid, &status, WUNTRACED | WCONTINUED); 
      if(waitId == -1){ 
       successFlag = 0; 
       perror("Error in parent process"); 
       exit(EXIT_FAILURE); 
      } 

     } 

     while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
    } 
    //use this flag to determine whether the process was a success 
    successFlag = 1; 
+0

Sie haben Recht, der ls Befehl lief. Wenn ich Ihre Problembeschreibung richtig verstanden habe, möchten Sie feststellen, ob der Befehl einen Fehler gesendet hat. In diesem Fall möchten Sie den "Fehlercode" (Exit-Code), der vom Befehl zurückgegeben wird. –

+0

Was ich gemacht habe, war der 'status' Wert von' waitpid'. Ich fand, dass jeder Wert, der nicht 0 war, ungültig war. Ich habe dafür eine boolesche Flagge erstellt. Ist das gültig? – ecain

Antwort

0

Die Lösung wurde bei der Zahl, dass status kehrt zu sehen war. Das Schild würde dir sagen, ob es erfolgreich war oder nicht.