ich dieses Szenario zu realisieren versuchen:Programm will noch Eingang nehmen, selbst wenn die alle Leitungen geschlossen sind
wo zwei parallele Prozesse zu tr /a-z/ /A-Z/
geleitet werden und schließlich tr /a-z/ /A-Z/
Prozess wird an stdout verbunden.
ich dieses Programm geschrieben habe, um zu versuchen, um mein Ziel zu erreichen:
#include<stdio.h>
#include<unistd.h>
#include<wait.h>
int main()
{
int dummy;
int fd[2];
int i;
char* lsargs[] = {"/bin/ls", "-l", NULL};
char* lsargs2[] = {"cat", "/etc/group", NULL};
char* lsargs3[] = {"tr", "/a-z/", "/A-Z/", NULL};
char** am[] = {lsargs, lsargs2, lsargs3};
pipe(fd);
for (i = 0 ; i < 3 ; i++)
{
pid_t pid = fork();
if (pid == 0)
{
if (i != 2) // ls -l & cat
{
// 0 -> stdin, 1 -> pipe write end
close(fd[0]);
dup2(fd[1], 1);
close(fd[1]);
execvp(am[i][0], am[i]);
}
else //TR AZ AZ
{
// 0 -> pipe read end 1 -> stdout
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
execvp(am[i][0], am[i]);
}
break;
}
else{
wait(&dummy);
}
}
return 0;
}
ich die richtige Ausgabe aber mein Programm nicht beendet, sie will immer noch Eingang nehmen. Kannst du mir bitte helfen, den Grund zu verstehen?
Sie warten nach Abzweigung des ersten Prozesses. Ihre Schleife ist zu schlau, ich schlage vor, Sie würden die Schleife ausrollen –
@AnttiHaapala was würden Sie vorschlagen? Ich weiß, dass die Verwendung einer Schleife bedeutungslos ist, ich habe sie für einen speziellen Zweck verwendet. –
Anstelle von 'for' schreiben Sie den Code so, dass er sich wiederholt; dann kannst du erkennen, welcher Teil wiederholt werden kann und warum. Nun wird Ihr Elternteil warten, bis das erste Kind * austritt * bevor * das nächste Kind sogar gegabelt, execed wird oder seine Leitung läuft. –