Ich habe dieses Programm. Das Programm liest eine Anzahl von Zahlen aus der Standardeingabe, während Strg + d (EOF) gedrückt wird. Die positiven Zahlen gehen an einen Kindprozess und die negativen an einen anderen Kindprozess. Meine Frage ist: Warum sendet EOF nicht über Pipes zu den beiden Prozessen? Das ist mein Programm:STRG + D sendet nicht an die Leitung C
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int p0top1[2],p0top2[2];
void tataWork()
{
int nr;
FILE *fout1, *fout2;
fout1 = fdopen(p0top1[1], "w");
fout2 = fdopen(p0top2[1], "w");
printf("Begin P0\n");
while(EOF != scanf("%d", &nr))
{
if(nr > 0)
{
fprintf(fout1,"%d\n", nr);
fflush(fout1);
}
else
{
fprintf(fout2,"%d\n", nr);
fflush(fout2);
}
}
close(p0top1[1]);
close(p0top2[1]);
printf("Finish P0\n");
}
void p1Work()
{
close(p0top1[1]);
printf("Begin P1\n");
int nr, i, n = 0, sum = 0, vector[1024];
FILE *fin;
fin = fdopen(p0top1[0], "r");
while(EOF != fscanf(fin, "%d", &nr))
{
vector[n++] = nr;
sum += nr;
}
for(i = 0; i < n; i++)
printf("%d ", vector[i]);
close(p0top1[0]);
printf("Finish P1\n");
}
void p2Work()
{
close(p0top2[1]);
printf("Begin P2\n");
int nr, i, n = 0, sum = 0, vector[1024];
FILE *fin;
fin = fdopen(p0top2[0], "r");
while(EOF != fscanf(fin, "%d", &nr))
{
vector[n++] = nr;
sum += nr;
}
printf("I am P2.\n");
for(i = 0; i < n; i++)
printf("%d ", vector[i]);
close(p0top2[0]);
printf("Finish P2\n");
}
void makePipe()
{
if(-1 == pipe(p0top1))
{
perror("Error creating the pipe");
exit(1);
}
if(-1 == pipe(p0top2))
{
perror("Error creating the pipe");
exit(1);
}
}
int main(void)
{
pid_t p1, p2;
makePipe();
if(-1 == (p1=fork()))
{
perror("Error creating the child");
exit(3);
}
if(p1)
{
if(-1 == (p2=fork()))
{
perror("Error creating the child");
exit(4);
}
if(p2)
{
tataWork();
}
else
{
p2Work();
}
}
else
{
p1Work();
}
return 0;
}
Der Ausgang ist dies:
Begin P0
Begin P1
Begin P2
20 -3 4 -2
Finish P0
So sind die Kinder nicht beendet, weil die EOF senden nicht wahr? Sorry für mein schlechtes Englisch !!!
Schauen Sie sich den Zustand Ihrer Schleife an. – Siguza
Siguza scheint mir ok .... Können Sie mir sagen, was ich vermisse? – Marius
Nvm, ich habe es falsch gelesen. Allerdings: Beide untergeordneten Prozesse enthalten immer noch einen Schreibdeskriptor für die Pipe des anderen Kindes. Sie schließen den Schreibdeskriptor auf ihre eigene Pipe, aber nicht auf die andere. – Siguza