problemer med pipe(int fd[2]) og cout
Davs,Følgende foregår på en Knoppix Debian Linux liveCD:
Jeg har lavet en server der kører med en message process, der modtager messages over en dedikeret pipe fra andre processer. Disse messages bliver gemt i et string array, og så bliver hele arrayet cout'et, hver gang der kommer en message over pipen.
(dvs. først rykkes gamle messages en tak i arrayet, så den ældste ryger ud, og den nyeste kommer på som den sidste i arrayet)
Problemet er at når jeg cout'er hele arrayet, så får jeg ikke længere beskeder fra pipen (selvom de stadig bliver sendt af de andre processer.
Jeg flusher min write-end af pipen ved hver send:
<CODE>
if( (write(fd1[WRITE], newlyDeclBuf, strlen(newlyDeclBuf)+1 ) == -1 )
{
...
}
char fdopenvar[] = "w";
int i = fflush( fdopen( fd1[WRITE], fdopenvar) );
</CODE>
jeg har også prøvet at sætte stdout til at bruge non-buffered output, med:
setvbuf(stdout, (char*)NULL, _IONBF,0);
i starten af min main.
Hvis jeg kommenterer mit cout-af-arrayet ud, og indsætter en loopcounter efter at have læst fra pipen, så kan jeg se at den korrekt bliver ved med at loope.
Hvis jeg cout'er de enkelte beskeder den får over pipen, så får jeg alle beskederne.
Men så snart jeg kommenterer mit cout af message arrayet ind igen, så går det galt (nogle gange når den at få flere beskeder end andre gange)
mit cout af arrayet ser ud som følgende:
<CODE>
system("clear");
for(int i = 1; i < VERTSCR; i++)
cout << msgArray[i] << endl;
</CODE>
'VERTSCR' er en simpel integer, 'i' er 1 pga. at outputtet ellers rykker sige nogle gange!?
Sådan som jeg fortår det, så har jeg både flushet min pipe, og '<< endl;' flusher mit cout.
Så jeg er ikke helt klar over hvad der får pipen/cout'et til at misbehave :/
Ethvert hint vil være til stor hjælp.
På forhånd tak.
/Jim