Ich versuche, diese Übung zu lösen: "machen Sie ein Programm, das als Argument 2 andere Programme erhält (zB:" flow ls wc "). Es sollte beide Programme laufen, mit der Ausgabe der 1. Programm als die Eingabe des 2. und messen Sie die Menge der gesendeten Daten. Drucken Sie diesen Betrag jede Sekunde auf Ihrem Stand. "Stuck in einer Weile Schleife nach Gabelung
Ich habe dies:
int fluxo = 0;
void fa(){
printf("\nFlux: %d\n", fluxo);
fluxo = 0;
alarm(1);
}
int main(int argc,char **argv){
int pd[2];
pid_t p;
pipe(pd);
char *buf;
signal(SIGALRM,fa);
alarm(1);
if((p=fork())==0){
close(pd[0]);
dup2(pd[1],1);
close(pd[1]);
execlp(argv[1],argv[1],NULL);
exit(EXIT_FAILURE);
}
else{
wait(NULL);
while(read(pd[0],&buf,1)==1)
fluxo++;
close(pd[1]);
dup2(pd[0],0);
close(pd[0]);
execlp(argv[2],argv[2],NULL);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Ich verwende die while-Schleife um die Datenmenge zu messen. Allerdings bleibe ich dabei stecken, selbst nachdem das execlp im Child-Prozess seine Daten gesendet hat und daher das 2. Programm nicht ausführt. Es steckt die while-Schleife fest, selbst nachdem ich alle Daten in der Pipe gelesen habe. Warum?
'char * buf; while (lesen (pd [0], & buf, 1) == 1) 'Nicht schlecht, aber riecht. Meinst du "char buf"? – MikeCAT
Kann nicht lesen, wenn das "buf" ein char ist. Man liest liest (int fildes, void * buf, size_t nbyte); – ohiohai
@MikeCAT Das ist jenseits eines Code-Geruchs, es ist sicherlich schlecht in meinem Buch. :) – unwind