[Megoldva] stdout buffer "bug" | sh pipe probléma

(A környezet: MIPS-es processzor, a rootfs egy jffs2 filerendszeren van)

Egy program kimenetét kellene feldolgoznom egy sh szkriptben, de ha pipe-on keresztül, vagy fileba írva próbálom feldolgozni, akkor csak egy bizonyos mennyiség után hajlandó kiírni, viszont ha elküldöm a /proc/self/fd/0 -ra, akkor azonnal kiírja a terminálon.

A filet, ami "vezetékként" szolgál a szkript és a program stdout-a között, az "mknod filenev p" paranccsal hoztam létre.

Mitől lehet ez a késleltetés?
(Ez a bizonyos mennyiség lehet hogy 1024byte, nem számoltam. Olyan, mintha cache-elne valahová, és csak akkor írná ki a fileba, ha az már megtelt. Ilyen problémára hol keressem a megoldást?)

Hogy lehet még "elküldeni" a szkriptemhez a folyamatosan áramló adatot?

---------

Megoldás: http://hup.hu/node/97918#comment-1202388

---------

Hozzászólások

A'sszem ez érdekelhet.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Az stdout-ra írás általában cache-lt. Ezt a program általában magának cacheli (azon túl, ami cachelést az oprendszer közbeiktat), tehát ha az eredeti programhoz nem férsz hozzá, akkor érzésem szerint bukó, de ne legyen igazam. Ha mégis, akkor meg az adott nyelv lehetőségeinél kell körbenézni.
----
Hülye pelikán

Kérdés: ugyanazzal a metódussal rakja egy pipe-ba az adatot, amivel a képernyőre írja ki? Létezhet az, hogy a képernyőre rendesen írja, és egyéb esetekben meg kötelezően bufferel?

használd a printf helyett ezt a kódot:

void ffprintf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);

fflush(stdout); /* a lényeg ez, minden kiírás után kikényszeríti hogy kiírja az stdout-ot */
}

Szia!

Az a probléma, hogy a program, amiből el kell érnem az stdout-ot, az zárt, és lehetőleg sh scriptel kellene megoldanom, mert eléggé kifilézett rendszerről van szó.

Ahogy figyeltem a program működését, nagyon úgy tűnt, hogy ha tty-re megy ki az adat, akkor soronként adja ki magából, de ha fileba küldi, akkor 1000K-s bufferbe megy, így az adatokat feldolgozó script az utolsó "akciókról" lemarad, pedig realtime kéne működnie.

Utolsó próbálkozásként szétnéztem újra a /dev-ben. Találtam egy /dev/pty/* alkonyvtarat (mindenre rákereste google-ben, és rájöttem, hogy ezek kellenek nekem, a pseudo terminalok), ahol m[0-7] és s[0-7] eszközök sorakoztak. Gyors utánaolvasás után látom, hogy amit beírok az s[x]-be, azt az m[x]-ből ki tudom olvasni. Sokkal gyorsabban működik, mint a pipe, a SoC terhelése is alacsonyabb, és soronként kapja meg a script a program 1> kimenetét is. (program 2> esetén fileba (pipe-ba) írásnál is soronként adta vissza az üzeneteket, de nem a warningokat kell feldolgoznom).

Úgyhogy a megoldás a következő lett (a programban lévő istty() ellenőrzést kikerülve/becsapva):

sh script.sh < /dev/pty/m0
./program 1> /dev/pty/s0

Köszönöm mindenkinek a segítséget, nagyon sokat tanultam ismét.
Sokkal tovább tartott volna nélkületek!

szerk.: Remélem init-ből is működni fog, ha nem, akkor azt hiszem az már egy új téma.