DRMCW
Cadet 3rd Year
- Registriert
- Nov. 2009
- Beiträge
- 63
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
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
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: