Avatar billede jimmykf Nybegynder
30. september 2004 - 19:19 Der er 2 kommentarer

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
Avatar billede segmose Nybegynder
01. oktober 2004 - 08:58 #1
Jeg kan ikke lige overskue hvilke problemer der er med pipe, men du kunne prøve at splitte op i en modtage tråd og en skrive tråd (med passende synkronisering), så skrivning ikke blokker for modtagelse. Hvis problemet er at pipen stopper hvis 2 når at skrive til den inden der læses løser dette selvfølgelig ikke problemet det udskyder kun symptomerne til de bliver totalt uforståelige.
Avatar billede jimmykf Nybegynder
02. oktober 2004 - 23:08 #2
segmose:

Tak for dit input :)

Sådan som jeg har fået det at vide (hvilket måske ikke er sandt?) så er pipes blocking. (Medmindre man har sat dem til anderledes)
Så jeg går udfra at hvis 2 processer prøver at skrive til den samme write FD, så vil kun den ene kunne gøre det, mens den anden venter på at komme til. Og det vil så ske når (i mit tilfælde) den tredje process læser fra read FD.

Men det kan være at jeg er forkert på den hvad angår det ovenstående. I såfald lytter jeg gerne.

Hvis pipes er blocking, så skulle mit cout vel ikke kunne påvirke synkroniseringen?

Jeg har også oplevet at hvis jeg kalder min funktion (som sender beskeden over pipen og flusher den) 2 gange, lige efter hinanden, så er det ikke altid at besked no. 2 dukker op.
Jeg har prøvet at fjerne min flush af pipen, som funktionen der sender beskeder over pipen har, uden at det hjalp.

Måske kan det ovenstående kaste mere lys over sagen.

Mvh

/Jim
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester