C mini_shell execvp und pipe in while loop Probleme

DRMCW

Cadet 3rd Year
Registriert
Nov. 2009
Beiträge
59
Guten Tag lieben C-Community

Ich habe ein Problem mit der Erstellung bzw. der Implementierung von einer pipe mit fork und alles in einer while schleife. Wir sollen mit dem execvp befehl Kommandos ausführen.


Da ich mich in C nicht so gut auskenne sind leider die Internet Suchvorschläge nicht zielführende, geschweige was ich aus den Büchern entnehmen kann.

Wir sollen eine mini_shell schreiben, in der wir ersten normale Kommandos wie ls -als übergeben können "CHECK"
Diese mini_shell sollen wir dann um eine Pipe erweitern sollen sodass wir den Bash Operator „|“ nutzen können für bspw. Den Befehl „ ps aux | grep root „

Nun ist mein Problem folgendes, mein Befehl "ps aux | grep root" wird augeführt und kommt zu einem ergebniss! Das genau so aussieht wie als wenn ich es im Terminal eingebe. Problem er bricht sofort ab danach, und verlässt das Programm. Aber eigentlich soll er für den nächsten Befehl bereitstehen. Deswegen die infinitiv while loop.



die Argumente stehen nachdem ich den Input an der stelle " | " gesplitte habe in folgernder char zeichen folge

char* cmdString[100]
char* cmdString2[100]

dann gehe ich über beide mit wordexp um namengebungen aufzudrösseln wie bspw. $HOME => /home/%USER% etc...


und danach folgt die pipe

C:
    while(1){

          // Input verarbeitung
                 *
                 *
                 *
                 *
          //

            pid_t pid;
            int fd[2];

           if(pipe(fd) < 0){ perror("Error Pipe().\n"); exit(1);}         
           if((pid = fork() )< 0){ perror("Error fork().\n"); exit(1);}
           if(pid==0)
            {
                dup2(fd[0], 0);
                close(fd[1]);
                close(fd[0]);
                exec_cmd(cmdString1);   <- Funktion zum execute kommando execvp()
                fprintf(stderr, "Failed to execute '%s'\n", cmdString1[0]);
                exit(1);
            }
            else
            {
                if((pid = fork()) < 0){ perror("Error fork().\n"); exit(1);}
                if(pid==0)
                {
                     dup2(fd[1], 1);
                     close(fd[0]);
                     close(fd[1]);
                     exec_cmd(cmdString2);  <- Funktion zum execute kommando execvp()
                     fprintf(stderr, "Failed to execute '%s'\n", cmdString2[0]);
                      exit(1);
                }
                else
                {
                     int status;
                     close(fd[0]);
                     close(fd[1]);
                     waitpid(pid, &status, 0);
                }
            }
        }


        }


Wie gesagt das Programm liest ein
verarbeitet den String
geht über die Namenskonvertierung

und soll dann als befehl executet werden.

Folgende Problem entsteht hier.
Es kommt zu infinitiv loop vom cmdString1 sodass ich das Terminal killen muss
oder er executet es mit danach abruch der Shell danach
 
Zuletzt bearbeitet:
Ist exec_cmd() blockierend (also was die Ausführung der While-Schleife an geht)?

Ansonsten hast du in dem nicht sehr leserlich eingerückten code möglicherweise ein Syntax-Fehler:

DRMCW schrieb:
if((pid = fork()) < 0) perror("Error fork().\n"); exit(1);
Da (Zeile 26) fehlen IMHO die geschweiften Klammern, wenn ich den Code recht verstehe.
 
Kannst du den gesamten Code posten? Dann kann man ihn im Zweifel auch selbst ausführen / testen.

dup2 habe ich noch nie benutzt. falls ich die man pages richtig verstehe, wird der descriptor im zweiten Argument ein Alias des ersten Arguments. In dem Fall wäre es denkbar schlecht, 0 und 1 zu benutzte. Diese sind bereits durch stdin bzw stdout belegt.
 
Zurück
Oben