PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pipe, fork, scanf...



rugaaaaa
07-12-2006, 22:43
Hallo,
ich habe folgendes Problem....

Ich versuche beliebige viele Zahlenpaar über die Tastatur einzugeben (Vaterprozess)...

und diese sollen vom Tochterprozess (pid==0) ausgeben werden...



pid=fork();

if (pid == 0)
{close(fd[1]);
if ((fd_r = fdopen(fd[0],"r"))==NULL)
{
printf("fdopen: %s", strerror(errno));
exit(2);
}
while(fscanf(fd_r,"%d%d",&x,&y) != EOF)
{
printf("(Test) x: %d, y: %d\n",x,y);
}
return 2;
}


gibt mir nur das letzte Zahlenpaar aus... dieses allerdings sooft bis ich abbreche.... (die Ausgaben beendet sich nicht selber)

wenn ich allerdings mit "if" die Ausgabe etwas beschränke



while(fscanf(fd_r,"%d%d",&x,&y) != EOF)
{
c++;
printf("%d, (Test) x: %d, y: %d\n",c,x,y);
if (c>20) exit(3);
}


gibt er den Anfang richtig aus.... und dann

1, (Test) x: 2, y: 4
2, (Test) x: 1, y: 3
3, (Test) x: 4, y: 5
4, (Test) x: 7, y: 8
5, (Test) x: 7, y: 8
6, (Test) x: 7, y: 8
7, (Test) x: 7, y: 8
8, (Test) x: 7, y: 8
9, (Test) x: 7, y: 8
10, (Test) x: 7, y: 8
11, (Test) x: 7, y: 8
12, (Test) x: 7, y: 8
13, (Test) x: 7, y: 8
14, (Test) x: 7, y: 8
15, (Test) x: 7, y: 8
16, (Test) x: 7, y: 8
17, (Test) x: 7, y: 8
18, (Test) x: 7, y: 8
19, (Test) x: 7, y: 8
20, (Test) x: 7, y: 8
21, (Test) x: 7, y: 8



aber wie gelingt es mir, dass er jedes Zahlenpaar nur einmal ausgibt, bzw. am Schluss diese Endlosschleife nicht erscheint...?


Ruga

OpOs
12-12-2006, 19:45
solange dein vaterprozess noch laeuft, ist der stream gueltig, also erhaelst du kein EOF.

da du in 'ner endlosschleife steckst und deine variablen nicht neu initialisierst, schreibst du immer die zuletzt erfolgreich gelesenen werte raus.

pruefe das fscanf auch auf 0 (bzw !=2) und initialisieren deine variablen vor jedem scan.

pipes in interaktiven programmen halte ich aber ehrlich gesagt fuer 'ne schnapsidee...