stdin, stdout, stderr
SZIGETI Szabolcs
szigi at ik.bme.hu
Tue Apr 19 09:16:37 CEST 2005
Hali!
>> A C-ben ket fele fajlkezeles van. Az egyik file handle-el mukodik. Ezeken
>> mukodnek az open, close, stb. fugvenyek. A 'handle' valoban egy integer,
> es
>> elvben az open adja vissza oket. Minden megnyitott fajlnak egyedi
> handle-je
>> van, azonban a std. I/O-nak elore lefoglalt, speci handle-t adtak:
>>
>> 0 - STDIN
>> 1 - STDOUT
>> 2 - STDERR
>> 3 - STDAUX (?)
>
Legyunk pontosak: az integeres file handle, az nem C specifikus, hanem Unix
specifikus. A creat, open, close, read, write, seek, stb. fvnyek eredetileg
Unix rendszerhivasok voltak. A 0,1,2,3 is konvenció, amikor a
parancsértelmező elindít egy programot, akkor ezeket az altala megnyitott
handle-ket adja at neki (igy mukodik a kimenet-bemenet atiranyitas, a
program nem tudja, hogy ezek igazabol hova mutatnak. De ha akarja, egyebkent
bezarhatja es ujranyithatja oket akarhova.
> Idokozben kiprobaltam...
> Egybevag a fentivel.
> Stdaux nincs, viszont 4-tol osztja ki a FILE handle-kat ezekszerint nagyon
> helyesen. (gondolom szabvany miatt...)
>
>> Van egy masik tipusu fajlkezeles, amelyik FILE* struktura pointer-eket
>> hasznal. Ez a tipusu kezeles az, amelyiket az fopen, fclose, stb., tehat
> az
>> 'f' kezdetuek ismernek. Itt a FILE valoban egy struktura. Ezekbol is van
> par
Ezzel szemben a FILE struktura az nevezheto C specifikusnak, mivel az stdio
konyvtar resze, es elvileg rendszerfuggetlen. Ez egy pufferelt IO lehetoseg,
de gyakorlatilag ugyanazokat a szolgaltatasokat nyujtja, mint az operndszer
szintu, csak a puffereles miatt hatekonyabb (lehet), meg szinten emiatt van
par specifikus lehetoseg (pl. ulvasott karakter visszarakasa pufferbe). A
puffereles kikapcsolhato, pl. az stderr eseteben defaultban ki van
kapcsolva, hogy a "debug" jellegu kiirasok azonnal megjelenjenek.
> A file es az std kozott az-e a lenyegi kulonbseg hogy:
> -az std egy buta stream alapvetoen (nem tudok pozicionalni, attributum
> elore
> rogzitett (rd, wr))?
Nem. Illetve igen, azert, mert igy van megnyitva, es mivel az stdin/out
rendszerint kepernyo/billenytyuzet alapertelmezesben, ezert nem lehet benne
seekelni. Ha file, akkor lehet.
> -a file meg egy blokkos valami joszag amiben tudok maszkalni tetszes
> szerint, irhatom is, olvashatom is, stb.?! Es az attributumokat (poz, r,
> w,
> stb) maga a FILE struktura tartalmazza?! Plussz meg buffert is
> deklaralhatok hozza, igy nem kell minden byte-nal az adott eszkozhoz
> fordulni. (legyen ez egy eeprom jelen esetben. Ennel kifejezetten jol
> jonne
> ez. Jol gondolkodom?)
Tulajdonkeppen igen. De nem blokkos, ez is sima byte-folyam jellegu, csak
van egy puffer benne, ha akarod. Egyebkent pl. Unix eseteben maga az
oprendszer is pufferel, tehat a bytos I/O egy normal file-on szinten eleg
hatekony. A FILE viszont nem Unix pecsifikus, tehat hordozhato!
>
>> elore defnialt: stdin, stout, stderr, stdaux. A FILE*-on operalo
> fuggvenyek
>> altalaban elobb-utobb visszahivjak a file-handlet kezeloket, ezert is van
> a
Mindig azokat hivjak meg, leven az oprendszer kezeli vegul is a fajlokat,
tehat kenytelen azokat hivni. (Bar nincs akadalya, hogy a FILE dolgot
megvalositsad olyan oprendszeren, amely maskent kezeli a fajlokat.)
[...]
> if(4==handle){
> akkor valahogy eloszedi a 4-es handlehoz tartozo file strukturat, es
> kinyeri belole a poziciot, attributumot (r,w,txt,bin stb), es megcsinalja
> amit megkell.
> Ha igy van akkor kb hogyan kell ezt a strukturat eloszedni?! Otletem
> sincs.
> visszafele hogyan "cimezhetem" a handle alapjan a file strukturat. )
Alapvetoen egeszsegtelen dolog az stdio es az oprendszer szintu fajlekezelo
eljarasokat keverni, mert rengeteg buktato van benne. Ha van rendes stdio
implementaciod, akkor hasznald kizarolag azt. Ha nincs, akkor marad az
oprendszer szint.
Szabolcs
More information about the Elektro
mailing list