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