(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
---------
- 1469 megtekintés
Hozzászólások
A'sszem ez érdekelhet.
--
A gyors gondolat többet ér, mint a gyors mozdulat.
- A hozzászóláshoz be kell jelentkezni
Ez érdekes is, viszont nincs az eszközön stdbuf program, és a BUF_1_=1 -re sem reagál, de legalább már tudom, hogy hol bukik a dolog.
Köszönöm.
- A hozzászóláshoz be kell jelentkezni
Esetleg unbuff van rajta?
- A hozzászóláshoz be kell jelentkezni
Nincs.
ennyi program van rajta : http://pastebin.com/6jRSsrUa
- A hozzászóláshoz be kell jelentkezni
Esetleg a tee. Vagy a sed tud unbuffered módot, talán segít, bár lehet h semmi értelme, mert bufferelve kapja a cuccot.
- A hozzászóláshoz be kell jelentkezni
Igen, a tee-t már próbáltam, de amint bekerül a "csőbe" az adat, már bufferelve lesz.
- A hozzászóláshoz be kell jelentkezni
Azt hiszem par dolgot le kell hozza forditani forrasbol, kicsit patchelve, hatha…
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Vsz nem a program cache-eli, mivel ./program 1>/proc/self/fd/0 esetén azonnal reagál.
Azonban ha ott van a probléma, akkor az tényleg gáz, mert zárt forrású a szoftver.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
letezhet. vannak istty() vagy isatty(), pl az ls igy donti el hogy a konyvtarlistat a kepernyore todelje, vagy ha fajlba van iranyitva soronkent adja
- A hozzászóláshoz be kell jelentkezni
És nem lehet azt hazudni egy fileról, hogy az tty? Az a probléma, hogy nem soronként adja, hanem ha elérte a buffer szintet, amit a stdbuf-al is hiába állítgatok a program indítása előtt, az adott szoftver nagy ívben tojik rá. :|
- A hozzászóláshoz be kell jelentkezni
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 */
}
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni