Ich versuche, einen Shell-Simulator unter Linux zu schreiben, der einen Einzelprozessbefehl, Zweiprozess-Pipelines und E/A-Umleitung ausführen kann. Wie ich einzelne Prozess mit den folgenden richtig ausgeführt, jedoch gibt es einige Probleme mit der Pipeline.Shell-Simulator mit Pipeline- und E/A-Umleitung unter Linux
Copy_STDIO(); //Copy the stdio for the restoration.
Redirection(); //Determine whether should do Redirection.
Pipeline();
Restore_stdio(); //Restore the stdio.
Oben ist meine Funktionen in Haupt. Zuerst kopiere ich das STDIO für die Wiederherstellung nach der I/O-Umleitung. Dann verdopple ich meinen Dateideskriptor zu STD_IN und STD_OUT. Dann führe ich Pipeline aus, und schließlich stelle ich meine STD_IN und STD_OUT wieder her. Alles klingt perfekt, aber eigentlich nicht. Meine Umleitung von OUTPUT war fehlgeschlagen, was bedeutet, dass es nichts in die Zieldatei geschrieben hat (d. H. Wenn in der einzigen Situation: ls> 123, 123 zeigt nichts an), wenn mein Programm noch läuft. Aber als ich das Programm mit exit (EXIT_SUCCESS) beendete, erschien es !! (Wenn mit ctrl + c es auch fehlschlug), ich weiß nicht warum!
void Redirection()
{
fd_out = open(filename[0],O_WRONLY | O_TRUNC | O_CREAT,S_IRWXU | S_IRWXG | S_IRWXO); //O_WRONLY and O_CREAT must use at the same time.
dup2(fd_out,STD_OUTPUT);
close(fd_out);
}
void Copy_STDIO()
{
STDIN_COPY = dup(STD_INPUT); //Copy for the stdin and stdout
STDOUT_COPY = dup(STD_OUTPUT);
}
void Pipeline()
{
if(pipeline)
{
pipe(&fd[0]);
childID=fork();
if(childID==0)
{
if(fork()!=0)
{
close(fd[1]);
dup2(fd[0],STD_INPUT);
close(fd[0]);
execvp(args2[0],args2);
}
else
{
close(fd[0]);
dup2(fd[1],STD_OUTPUT);
close(fd[1]);
execvp(args[0],args);
}
}
usleep(5000);
}
}
void Restore_stdio()
{
dup2(STDIN_COPY,STD_INPUT); //Restore the output and input to the stdin and stdout.
dup2(STDOUT_COPY,STD_OUTPUT);
close(STDIN_COPY);
close(STDOUT_COPY);
}
Können Sie ein minimal nachprüfbares Beispiel, auch bekannt als ein Stück Code zur Verfügung stellen, die kompiliert werden kann? –
Dateien müssen geschlossen werden, bevor sie angezeigt und gelesen werden können. Ausgang (0); schließt alle geöffneten Dateien. –
@ArifBurhan wo sollte ich exit (0) hinzufügen; ? Ich habe mein fd_out geschlossen, nachdem ich es an STD_OUTPUT weitergeleitet habe. –