home *** CD-ROM | disk | FTP | other *** search
- - 167 -
-
- 8. ê¡ΓÑαΣÑ⌐ß ß¿ßΓѼδ UNIX
- îáΓÑα¿á½ φΓ«⌐ ú½áóδ «Γ¡«ß¿Γß∩ ¬ ¿¡ΓÑαΣÑ⌐ßπ ¼Ñªñπ ß-»α«ú-
- αἼἿ ¿ «»Ñαᵿ«¡¡«⌐ ß¿ßΓѼ«⌐ UNIX. Æá¬ ¬á¬ í«½∞Φ¿¡ßΓó«
- »«½∞º«óáΓѽÑ⌐ ∩ºδ¬á "C" αáí«ΓáεΓ ¡á ß¿ßΓÑ¼Ñ UNIX, φΓá ú½áóá
- «¬áªÑΓß∩ »«½Ñº¡«⌐ ñ½∩ í«½∞Φ¿¡ßΓóá τ¿ΓáΓѽÑ⌐. ñáªÑ Ñß½¿ óδ
- ¿ß»«½∞ºπÑΓÑ ß-¬«¼»¿½∩Γ«α ¡á ñαπú«⌐ ¼áΦ¿¡Ñ, ¿ºπτÑ¡¿Ñ »α¿ó«ñ¿-
- ¼δσ ºñÑß∞ »α¿¼Ñα«ó ñ«½ª¡« »«¼«τ∞ óá¼ ú½πíªÑ »α«¡¿¬¡πΓ∞ ó ¼Ñ-
- Γ«ñδ »α«úαá¼¼¿α«óá¡¿∩ ¡á ∩ºδ¬Ñ "C".
- ¥Γá ú½áóá ñѽ¿Γß∩ ¡á Γα¿ «ß¡«ó¡δÑ τáßΓ¿: óó«ñ/óδó«ñ,
- ß¿ßΓѼá Σá⌐½«ó ¿ αáß»αÑñѽѡ¿Ñ »á¼∩Γ¿. ÅÑαóδÑ ñóÑ τáßΓ¿
- »αÑñ»«½áúáεΓ ¡Ñí«½∞Φ«Ñ º¡á¬«¼ßΓó« ß ó¡ÑΦ¡¿¼¿ σáαá¬ΓÑα¿ßΓ¿¬á-
- ¼¿ ß¿ßΓѼδ UNIX.
- é ú½áóÑ 7 ¼δ ¿¼Ñ½¿ ñѽ« ß ß¿ßΓѼ¡δ¼ ¿¡ΓÑαΣÑ⌐ß«¼, ¬«Γ«αδ⌐
- «ñ¿¡á¬«ó ñ½∩ óßÑú« ¼¡«ú««íαế∩ «»Ñαᵿ«¡¡δσ ß¿ßΓѼ. ìá ¬áª-
- ñ«⌐ ¬«¡¬αÑΓ¡«⌐ ß¿ßΓÑ¼Ñ Σπ¡¬µ¿¿ ßΓá¡ñáαΓ¡«⌐ í¿í½¿«ΓѬ¿ ñ«½ª¡δ
- íδΓ∞ ¡á»¿ßá¡δ ó ΓÑନ¡áσ óó«ñá-óδó«ñá, ñ«ßΓπ»¡δσ ¡á ñá¡¡«⌐
- ¼áΦ¿¡Ñ. é ß½ÑñπεΘ¿σ ¡Ñ߬«½∞¬¿σ αáºñѽáσ ¼δ «»¿ΦѼ «ß¡«ó¡πε
- ß¿ßΓѼπ ßó∩ºá¡¡δσ ß óó«ñ«¼ ¿ óδó«ñ«¼ Γ«τѬ óσ«ñá «»Ñαᵿ«¡-
- ¡«⌐ ß¿ßΓѼδ UNIX ¿ »α«¿½½εßΓα¿απѼ, ¬á¬ ß ¿σ »«¼«Θ∞ε ¼«úπΓ
- íδΓ∞ αÑ὿º«óá¡δ αẽ¿τ¡δÑ τáßΓ¿ ßΓá¡ñáαΓ¡«⌐ í¿í½¿«ΓѬ¿.
-
- 8.1. äÑß¬α¿»Γ«αδ Σá⌐½«ó
- é «»Ñαᵿ«¡¡«⌐ ß¿ßΓÑ¼Ñ UNIX óÑß∞ óó«ñ ¿ óδó«ñ «ßπΘÑßΓó-
- ½∩ÑΓß∩ »«ßαÑñßΓó«¼ τΓÑ¡¿∩ Σá⌐½«ó ¿½¿ ¿σ ºá»¿ß¿, »«Γ«¼π τΓ«
- óßÑ »Ñα¿ΣÑα¿⌐¡δÑ πßΓα«⌐ßΓóá, ó¬½ετá∩ ñáªÑ ΓÑନ¡á½ »«½∞º«óá-
- Γѽ∩, ∩ó½∩εΓß∩ Σá⌐½á¼¿ «»αÑñѽѡ¡«⌐ Σá⌐½«ó«⌐ ß¿ßΓѼδ. ¥Γ«
- «º¡áτáÑΓ, τΓ« «ñ¿¡ «ñ¡«α«ñ¡δ⌐ ¿¡ΓÑαΣÑ⌐ß π»αáó½∩ÑΓ óßѼ¿ ßó∩-
- º∩¼¿ ¼Ñªñπ »α«úαá¼¼«⌐ ¿ »Ñα¿ΣÑα¿⌐¡δ¼¿ πßΓα«⌐ßΓóἿ.
- é ¡á¿í«½ÑÑ «íΘѼ ß½πτáÑ »ÑαÑñ τΓÑ¡¿Ñ¼ ¿º Σá⌐½á ¿½¿ ºá-
- »¿ß∞ε ó Σá⌐½ ¡Ñ«íσ«ñ¿¼« ß««íΘ¿Γ∞ ß¿ßΓÑ¼Ñ « óáΦѼ ¡á¼ÑαÑ¡¿¿;
- φëà »α«µÑßß ¡áºδóáÑΓß∩ "«Γ¬αδΓ¿Ñ¼" Σá⌐½á. æ¿ßΓѼá óδ∩ß¡∩-
- ÑΓ,¿¼ÑÑΓÑ ½¿ óδ »αáó« »«ßΓπ»áΓ∞ Γᬿ¼ «íαẫ¼ (ßπΘÑßΓóπÑΓ ½¿
- φëà Σá⌐½? ¿¼ÑÑΓß∩ ½¿ π óáß αáºαÑΦÑ¡¿Ñ ¡á «íαáΘÑ¡¿Ñ ¬ ¡Ñ-
- ¼π?), ¿ Ñß½¿ óßÑ ó »«α∩ñ¬Ñ, ó«ºóαáΘáÑΓ ó »α«úαá¼¼π ¡Ñí«½∞Φ«Ñ
- »«½«ª¿Γѽ∞¡«Ñ µÑ½«Ñ τ¿ß½«, ¡áºδóáѼ«Ñ ñÑß¬α¿»Γ«α«¼ Σá⌐½á.
- óß∩¬¿⌐ αáº, ¬«úñá φëà Σá⌐½ ¿ß»«½∞ºπÑΓß∩ ñ½∩ óó«ñá ¿½¿ óδó«-
- ñá, ñ½∩ ¿ñÑ¡Γ¿Σ¿¬áµ¿¿ Σá⌐½á π»«ΓαÑí½∩ÑΓß∩ ñÑß¬α¿»Γ«α Σá⌐½á,
- á ¡Ñ Ñú« ¿¼∩. (çñÑß∞ ßπΘÑßΓóπÑΓ »α¿¼Ñα¡á∩ á¡á½«ú¿∩ ß ¿ß»«½∞-
- º«ó᡿Ѽ READ (5,...) ¿ WRITE (6,...) ó Σ«αΓαá¡Ñ). éß∩ ¿¡-
- Σ«α¼áµ¿∩ «í «Γ¬αδΓ«¼ Σá⌐½Ñ ß«ñÑনΓß∩ ó ß¿ßΓѼÑ; »α«úαá¼¼á
- »«½∞º«óáΓѽ∩ «íαáΘáÑΓß∩ ¬ Σá⌐½π Γ«½∞¬« τÑαѺ ñÑß¬α¿»Γ«α Σá⌐-
- ½á.
- ä½∩ πñ«íßΓóá óδ»«½¡Ñ¡¿∩ «íδτ¡δσ «»Ñαᵿ⌐ óó«ñá ¿ óδó«ñá
- ß »«¼«Θ∞ε ΓÑନ¡á½á »«½∞º«óáΓѽ∩ ßπΘÑßΓóπεΓ ß»Ñµ¿á½∞¡δÑ ß«ú-
- ½áΦÑ¡¿∩. è«úñá ¿¡ΓÑα»αÑΓáΓ«α ¬«¼á¡ñ ("SHELL") »α«ú«¡∩ÑΓ
- »α«úαá¼¼π, «¡ «Γ¬αδóáÑΓ Γα¿ Σá⌐½á, ¡áºδóáѼδÑ ßΓá¡ñáαΓ¡δ¼
- óó«ñ«¼, ßΓá¡ñáαΓ¡δ¼ óδó«ñ«¼ ¿ ßΓá¡ñáαΓ¡δ¼ óδó«ñ«¼ «Φ¿í«¬,
- ¬«Γ«αδÑ ¿¼ÑεΓ ß««ΓóÑΓßΓóÑ¡¡« τ¿ß½á 0, 1 ¿ 2 ó ¬áτÑßΓóÑ ñÑ߬-
- α¿»Γ«α«ó φΓ¿σ Σá⌐½«ó. é ¡«α¼á½∞¡«¼ ß«ßΓ«∩¡¿¿ óßÑ «¡¿ ßó∩ºá¡δ
- ß ΓÑନ¡á½«¼, ΓᬠτΓ« Ñß½¿ »α«úαá¼¼á τ¿ΓáÑΓ ß ñÑß¬α¿»Γ«α«¼
- Σá⌐½á 0 ¿ »¿ΦÑΓ ß ñÑß¬α¿»Γ«αἿ Σá⌐½«ó 1 ¿ 2, Γ« «¡á ¼«ªÑΓ
- «ßπΘÑßΓó½∩Γ∞ óó«ñ ¿ óδó«ñ ß »«¼«Θ∞ε ΓÑନ¡á½á, ¡Ñ ºáí«Γ∩ß∞
- «í «Γ¬αδΓ¿¿ ß««ΓóÑΓßΓóπεΘ¿σ Σá⌐½«ó.
-
- - 168 -
-
- Å«½∞º«óáΓѽ∞ »α«úαá¼¼δ ¼«ªÑΓ »ÑαÑ¡á»αáó½∩Γ∞ óó«ñ ¿ óδó«ñ
- ¡á Σá⌐½δ, ¿ß»«½∞ºπ∩ «»Ñαᵿ¿ ¬«¼á¡ñ¡«ú« ¿¡ΓÑα»αÑΓáΓ«αá SHELL
- "<" ¿ ">" :
-
- PROG <INFILE>OUTFILE
-
- é φΓ«¼ ß½πτáÑ ¿¡ΓÑα»αÑΓáΓ«α ¬«¼á¡ñ SHELL ¿º¼Ñ¡¿Γ »α¿ßóá¿óá-
- ¡¿Ñ »« π¼«½τá¡¿ε ñÑß¬α¿»Γ«α«ó Σá⌐½«ó 0 ¿ 1 ß ΓÑନ¡á½á ¡á
- π¬áºá¡¡δÑ Σá⌐½δ. ì«α¼á½∞¡« ñÑß¬α¿»Γ«α Σá⌐½á 2 «ßΓáÑΓß∩ ßó∩-
- ºá¡¡δ¼ ß ΓÑନ¡á½«¼, ΓᬠτΓ« ß««íΘÑ¡¿∩ «í «Φ¿í¬áσ ¼«úπΓ »«ß-
- Γπ»áΓ∞ Γπñá. Å«ñ«í¡δÑ ºá¼Ñτá¡¿∩ ß»αáóÑñ½¿óδ ¿ Γ«úñá, ¬«úñá
- óó«ñ ¿ óδó«ñ ßó∩ºá¡ ß ¬á¡á½«¼. æ½ÑñπÑΓ «Γ¼ÑΓ¿Γ∞, τΓ« ó« óßÑσ
- ß½πτá∩σ »α¿¬αÑ»½Ñ¡¿∩ Σá⌐½«ó ¿º¼Ñ¡∩εΓß∩ ¿¡ΓÑα»αÑΓáΓ«α«¼
- SHELL, á ¡Ñ »α«úαá¼¼«⌐. æá¼á »α«úαá¼¼á, »«¬á «¡á ¿ß»«½∞ºπÑΓ
- Σá⌐½ 0 ñ½∩ óó«ñá ¿ Σá⌐½δ 1 ¿ 2 ñ½∩ óδó«ñá, ¡Ñ º¡áÑΓ ¡¿ «Γ¬π-
- ñá »α¿σ«ñ¿Γ ÑÑ óó«ñ, ¡¿ ¬πñá »«ßΓπ»áÑΓ ÑÑ óδñáτá.
-
- 8.2. 쿺¬«πα«ó¡Ñóδ⌐ óó«ñ/óδó«ñ - «»ÑαáΓ«αδ READ ¿ WRITE.
- æá¼δ⌐ ¡¿º¬¿⌐ πα«óÑ¡∞ óó«ñá/óδó«ñá ó ß¿ßΓÑ¼Ñ UNIX ¡Ñ »αÑ-
- ñπß¼áΓα¿óáÑΓ ¡¿ ¬á¬«⌐-½¿í« íπΣÑα¿ºáµ¿¿, ¡¿ ¬á¬«ú«-½¿í« ñαπ-
- ú«ú« ßÑαó¿ßá; «¡ »« ßπΘÑßΓóπ ∩ó½∩ÑΓß∩ ¡Ñ»«ßαÑñßΓóÑ¡¡δ¼ óσ«-
- ñ«¼ ó «»Ñαᵿ«¡¡πε ß¿ßΓѼπ. éÑß∞ óó«ñ ¿ óδó«ñ «ßπΘÑßΓó½∩ÑΓß∩
- ñóπ¼∩ Σπ¡¬µ¿∩¼¿: READ ¿ WRITE. ÅÑαóδ¼ áαúπ¼Ñ¡Γ«¼ «íÑ¿σ Σπ¡¬-
- µ¿⌐ ∩ó½∩ÑΓß∩ ñÑß¬α¿»Γ«α Σá⌐½á. éΓ«αδ¼ áαúπ¼Ñ¡Γ«¼ ∩ó½∩ÑΓß∩
- íπΣÑα ó óáΦÑ⌐ »α«úαá¼¼Ñ, «Γ¬πñá ¿½¿ ¬πñá ñ«½ª¡δ »«ßΓπ»áΓ∞
- ñá¡¡δÑ. ÆαÑΓ¿⌐ áαúπ¼Ñ¡Γ - φΓ« τ¿ß½« »«ñ½ÑªáΘ¿σ »ÑαÑß佬Ñ
- íá⌐Γ«ó. ÄíαáΘÑ¡¿∩ ¬ φΓ¿¼ Σπ¡¬µ¿∩¼ ¿¼ÑεΓ ó¿ñ:
-
- N_READ=READ(FD,BUF,N);
- N_WRITTEN=WRITE(FD,BUF,N);
-
- Åα¿ ¬áªñ«¼ «íαáΘÑ¡¿¿ ó«ºóαáΘáÑΓß∩ ßτÑΓτ¿¬ íá⌐Γ«ó, π¬áºδóáε-
- Θ¿⌐ Σá¬Γ¿τÑ߬«Ñ τ¿ß½« »ÑαÑñá¡¡δσ íá⌐Γ«ó. Åα¿ τΓÑ¡¿¿ ó«ºóαá-
- ΘÑ¡¡«Ñ τ¿ß½« íá⌐Γ«ó ¼«ªÑΓ «¬áºáΓ∞ß∩ ¼Ñ¡∞ΦÑ, τѼ ºá»α«ΦÑ¡¡«Ñ
- τ¿ß½«. 髺óαáΘÑ¡¡«Ñ ¡π½Ñó«Ñ τ¿ß½« íá⌐Γ«ó «º¡áτáÑΓ ¬«¡Ñµ Σá⌐-
- ½á, á "-1" π¬áºδóáÑΓ ¡á ¡á½¿τ¿Ñ ¬á¬«⌐-½¿í« «Φ¿í¬¿. Åα¿ ºá»¿-
- ß¿ ó«ºóαáΘÑ¡¡«Ñ º¡áτÑ¡¿Ñ αáó¡« τ¿ß½π Σá¬Γ¿τÑ߬¿ ºá»¿ßá¡¡δσ
- íá⌐Γ«ó; ¡Ñß«ó»áñÑ¡¿Ñ φΓ«ú« τ¿ß½á ß τ¿ß½«¼ íá⌐Γ«ó, ¬«Γ«α«Ñ
- »αÑñ»«½áúὫß∞ ºá»¿ßáΓ∞, «íδτ¡« ßó¿ñÑΓѽ∞ßΓóπÑΓ «í «Φ¿í¬Ñ.
- 諽¿τÑßΓó« íá⌐Γ«ó, »«ñ½ÑªáΘ¿σ τΓÑ¡¿ε ¿½¿ ºá»¿ß¿, ¼«ªÑΓ
- íδΓ∞ ß«óÑαΦÑ¡¡« »α«¿ºó«½∞¡δ¼. äóπ¼∩ ßá¼δ¼¿ αáß»α«ßΓαá¡Ñ¡¡δ¼¿
- óѽ¿τ¿¡á¼¿ ∩ó½∩εΓß∩ "1", ¬«Γ«αá∩ «º¡áτáÑΓ »ÑαÑñáτπ «ñ¡«ú«
- ß¿¼ó«½á ºá «íαáΘÑ¡¿Ñ (Γ.Ñ. üѺ ¿ß»«½∞º«óá¡¿∩ íπΣÑαá), ¿
- "512", ¬«Γ«αá∩ ß««ΓóÑΓßΓóπÑΓ Σ¿º¿τÑ߬«¼π αẼÑαπ í½«¬á ¡á
- ¼¡«ú¿σ »Ñα¿ΣÑα¿⌐¡δσ πßΓα«⌐ßΓóáσ. ¥Γ«Γ »«ß½Ññ¡¿⌐ αẼÑα íπñÑΓ
- ¡á¿í«½ÑÑ φΣΣÑ¬Γ¿ó¡δ¼, ¡« ñáªÑ óó«ñ ¿½¿ óδó«ñ »« «ñ¡«¼π ß¿¼-
- ó«½π ºá «íαáΘÑ¡¿Ñ ¡Ñ íπñÑΓ ¡Ñ«í몭«óÑ¡¡« ñ«α«ú¿¼.
- ÄíΩÑñ¿¡¿ó óßÑ φΓ¿ Σá¬Γδ, ¼δ ¡á»¿ß὿ »α«ßΓπε »α«úαá¼¼π
- ñ½∩ ¬«»¿α«óá¡¿∩ óó«ñá ¡á óδó«ñ, φ¬ó¿óá½Ñ¡Γ¡πε »α«úαá¼¼Ñ ¬«-
- »¿α«ó¬¿ Σá⌐½«ó, ¡á»¿ßá¡¡«⌐ ó ú½áóÑ 1. ìá ß¿ßΓÑ¼Ñ UNIX φΓá
- »α«úαá¼¼á íπñÑΓ ¬«»¿α«óáΓ∞ τΓ« πú«ñ¡« ¬πñá πú«ñ¡«, »«Γ«¼π
- τΓ« óó«ñ ¿ óδó«ñ ¼«úπΓ íδΓ∞ »ÑαÑ¡á»αáó½Ñ¡δ ¡á ½εí«⌐ Σá⌐½ ¿½¿
- πßΓα«⌐ßΓó«.
-
- - 169 -
-
-
- #DEFINE BUFSIZE 512 /*BEST SIZE FOR PDP-11 UNIX*/
- MAIN() /*COPY INPUT TO OUTPUT*/
- \(
- CHAR BUF[BUFSIZE];
- INT N;
- WHILE((N=READ(0,BUF,BUFSIZE))>0)
- WRITE(1,BUF,N);
- \)
-
- àß½¿ αẼÑα Σá⌐½á ¡Ñ íπñÑΓ ¬αáΓÑ¡ BUFSIZE, Γ« »α¿ ¡Ñ¬«Γ«α«¼
- «íαáΘÑ¡¿¿ ¬ READ íπñÑΓ ó«ºóαáΘÑ¡« ¼Ñ¡∞ΦÑÑ τ¿ß½« íá⌐Γ«ó, ¬«-
- Γ«αδÑ ºáΓѼ ºá»¿ßδóáεΓß∩ ß »«¼«Θ∞ε WRITE; »α¿ ß½ÑñπεΘѼ »«ß-
- ½Ñ φΓ«ú« «íαáΘÑ¡¿¿ ¬ READ íπñÑΓ ó«ºóαáΘÑ¡ ¡π½∞.
- Å«πτ¿Γѽ∞¡« αẫíαáΓ∞ß∩, ¬á¬ ¼«ª¡« ¿ß»«½∞º«óáΓ∞ Σπ¡¬µ¿¿
- READ ¿ WRITE ñ½∩ »«ßΓα«Ñ¡¿∩ »α«µÑñπα í«½ÑÑ óδß«¬«ú« πα«ó¡∩,
- Γᬿσ ¬á¬ GETCHAR, PUTCHAR ¿ Γ.ñ. é«Γ, ¡á»α¿¼Ñα, óáα¿á¡Γ
- Σπ¡¬µ¿¿ GETCHAR, «ßπΘÑßΓó½∩εΘ¿⌐ óó«ñ íѺ ¿ß»«½∞º«óá¡¿∩ íπΣÑ-
- αá.
-
- #DEFINE CMASK 0377 /*FOR MAKING CHAR'S > 0*/
- GETCHAR() /*UNBUFFERED SINGLE CHARACTER INPUT*/
- \(
- CHAR C;
- RETURN((READ(0,&C,1)>0 7 & CMASK : EOF);
- \)
-
- ÅÑαѼѡ¡á∩ "C" ñ«½ª¡á íδΓ∞ «»¿ßá¡á ¬á¬ CHAR, »«Γ«¼π τΓ« Σπ¡-
- ¬µ¿∩ READ »α¿¡¿¼áÑΓ π¬áºáΓѽ∞ ¡á ß¿¼ó«½δ. 髺óαáΘáѼδ⌐ ß¿¼-
- ó«½ ñ«½ªÑ¡ íδΓ∞ ¼á߬¿α«óá¡ τ¿ß½«¼ 0377 ñ½∩ úáαá¡Γ¿¿ Ñú« »«-
- ½«ª¿Γѽ∞¡«ßΓ¿; ó »α«Γ¿ó¡«¼ ß½πτáÑ º¡á¬«óδ⌐ αáºα∩ñ ¼«ªÑΓ ßñÑ-
- ½áΓ∞ Ñú« º¡áτÑ¡¿Ñ «Γα¿µáΓѽ∞¡δ¼. (è«¡ßΓá¡Γá 0377 »«ñσ«ñ¿Γ
- ñ½∩ φó¼ PDP-11, ¡« ¡Ñ «í∩ºáΓѽ∞¡« ñ½∩ ñαπú¿σ ¼áΦ¿¡).
- éΓ«α«⌐ óáα¿á¡Γ Σπ¡¬µ¿¿ GETCHAR «ßπΘÑßΓó½∩ÑΓ óó«ñ í«½∞Φ¿-
- ¼¿ »«αµ¿∩¼¿, á óδñáÑΓ ß¿¼ó«½δ »« «ñ¡«¼π ºá «íαáΘÑ¡¿Ñ.
-
- #DEFINE CMASK 0377 /*FOR MAKING CHAR'S>0*/
- #DEFINE BUFSIZE 512
- GETCHAR() /*BUFFERED VERSION*/
- \(
- STATIC CHAR BUF[BUFSIZE];
- STATIC CHAR *BUFP = BUF;
- STATIC INT N = 0;
- IF (N==0) \( /*BUFFER IS EMPTY*/
- N=READ(0,BUF,BUFSIZE);
- BUFP = BUF;
- \)
- RETURN((--N>=0) ? *BUFP++ & CMASK : EOF);
- \)
-
- 8.3. ÄΓ¬αδΓ¿Ñ, ß«ºñá¡¿Ñ, ºá¬αδΓ¿Ñ ¿ αáߵѻ½Ñ¡¿Ñ
- (UNLINK).
- èα«¼Ñ ß½πτá∩, ¬«úñá »« π¼«½τá¡¿ε «»αÑñѽѡδ ßΓá¡ñáαΓ¡δÑ
- Σá⌐½δ óó«ñá, óδó«ñá ¿ «Φ¿í«¬, óδ ñ«½ª¡δ ∩ó¡« «Γ¬αδóáΓ∞ Σá⌐-
- ½δ, τΓ«íδ ºáΓѼ τ¿ΓáΓ∞ ¿º ¡¿σ ¿½¿ »¿ßáΓ∞ ó ¡¿σ. ä½∩ φΓ«⌐ µÑ-
- ½¿ ßπΘÑßΓóπεΓ ñóÑ Γ«τ¬¿ óσ«ñá: OPEN ¿ CREAT.
-
- - 170 -
-
- öπ¡¬µ¿∩ OPEN óÑß∞¼á ßσ«ñ¡á ß Σπ¡¬µ¿Ñ⌐ FOPEN, αáßß¼«ΓαÑ¡-
- ¡«⌐ ó ú½áóÑ 7, ºá ¿ß¬½ετÑ¡¿Ñ¼ Γ«ú«, τΓ« ó¼ÑßΓ« ó«ºóαáΘÑ¡¿∩
- π¬áºáΓѽ∩ Σá⌐½á «¡á ó«ºóαáΘáÑΓ ñÑß¬α¿»Γ«α Σá⌐½á, ¬«Γ«αδ⌐ ∩ó-
- ½∩ÑΓß∩ »α«ßΓ« µÑ½δ¼ Γ¿»á INT.
-
- INT FD;
- FD=OPEN(NAME,RWMODE);
-
- èᬠ¿ ó ß½πτáÑ FOPEN, áαúπ¼Ñ¡Γ NAME ∩ó½∩ÑΓß∩ ß¿¼ó«½∞¡«⌐
- ßΓ᫬«⌐, ß««ΓóÑΓßΓóπεΘÑ⌐ ó¡ÑΦ¡Ñ¼π ¿¼Ñ¡¿ Σá⌐½á. Äñ¡á¬« áαúπ-
- ¼Ñ¡Γ, «»αÑñѽ∩εΘ¿⌐ αѪ¿¼ ñ«ßΓπ»á, «Γ½¿τÑ¡: RWMODE αáó¡«: 0 -
- ñ½∩ τΓÑ¡¿∩, 1 - ñ½∩ ºá»¿ß¿, 2 - ñ½∩ τΓÑ¡¿∩ ¿ ºá»¿ß¿. àß½¿
- »α«¿ßσ«ñ¿Γ ¬á¬á∩-Γ« «Φ¿í¬á, Σπ¡¬µ¿∩ OPEN ó«ºóαáΘáÑΓ "-1"; ó
- »α«Γ¿ó¡«¼ ß½πτáÑ «¡á ó«ºóαáΘáÑΓ ñÑ⌐ßΓó¿Γѽ∞¡δ⌐ ñÑß¬α¿»Γ«α
- Σá⌐½á.
- Å«»δΓ¬á «Γ¬αδΓ∞ Σá⌐½, ¬«Γ«αδ⌐ ¡Ñ ßπΘÑßΓóπÑΓ, ∩ó½∩ÑΓß∩
- «Φ¿í¬«⌐. Æ«τ¬á óσ«ñá CREAT »αÑñ«ßΓáó½∩ÑΓ ó«º¼«ª¡«ßΓ∞ ß«ºñá-
- ¡¿∩ ¡«óδσ Σá⌐½«ó ¿½¿ »ÑαѺỿ߿ ßΓáαδσ. é αѺπ½∞ΓáΓÑ «íαáΘÑ-
- ¡¿∩
-
- FD=CREAT(NAME,PMODE);
-
- ó«ºóαáΘáÑΓ ñÑß¬α¿»Γ«α Σá⌐½á, Ñß½¿ «¬áºá½«ß∞ 󫺼«ª¡δ¼ ß«º-
- ñáΓ∞ Σá⌐½ ß ¿¼Ñ¡Ñ¼ NAME, ¿ "-1" ó »α«Γ¿ó¡«¼ ß½πτáÑ. àß½¿
- Σá⌐½ ß Γᬿ¼ ¿¼Ñ¡Ñ¼ πªÑ ßπΘÑßΓóπÑΓ, CREAT πßÑτÑΓ Ñú« ñ« ¡π-
- ½Ñó«⌐ ñ½¿¡δ; ß«ºñá¡¿Ñ Σá⌐½á, ¬«Γ«αδ⌐ πªÑ ßπΘÑßΓóπÑΓ, ¡Ñ ∩ó-
- ½∩ÑΓß∩ «Φ¿í¬«⌐.
- àß½¿ Σá⌐½ ∩ó½∩ÑΓß∩ ß«óÑαΦÑ¡¡« ¡«óδ¼, Γ« CREAT ß«ºñáÑΓ
- Ñú« ß «»αÑñѽѡ¡δ¼ αѪ¿¼«¼ ºáΘ¿Γδ, ߻ѵ¿Σ¿µ¿απÑ¼δ¼ áαúπ¼Ñ¡-
- Γ«¼ PMODE. é ß¿ßΓÑ¼Ñ Σá⌐½«ó ¡á UNIX ß Σá⌐½«¼ ßó∩ºδóáεΓß∩ ñÑ-
- ó∩Γ∞ í¿Γ«ó ºáΘ¿Γδ ¿¡Σ«α¼áµ¿¿, ¬«Γ«αδÑ π»αáó½∩εΓ αáºαÑΦÑ¡¿Ñ¼
- ¡á τΓÑ¡¿Ñ, ºá»¿ß∞ ¿ óδ»«½¡Ñ¡¿Ñ ñ½∩ ó½áñѽ∞µá Σá⌐½á, ñ½∩
- úαπ»»δ ó½áñѽ∞µÑó ¿ ñ½∩ óßÑσ «ßΓá½∞¡δσ »«½∞º«óáΓѽÑ⌐. Æá¬¿¼
- «íαẫ¼, ΓαÑσº¡áτ¡«Ñ ó«ß∞¼Ñα¿τ¡«Ñ τ¿ß½« ¡á¿í«½ÑÑ πñ«í¡« ñ½∩
- ߻ѵ¿Σ¿¬áµ¿¿ αáºαÑΦÑ¡¿⌐. ìá»α¿¼Ñα, τ¿ß½« 0755 ßó¿ñÑΓѽ∞ßΓóπ-
- ÑΓ « αáºαÑΦÑ¡¿¿ ¡á τΓÑ¡¿Ñ, ºá»¿ß∞ ¿ óδ»«½¡Ñ¡¿Ñ ñ½∩ ó½áñѽ∞µá
- ¿ « αáºαÑΦÑ¡¿¿ ¡á τΓÑ¡¿Ñ ¿ óδ»«½¡Ñ¡¿Ñ ñ½∩ úαπ»»δ ¿ óßÑσ «ß-
- Γá½∞¡δσ.
- ä½∩ ¿½½εßΓαᵿ¿ ¡¿ªÑ »α¿ó«ñ¿Γß∩ »α«úαá¼¼á ¬«»¿α«óá¡¿∩
- «ñ¡«ú« Σá⌐½á ó ñαπú«⌐, ∩ó½∩εΘá∩ß∩ π»α«ΘÑ¡¡δ¼ óáα¿á¡Γ«¼ πΓ¿-
- ½¿Γδ CP ß¿ßΓѼδ UNIX. (Äß¡«ó¡«Ñ π»α«ΘÑ¡¿Ñ ºá¬½ετáÑΓß∩ ó Γ«¼,
- τΓ« ¡áΦ óáα¿á¡Γ ¬«»¿απÑΓ Γ«½∞¬« «ñ¿¡ Σá⌐½ ¿ τΓ« óΓ«α«⌐ áαúπ-
- ¼Ñ¡Γ ¡Ñ ñ«½ªÑ¡ íδΓ∞ ß»αáó«τ¡¿¬«¼).
-
- #DEFINE NULL 0
- #DEFINE BUFSIZE 512
- #DEFINE PMODE 0644/*RW FOR OWNER,R FOR GROUP,OTHERS*/
- MAIN(ARGC,ARGV) /*CP: COPY F1 TO F2*/
- INT ARGC;
- CHAR *ARGV[];
- \(
- INT F1, F2, N;
- CHAR BUF[BUFSIZE];
-
- - 171 -
-
- IF (ARGC ! = 3)
- ERROR("USAGE:CP FROM TO", NULL);
- IF ((F1=OPEN(ARGV[1],0))== -1)
- ERROR("CP:CAN'T OPEN %S", ARGV[1]);
- IF ((F2=CREAT(ARGV[2],PMODE))== -1)
- ERROR("CP: CAN'T CREATE %S", ARGV[2]);
- WHILE ((N=READ(F1,BUF,BUFSIZE))>0)
- IF (WRITE(F2,BUF,N) !=N)
- ERROR("CP: WRITE ERROR", NULL);
- EXIT(0);
- \)
- ERROR(S1,S2) /*PRINT ERROR MESSAGE AND DIE*/
- CHAR *S1, S2;
- \(
- PRINTF(S1,S2);
- PRINTF("\N");
- EXIT(1);
- \)
-
- æπΘÑßΓóπÑΓ «úαá¡¿τÑ¡¿Ñ («íδτ¡« 15 - 25) ¡á ¬«½¿τÑßΓó«
- Σá⌐½«ó, ¬«Γ«αδÑ »α«úαá¼¼á ¼«ªÑΓ ¿¼ÑΓ∞ «Γ¬αδΓ묨 «ñ¡«óαѼѡ-
- ¡«. é ß««ΓóÑΓßΓó¿¿ ß φΓ¿¼ ½εíá∩ »α«úαá¼¼á, ß«í¿αáεΘá∩ß∩ αá-
- í«ΓáΓ∞ ß« ¼¡«ú¿¼¿ Σá⌐½á¼¿, ñ«½ª¡á íδΓ∞ »«ñú«Γ«ó½Ñ¡á ¬ »«ó-
- Γ«α¡«¼π ¿ß»«½∞º«óá¡¿ε ñÑß¬α¿»Γ«α«ó Σá⌐½«ó. Åα«µÑñπαá CLOSE
- »αÑαδóáÑΓ ßó∩º∞ ¼Ñªñπ ñÑß¬α¿»Γ«α«¼ Σá⌐½á ¿ «Γ¬αδΓδ¼ Σá⌐½«¼ ¿
- «ßó«í«ªñáÑΓ ñÑß¬α¿»Γ«α Σá⌐½á ñ½∩ ¿ß»«½∞º«óá¡¿∩ ß ¡Ñ¬«Γ«αδ¼
- ñαπú¿¼ Σá⌐½«¼. çáóÑαΦÑ¡¿Ñ óδ»«½¡Ñ¡¿∩ »α«úαá¼¼δ τÑαѺ EXIT
- ¿½¿ ó αѺπ½∞ΓáΓÑ ó«ºóαáΓá ¿º óÑñπΘÑ⌐ »α«úαá¼¼δ »α¿ó«ñ¿Γ ¬
- ºá¬αδΓ¿ε óßÑσ «Γ¬αδΓδσ Σá⌐½«ó.
- öπ¡¬µ¿∩ αáߵѻ½Ñ¡¿∩ UNLINK (FILENAME) πñá½∩ÑΓ ¿º ß¿ßΓѼδ
- Σá⌐½«ó Σá⌐½ ß ¿¼Ñ¡Ñ¼ FILENAME ( ¿º ñá¡¡«ú« ß»αáó«τ¡«ú« Σá⌐-
- ½á. öá⌐½ ¼«ªÑΓ íδΓ∞ ߵѻ½Ñ¡ ß ñαπú¿¼ ß»αáó«τ¡¿¬«¼, 󫺼«ª¡«,
- »«ñ ñαπú¿¼ ¿¼Ñ¡Ñ¼ - »α¿¼Ñτ.»ÑαÑó«ñτ¿¬á).
- ô»α᪡ѡ¿Ñ 8-1.
- --------------
- ÅÑαÑ»¿Φ¿ΓÑ »α«úαá¼¼π CAT ¿º ú½áóδ 7, ¿ß»«½∞ºπ∩ Σπ¡¬µ¿¿
- READ, WRITE, OPEN ¿ CLOSE ó¼ÑßΓ« ¿σ φ¬ó¿óá½Ñ¡Γ«ó ¿º ßΓá¡ñáα-
- Γ¡«⌐ í¿í½¿«ΓѬ¿. Åα«óÑñ¿ΓÑ φ¬ß»Ñα¿¼Ñ¡Γδ ñ½∩ «»αÑñѽѡ¿∩ «Γ-
- ¡«ß¿Γѽ∞¡«⌐ ߬«α«ßΓ¿ αáí«Γδ φΓ¿σ ñóπσ óáα¿á¡Γ«ó.
-
- 8.4. Åα«¿ºó«½∞¡δ⌐ ñ«ßΓπ» - SEEK ¿ LSEEK.
- ì«α¼á½∞¡« »α¿ αáí«ΓÑ ß Σá⌐½á¼¿ óó«ñ ¿ óδó«ñ «ßπΘÑßΓó½∩-
- ÑΓß∩ »«ß½Ññ«óáΓѽ∞¡«: »α¿ ¬áªñ«¼ «íαáΘÑ¡¿¿ ¬ Σπ¡¬µ¿∩¼ READ ¿
- WRITE τΓÑ¡¿Ñ ¿½¿ ºá»¿ß∞ ¡áτ¿¡áεΓß∩ ß »«º¿µ¿¿, ¡Ñ»«ßαÑñßΓóÑ¡-
- ¡« ß½ÑñπεΘÑ⌐ ºá »αÑñδñπΘÑ⌐ «íαáí«Γá¡¡«⌐. ì« »α¿ ¡Ñ«íσ«ñ¿¼«ß-
- Γ¿ Σá⌐½ ¼«ªÑΓ τ¿ΓáΓ∞ß∩ ¿½¿ ºá»¿ßδóáΓ∞ß∩ ó ½εí«¼ »α«¿ºó«½∞¡«¼
- »«α∩ñ¬Ñ. ÄíαáΘÑ¡¿Ñ ¬ ß¿ßΓÑ¼Ñ ß »«¼«Θ∞ε Σπ¡¬µ¿¿ LSEEK »«ºó«-
- ½∩ÑΓ »ÑαÑñó¿úáΓ∞ß∩ »« Σá⌐½π, ¡Ñ »α«¿ºó«ñ∩ Σá¬Γ¿τÑ߬«ú« τΓÑ-
- ¡¿∩ ¿½¿ ºá»¿ß¿. é αѺπ½∞ΓáΓÑ «íαáΘÑ¡¿∩
-
- LSEEK(FD,OFFSET,ORIGIN);
-
- - 172 -
-
- ΓѬπΘá∩ »«º¿µ¿∩ ó Σá⌐½Ñ ß ñÑß¬α¿»Γ«α«¼ FD »ÑαÑñó¿úáÑΓß∩ ¡á
- »«º¿µ¿ε OFFSET (ß¼ÑΘÑ¡¿Ñ), ¬«Γ«αá∩ «Γßτ¿ΓδóáÑΓß∩ «Γ ¼ÑßΓá,
- π¬áºδóáѼ«ú« áαúπ¼Ñ¡Γ«¼ ORIGIN (¡áτὫ «ΓßτÑΓá). ū߽ÑñπεΘÑÑ
- τΓÑ¡¿Ñ ¿½¿ ºá»¿ß∞ íπñπΓ ΓÑ»Ñα∞ ¡áτ¿¡áΓ∞ß∩ ß φΓ«⌐ »«º¿µ¿¿.
- Çαúπ¼Ñ¡Γ OFFSET ¿¼ÑÑΓ Γ¿» LONG; FD ¿ ORIGIN ¿¼ÑεΓ Γ¿» INT.
- Çαúπ¼Ñ¡Γ ORIGIN ¼«ªÑΓ »α¿¡¿¼áΓ∞ º¡áτÑ¡¿∩ 0,1 ¿½¿ 2, π¬áºδóá∩
- ¡á Γ«, τΓ« óѽ¿τ¿¡á OFFSET ñ«½ª¡á «Γßτ¿ΓδóáΓ∞ß∩ ß««ΓóÑΓßΓ-
- óÑ¡¡« «Γ ¡áτá½á Σá⌐½á, «Γ ΓѬπΘÑ⌐ »«º¿µ¿¿ ¿½¿ «Γ ¬«¡µá Σá⌐-
- ½á. ìá»α¿¼Ñα, τΓ«íδ ñ«»«½¡¿Γ∞ Σá⌐½, ß½ÑñπÑΓ »ÑαÑñ ºá»¿ß∞ε
- ¡á⌐Γ¿ Ñú« ¬«¡Ñµ:
-
- LSEEK(FD,0L,2);
-
- τΓ«íδ óÑα¡πΓ∞ß∩ ¬ ¡áτá½π ("»ÑαѼ«ΓáΓ∞ «íαáΓ¡«"), ¼«ª¡« ¡á»¿-
- ßáΓ∞:
-
- LSEEK(FD,0L,0);
-
- «íαáΓ¿ΓÑ ó¡¿¼á¡¿Ñ ¡á áαúπ¼Ñ¡Γ 0L; Ñú« ¼«ª¡« í佫 íδ ºá»¿ßáΓ∞
- ¿ ó ó¿ñÑ (LONG) 0.
- öπ¡¬µ¿∩ LSEEK »«ºó«½∩ÑΓ «íαáΘáΓ∞ß∩ ß Σá⌐½á¼¿ »α¿¼Ñα¡«
- ΓᬠªÑ, ¬á¬ ß í«½∞Φ¿¼¿ ¼áßß¿óἿ, »αáóñá µÑ¡«⌐ í«½ÑÑ ¼Ññ½Ñ¡-
- ¡«ú« ñ«ßΓπ»á. ß½ÑñπεΘá∩ »α«ßΓá∩ Σπ¡¬µ¿∩, ¡á»α¿¼Ñα, ßτ¿ΓδóáÑΓ
- ½εí«Ñ ¬«½¿τÑßΓó« íá⌐Γ«ó, ¡áτ¿¡á∩ ß »α«¿ºó«½∞¡«ú« ¼ÑßΓá ó
- Σá⌐½Ñ.
-
- GET(FD,POS,BUF,N) /*READ N BYTES FROM POSITION POS*/
- INT FD, N;
- LONG POS;
- CHAR *BUF;
- \(
- LSEEK(FD,POS,0); /*GET TO POS*/
- RETURN(READ(FD,BUF,N));
- \)
-
- é í«½ÑÑ αá¡¡¿σ αÑñᬵ¿∩σ, τѼ αÑñᬵ¿∩ 7 ß¿ßΓѼδ UNIX,
- «ß¡«ó¡á∩ Γ«τ¬á óσ«ñá ó ß¿ßΓѼπ óó«ñá-óδó«ñá ¡áºδóáÑΓß∩ SEEK.
- öπ¡¬µ¿∩ SEEK ¿ñÑ¡Γ¿τ¡á Σπ¡¬µ¿¿ LSEEK, ºá ¿ß¬½ετÑ¡¿Ñ¼ Γ«ú«,
- τΓ« áαúπ¼Ñ¡Γ OFFSET ¿¼ÑÑΓ Γ¿» INT, á ¡Ñ LONG. ó ß««ΓóÑΓßΓó¿¿
- ß φΓ¿¼, »«ß¬«½∞¬π ¡á PDP-11 µÑ½δÑ ¿¼ÑεΓ Γ«½∞¬« 16 í¿Γ«ó, áα-
- úπ¼Ñ¡Γ OFFSET, π¬áºδóáѼδ⌐ Σπ¡¬µ¿¿ SEEK, «úαá¡¿τÑ¡ óѽ¿τ¿¡«⌐
- 65535; »« φΓ«⌐ »α¿τ¿¡Ñ áαúπ¼Ñ¡Γ ORIGIN ¼«ªÑΓ ¿¼ÑΓ∞ º¡áτÑ¡¿∩
- 3, 4, 5, ¬«Γ«αδÑ ºáßΓáó½∩εΓ Σπ¡¬µ¿ε SEEK π¼¡«ª¿Γ∞ ºáñá¡¡«Ñ
- º¡áτÑ¡¿Ñ OFFSET ¡á 512 (¬«½¿τÑßΓó« íá⌐Γ«ó ó «ñ¡«¼ Σ¿º¿τÑ߬«¼
- í½«¬Ñ) ¿ ºáΓѼ ¿¡ΓÑα»αÑΓ¿α«óáΓ∞ ORIGIN, ¬á¬ Ñß½¿ φΓ« 0, 1
- ¿½¿ 2 ß««ΓóÑΓßΓóÑ¡¡«. æ½Ññ«óáΓѽ∞¡«, τΓ«íδ ñ«ßΓ¿τ∞ »α«¿º-
- ó«½∞¡«ú« ¼ÑßΓá ó í«½∞Φ«¼ Σá⌐½Ñ, ¡πª¡« ñóá «íαáΘÑ¡¿∩ ¬ SEEK:
- ß¡áτá½á «ñ¡«, ¬«Γ«α«Ñ óδñѽ∩ÑΓ ¡πª¡δ⌐ í½«¬, á ºáΓѼ óΓ«α«Ñ,
- úñÑ ORIGIN ¿¼ÑÑΓ º¡áτÑ¡¿Ñ 1 ¿ ¬«Γ«α«Ñ «ßπΘÑßΓó½∩ÑΓ »ÑαÑñó¿-
- ªÑ¡¿Ñ ¡á ªÑ½áѼδ⌐ íá⌐Γ ó¡πΓα¿ í½«¬á.
- ô»α᪡ѡ¿Ñ 8-2.
- ---------------
- ÄτÑó¿ñ¡«, τΓ« SEEK ¼«ªÑΓ íδΓ∞ ¡á»¿ßá¡á ó ΓÑନ¡á½áσ
- LSEEK ¿ ¡á«í«α«Γ. ¡á»¿Φ¿ΓÑ ¬áªñπε Σπ¡¬µ¿ε τÑαѺ ñαπúπε.
-
- - 173 -
-
- 8.5. Åα¿¼Ñα - αÑ὿ºáµ¿∩ Σπ¡¬µ¿⌐ FOPEN ¿ GETC.
- äáóá⌐ΓÑ ΓÑ»Ñα∞ ¡á »α¿¼ÑαÑ αÑ὿ºáµ¿¿ Σπ¡¬µ¿⌐ FOPEN ¿
- GETC ¿º ßΓá¡ñáαΓ¡«⌐ í¿í½¿«ΓѬ¿ »«ñ»α«úαá¼¼ »α«ñѼ«¡ßΓα¿απѼ,
- ¬á¬ ¡Ñ¬«Γ«αδÑ ¿º «»¿ßá¡¡δσ φ½Ñ¼Ñ¡Γ«ó «íΩÑñ¿¡∩εΓß∩ ó¼ÑßΓÑ.
- ìừ¼¡¿¼, τΓ« ó ßΓá¡ñáαΓ¡«⌐ í¿í½¿«ΓÑ¬Ñ Σá⌐½δ «»¿ßδóáΓß∩
- »«ßαÑñßΓó«¼ π¬áºáΓѽÑ⌐ Σá⌐½«ó, á ¡Ñ ñÑß¬α¿»Γ«α«ó. ô¬áºáΓѽ∞
- Σá⌐½á ∩ó½∩ÑΓß∩ π¬áºáΓѽѼ ¡á ßΓαπ¬Γπαπ, ¬«Γ«αá∩ ß«ñÑনΓ
- ¡Ñ߬«½∞¬« φ½Ñ¼Ñ¡Γ«ó ¿¡Σ«α¼áµ¿¿ « Σá⌐½Ñ: π¬áºáΓѽ∞ íπΣÑαá,
- τΓ«íδ Σá⌐½ ¼«ú τ¿ΓáΓ∞ß∩ í«½∞Φ¿¼¿ »«αµ¿∩¼¿; ßτÑΓτ¿¬ τ¿ß½á
- ß¿¼ó«½«ó, «ßΓáóΦ¿σß∩ ó íπΣÑαÑ; π¬áºáΓѽ∞ ß½ÑñπεΘÑ⌐ »«º¿µ¿¿
- ß¿¼ó«½á ó íπΣÑαÑ; ¡Ñ¬«Γ«αδÑ »α¿º¡á¬¿, π¬áºδóáεΘ¿Ñ αѪ¿¼ τΓÑ-
- ¡¿∩ ¿½¿ ºá»¿ß¿ ¿ Γ.ñ.; ñÑß¬α¿»Γ«α Σá⌐½á.
- Ä»¿ßδóáεΘá∩ Σá⌐½ ßΓαπ¬Γπαá ñá¡¡δσ ß«ñÑনΓß∩ ó Σá⌐½Ñ
- STDIO.H, ¬«Γ«αδ⌐ ñ«½ªÑ¡ ó¬½ετáΓ∞ß∩ (»«ßαÑñßΓó«¼ #INCLUDE) ó
- ½εí«⌐ ¿ßσ«ñ¡δ⌐ Σá⌐½, ó ¬«Γ«α«¼ ¿ß»«½∞ºπεΓß∩ Σπ¡¬µ¿¿ ¿º ßΓá¡-
- ñáαΓ¡«⌐ í¿í½¿«ΓѬ¿. Ä¡ Γá¬ªÑ ó¬½ετáÑΓß∩ Σπ¡¬µ¿∩¼¿ φΓ«⌐ í¿í-
- ½¿«ΓѬ¿. é »α¿ó«ñ¿¼«⌐ ¡¿ªÑ óδñÑαª¬Ñ ¿º Σá⌐½á STDIO.H ¿¼Ñ¡á,
- »αÑñ¡áº¡áτáѼδÑ Γ«½∞¬« ñ½∩ ¿ß»«½∞º«óá¡¿∩ Σπ¡¬µ¿∩¼¿ í¿í½¿«ΓÑ-
- ¬¿, ¡áτ¿¡áεΓß∩ ß »«ñτÑનóá¡¿∩, ß ΓѼ τΓ«íδ π¼Ñ¡∞Φ¿Γ∞ óÑα«-
- ∩Γ¡«ßΓ∞ ß«ó»áñÑ¡¿∩ ß ¿¼Ñ¡á¼¿ ó »α«úαá¼¼Ñ »«½∞º«óáΓѽ∩.
-
- DEFINE _BUFSIZE 512
- DEFINE _NFILE 20 /*FILES THAT CAN BE HANDLED*/
- TYPEDEF STRUCT _IOBUF \(
- CHAR *_PTR; /*NEXT CHARACTER POSITION*/
- INT _CNT; /*NUMBER OF CHARACTERS LEFT*/
- CHAR *_BASE; /*LOCATION OF BUFFER*/
- INT _FLAG; /*MODE OF FILE ACCESS*/
- INT _FD; /*FILE DESCRIPTOR*/
- ) FILE;
- XTERN FILE _IOB[_NFILE];
-
- DEFINE STDIN (&_IOB[0])
- DEFINE STDOUT (&_IOB[1])
- DEFINE STDERR (&_IOB[2])
-
- DEFINE _READ 01 /* FILE OPEN FOR READING */
- DEFINE _WRITE 02 /* FILE OPEN FOR WRITING */
- DEFINE _UNBUF 04 /* FILE IS UNBUFFERED */
- DEFINE _BIGBUF 010 /* BIG BUFFER ALLOCATED */
- DEFINE _EOF 020 /* EOF HAS OCCURRED ON THIS FILE */
- DEFINE _ERR 040 /* ERROR HAS OCCURRED ON THIS FILE */
- DEFINE NULL 0
- DEFINE EOF (-1)
-
- DEFINE GETC(P) (--(P)->_CNT >= 0 \
- ? *(P)->_PTR++ & 0377 : _FILEBUF(P))
- DEFINE GETCHAR() GETC(STDIN)
-
- DEFINE PUTC(X,P) (--(P)->_CNT >= 0 \
- ? *(P)->_PTR++ = (X) : _FLUSHBUF((X),P))
- DEFINE PUTCHAR(X) PUTC(X,STDOUT)
-
- - 174 -
-
- é ¡«α¼á½∞¡«¼ ß«ßΓ«∩¡¿¿ ¼á¬α«ß GETC »α«ßΓ« π¼Ñ¡∞ΦáÑΓ
- ßτÑΓτ¿¬, »ÑαÑñó¿úáÑΓ π¬áºáΓѽ∞ ¿ ó«ºóαáΘáÑΓ ß¿¼ó«½. (àß½¿
- «»αÑñѽѡ¿Ñ #DEFINE ß½¿Φ¬«¼ ñ½¿¡¡«Ñ, Γ« «¡« »α«ñ«½ªáÑΓß∩ ß
- »«¼«Θ∞ε «íαáΓ¡«⌐ ¬«ß«⌐ τÑαΓδ). àß½¿ «ñ¡á¬« ßτÑΓτ¿¬ ßΓá¡«ó¿Γ-
- ß∩ «Γα¿µáΓѽ∞¡δ¼, Γ« GETC óδºδóáÑΓ Σπ¡¬µ¿ε _FILEBUF, ¬«Γ«αá∩
- ß¡«óá ºá»«½¡∩ÑΓ íπΣÑα, αÑ¿¡¿µ¿á½¿º¿απÑΓ ß«ñÑন¼«Ñ ßΓαπ¬Γπαδ
- ¿ ó«ºóαáΘáÑΓ ß¿¼ó«½. öπ¡¬µ¿∩ ¼«ªÑΓ »αÑñ«ßΓáó½∩Γ∞ »ÑαÑ¡«ß¿¼δ⌐
- ¿¡ΓÑαΣÑ⌐ß ¿ ó Γ« ªÑ óαѼ∩ ß«ñÑαªáΓ∞ ¡Ñ»ÑαÑ¡«ß¿¼δÑ ¬«¡ßΓαπ¬-
- µ¿¿: GETC ¼á߬¿απÑΓ ß¿¼ó«½ τ¿ß½«¼ 0377, ¬«Γ«α«Ñ »«ñáó½∩ÑΓ
- º¡á¬«ó«Ñ αáßΦ¿αÑ¡¿Ñ, «ßπΘÑßΓó½∩Ѽ«Ñ ¡á PDP-11, ¿ ΓѼ ßá¼δ¼
- úáαá¡Γ¿απÑΓ »«½«ª¿Γѽ∞¡«ßΓ∞ óßÑσ ß¿¼ó«½«ó.
- ò«Γ∩ ¼δ ¡Ñ ß«í¿αáѼß∩ «íßπªñáΓ∞ ¬á¬¿Ñ-½¿í« ñÑΓ὿, ¼δ
- óßÑ ªÑ ó¬½ετ¿½¿ ßεñá «»αÑñѽѡ¿Ñ ¼á¬α«ßá PUTC, ñ½∩ Γ«ú« τΓ«-
- íδ »«¬áºáΓ∞, τΓ« «¡á αáí«ΓáÑΓ ó «ß¡«ó¡«¼ Γ«τ¡« ΓᬪÑ, ¬á¬ ¿
- GETC, «íαáΘá∩ß∞ »α¿ ºá»«½¡Ñ¡¿¿ íπΣÑαá ¬ Σπ¡¬µ¿¿ _FLUSHBUF.
- ÆÑ»Ñα∞ ¼«ªÑΓ íδΓ∞ ¡á»¿ßá¡á Σπ¡¬µ¿∩ FOPEN. ü«½∞Φá∩ τáßΓ∞
- »α«úαá¼¼δ Σπ¡¬µ¿¿ FOPEN ßó∩ºá¡á ß «Γ¬αδó᡿Ѽ Σá⌐½á ¿ αáß»«-
- ½«ªÑ¡¿Ñ¼ Ñú« ó ¡πª¡«¼ ¼ÑßΓÑ, á Γá¬ªÑ ß πßΓá¡«ó½Ñ¡¿Ñ¼ í¿Γ«ó
- »α¿º¡á¬«ó Γᬿ¼ «íαẫ¼, τΓ«íδ «¡¿ π¬áºδó὿ ¡πª¡«Ñ ß«ßΓ«∩-
- ¡¿Ñ. öπ¡¬µ¿∩ FOPEN ¡Ñ óδñѽ∩ÑΓ ¬á¬«⌐-½¿í« íπΣÑα¡«⌐ »á¼∩Γ¿;
- φΓ« ñѽáÑΓß∩ Σπ¡¬µ¿Ñ⌐ _FILEBUF »α¿ »Ñαó«¼ τΓÑ¡¿¿ ¿º Σá⌐½á.
-
- #INCLUDE <STDIO.H>
- #DEFINE PMODE 0644 /*R/W FOR OWNER;R FOR OTHERS*/
- FILE *FOPEN(NAME,MODE) /*OPEN FILE,RETURN FILE PTR*/
- REGISTER CHAR *NAME, *MODE;
- \(
- REGISTER INT FD;
- REGISTER FILE *FP;
- IF(*MODE !='R'&&*MODE !='W'&&*MODE !='A') \(
- FPRINTF(STDERR,"ILLEGAL MODE %S OPENING %S\N",
- MODE,NAME);
- EXIT(1);
- \)
- FOR (FP=_IOB;FP<_IOB+_NFILE;FP++)
- IF((FP->_FLAG & (_READ \! _WRITE))==0)
- BREAK; /*FOUND FREE SLOT*/
- IF(FP>=_IOB+_NFILE) /*NO FREE SLOTS*/
- RETURN(NULL);
- IF(*MODE=='W') /*ACCESS FILE*/
- FD=CREAT(NAME,PMODE);
- ELSE IF(*MODE=='A') \(
- IF((FD=OPEN(NAME,1))==-1)
- FD=CREAT(NAME,PMODE);
- LSEEK(FD,OL,2);
- \) ELSE
- FD=OPEN(NAME,0);
- IF(FD==-1) /*COULDN'T ACCESS NAME*/
- RETURN(NULL);
- FP->_FD=FD;
- FP->_CNT=0;
- FP->_BASE=NULL;
- FP->_FLAG &=(_READ \! _WRITE);
- FP->_FLAG \!=(*MODE=='R') ? _READ : _WRITE;
- RETURN(FP);
- \)
- - 175 -
-
- öπ¡¬µ¿∩ _FILEBUF ¡Ñ߬«½∞¬« í«½ÑÑ ß½«ª¡á∩. Äß¡«ó¡á∩ Γαπñ-
- ¡«ßΓ∞ ºá¬½ετáÑΓß∩ ó Γ«¼, τΓ« _FILEBUF ßΓαѼ¿Γß∩ αáºαÑΦ¿Γ∞
- ñ«ßΓπ» ¬ Σá⌐½π ¿ ó Γ«¼ ß½πτáÑ, ¬«úñá ¼«ªÑΓ ¡Ñ «¬áºáΓ∞ß∩ ñ«ß-
- ΓáΓ«τ¡« ¼ÑßΓá ó »á¼∩Γ¿ ñ½∩ íπΣÑα¿ºáµ¿¿ óó«ñá ¿½¿ óδó«ñá. Ñß-
- ½¿ »α«ßΓαá¡ßΓó« ñ½∩ ¡«ó«ú« íπΣÑαá ¼«ªÑΓ íδΓ∞ »«½πτÑ¡« «íαá-
- ΘÑ¡¿Ñ¼ ¬ Σπ¡¬µ¿¿ CALLOC, Γ« óßÑ «Γ½¿τ¡«; Ñß½¿ ªÑ ¡ÑΓ, Γ«
- _FILEBUF «ßπΘÑßΓó½∩ÑΓ ¡ÑíπΣÑਧ«óá¡¡δ⌐ óó«ñ/ óδó«ñ, ¿ß»«½∞-
- ºπ∩ «Γñѽ∞¡δ⌐ ß¿¼ó«½, »«¼ÑΘÑ¡¡δ⌐ ó ½«¬á½∞¡«¼ ¼áßß¿óÑ.
-
- #INCLUDE <STDIO.H>
- _FILLBUF(FP) /*ALLOCATE AND FILL INPUT BUFFER*/
- REGISTER FILE *FP;
- (
- STATIC CHAR SMALLBUF(NFILE);/*FOR UNBUFFERED 1/0*/
- CHAR *CALLOC();
- IF((FR->_FLAG&_READ)==0\!\!(FP->_FLAG&(EOF\!_ERR))\!=0
- RETURN(EOF);
- WHILE(FP->_BASE==NULL) /*FIND BUFFER SPACE*/
- IF(FP->_FLAG & _UNBUF) /*UNBUFFERED*/
- FP->_BASE=&SMALLBUF[FP->_FD];
- ELSE IF((FP->_BASE=CALLOC(_BUFSIZE,1))==NULL)
- FP->_FLAG \!=_UNBUF; /*CAN'T GET BIG BUF*/
- ELSE
- FP->_FLAG \!=_BIGBUF; /*GOT BIG ONE*/
- FP->_PTR=FP->_BASE;
- FP->_CNT=READ(FP->_FD, FP->_PTR,
- FP->_FLAG & _UNBUF ? 1 : _BUFSIZE);
- FF(--FP->_CNT<0) \(
- IF(FP->_CNT== -1)
- FP->_FLAG \! = _EOF;
- ELSE
- FP->_FLAG \! = _ ERR;
- FP->_CNT = 0;
- RETURN(EOF);
- \)
- RETURN(*FP->_PTR++ & 0377); /*MAKE CHAR POSITIVE*/
- )
-
- Åα¿ »Ñαó«¼ «íαáΘÑ¡¿¿ ¬ GETC ñ½∩ ¬«¡¬αÑΓ¡«ú« Σá⌐½á ßτÑΓτ¿¬
- «¬áºδóáÑΓß∩ αáó¡δ¼ ¡π½ε, τΓ« »α¿ó«ñ¿Γ ¬ «íαáΘÑ¡¿ε ¬
- _FILEBUF. àß½¿ Σπ¡¬µ¿∩ _FILEBUF ¡á⌐ñÑΓ, τΓ« φëà Σá⌐½ ¡Ñ «Γ-
- ¬αδΓ ñ½∩ τΓÑ¡¿∩, «¡á ¡Ñ¼Ññ½Ñ¡¡« ó«ºóαáΘáÑΓ EOF. é »α«Γ¿ó¡«¼
- ß½πτáÑ «¡á »δΓáÑΓß∩ óδñѽ¿Γ∞ í«½∞Φ«⌐ íπΣÑα, á Ñß½¿ Ñ⌐ φΓ« ¡Ñ
- πñáÑΓß∩, Γ« íπΣÑα ¿º «ñ¡«ú« ß¿¼ó«½á. Åα¿ φΓ«¼ «¡á ºá¡«ß¿Γ ó
- _FLAG ß««ΓóÑΓßΓóπεΘπε ¿¡Σ«α¼áµ¿ε « íπΣÑα¿ºáµ¿¿.
- ÉẠíπΣÑα πªÑ ß«ºñá¡, Σπ¡¬µ¿∩ _FILEBUF »α«ßΓ« óδºδóáÑΓ
- Σπ¡¬µ¿ε READ ñ½∩ Ñú« ºá»«½¡Ñ¡¿∩, πßΓá¡áó½¿óáÑΓ ßτÑΓτ¿¬ ¿
- π¬áºáΓѽ¿ ¿ ó«ºóαáΘáÑΓ ß¿¼ó«½ ¿º ¡áτá½á íπΣÑαá.
- àñ¿¡ßΓóÑ¡¡δ⌐ «ßΓáóΦ¿⌐ß∩ ¡Ñóδ∩ߡѡ¡δ¼ ó«»α«ß ß«ßΓ«¿Γ ó
- Γ«¼, ¬á¬ óßÑ ¡áτ¿¡áÑΓß∩. îáßß¿ó _IOB ñ«½ªÑ¡ íδΓ∞ «»αÑñѽѡ ¿
- ¿¡¿µ¿á½¿º¿α«óá¡ ñ½∩ STDIN, STDOUT ¿ STDERR:
-
- - 176 -
-
- FILE _IOB[NFILE] = \(
- (NULL,0,_READ,0), /*STDIN*/
- (NULL,0,NULL,1), /*STDOUT*/
- (NULL,0,NULL,_WRITE \! _UNBUF,2) /*STDERR*/
- );
-
- êº ¿¡¿µ¿á½¿ºáµ¿¿ τáßΓ¿ _FLAG φΓ«ú« ¼áßß¿óá ßΓαπ¬Γπα ó¿ñ¡«,
- τΓ« Σá⌐½ STDIN »αÑñ¡áº¡áτÑ¡ ñ½∩ τΓÑ¡¿∩, Σá⌐½ STDOUT - ñ½∩
- ºá»¿ß¿ ¿ Σá⌐½ STDERR - ñ½∩ ºá»¿ß¿ íѺ ¿ß»«½∞º«óá¡¿∩ íπΣÑαá.
- ô»α᪡ѡ¿Ñ 8-3.
- --------------
- ÅÑαÑ»¿Φ¿ΓÑ Σπ¡¬µ¿¿ FOPEN ¿ _FILEBUF, ¿ß»«½∞ºπ∩ »«½∩
- ó¼ÑßΓ« ∩ó¡δσ »«í¿Γ«óδσ «»Ñαᵿ⌐.
- ô»α᪡ѡ¿Ñ 8-4.
- ---------------
- Éáºαáí«Γá⌐ΓÑ ¿ ¡á»¿Φ¿ΓÑ Σπ¡¬µ¿¿ _FLUSHBUF ¿ FCLOSE.
- ô»α᪡ѡ¿Ñ 8-5.
- ---------------
- æΓá¡ñáαΓ¡á∩ í¿í½¿«ΓѬá ß«ñÑαª¿Γ Σπ¡¬µ¿ε
-
- FSEEK(FP, OFFSET, ORIGIN)
-
- ¬«Γ«αá∩ ¿ñÑ¡Γ¿τ¡á Σπ¡¬µ¿¿ LSEEK, ¿ß¬½ετá∩ Γ«, τΓ« FP ∩ó½∩ÑΓ-
- ß∩ π¬áºáΓѽѼ Σá⌐½á, á ¡Ñ ñÑß¬α¿»Γ«α«¼ Σá⌐½á. ìá»¿Φ¿ΓÑ
- FSEEK. ôíÑñ¿ΓÑß∞, τΓ« óáΦá FSEEK »αáó¿½∞¡« ß«ú½áßπÑΓß∩ ß íπ-
- ΣÑα¿ºáµ¿Ñ⌐, ßñѽᡡ«⌐ ñ½∩ ñαπú¿σ Σπ¡¬µ¿⌐ í¿í½¿«ΓѬ¿.
-
- 8.6. Åα¿¼Ñα - αáß»ÑτáΓ¬á ß»αáó«τ¡¿¬«ó
- ê¡«úñá ΓαÑíπÑΓß∩ ñαπú«⌐ ó¿ñ óºá¿¼«ñÑ⌐ßΓó¿∩ ß ß¿ßΓѼ«⌐
- Σá⌐½«ó - «»αÑñѽѡ¿Ñ ¿¡Σ«α¼áµ¿¿ « Σá⌐½Ñ, á ¡Ñ Γ«ú«, τΓ« ó
- ¡Ñ¼ ß«ñÑনΓß∩. Åα¿¼Ñα«¼ ¼«ªÑΓ ß½πª¿Γ∞ ¬«¼á¡ñá LS ("ß»¿ß«¬
- ß»αáó«τ¡¿¬á") ß¿ßΓѼδ UNIX. Å« φΓ«⌐ ¬«¼á¡ñÑ αáß»ÑτáΓδóáεΓß∩
- ¿¼Ñ¡á Σá⌐½«ó ¿º ß»αáó«τ¡¿¬á ¿, ¡Ñ«í∩ºáΓѽ∞¡«, ñαπúá∩ ¿¡Σ«α-
- ¼áµ¿∩, Γá¬á∩ ¬á¬ αẼÑαδ, αáºαÑΦÑ¡¿∩ ¿ Γ.ñ.
- ū߬«½∞¬π, »« ¬αá⌐¡Ñ⌐ ¼ÑαÑ, ¡á ß¿ßΓÑ¼Ñ UNIX ß»αáó«τ¡¿¬
- ∩ó½∩ÑΓß∩ »α«ßΓ« Σá⌐½«¼, Γ« ó Γᬫ⌐ ¬«¼á¡ñÑ, ¬á¬ LS ¡ÑΓ ¡¿τÑ-
- ú« «ß«íÑ¡¡«ú«; «¡á τ¿ΓáÑΓ Σá⌐½ ¿ óδñѽ∩ÑΓ ¡πª¡δÑ τáßΓ¿ ¿º
- ¡áσ«ñ∩ΘÑ⌐ß∩ Γá¼ ¿¡Σ«α¼áµ¿¿. Äñ¡á¬« Σ«α¼áΓ ¿¡Σ«α¼áµ¿¿ «»αÑñÑ-
- ½∩ÑΓß∩ ß¿ßΓѼ«⌐, ΓᬠτΓ« LS ñ«½ª¡á º¡áΓ∞, ó ¬á¬«¼ ó¿ñÑ óßÑ
- »αÑñßΓáó½∩ÑΓß∩ ó ß¿ßΓѼÑ.
- îδ φΓ« τáßΓ¿τ¡« »α«¿½½εßΓα¿απѼ »α¿ ¡á»¿ßá¡¿¿ »α«úαá¼¼δ
- FSIZE. Åα«úαá¼¼á FSIZE »αÑñßΓáó½∩ÑΓ ß«í«⌐ ߻ѵ¿á½∞¡πε Σ«α¼π
- LS, ¬«Γ«αá∩ »ÑτáΓáÑΓ αẼÑαδ óßÑσ Σá⌐½«ó, π¬áºá¡¡δσ ó ß»¿ß¬Ñ
- ÑÑ áαúπ¼Ñ¡Γ«ó. àß½¿ «ñ¿¡ ¿º Σá⌐½«ó ∩ó½∩ÑΓß∩ ß»αáó«τ¡¿¬«¼, Γ«
- ñ½∩ «íαáí«Γ¬¿ φΓ«ú« ß»αáó«τ¡¿¬á »α«úαá¼¼á FSIZE «íαáΘáÑΓß∩
- ßá¼á ¬ ßÑíÑ αѬπαß¿ó¡«. Ñß½¿ ªÑ áαúπ¼Ñ¡Γδ ó««íΘÑ «ΓßπΓßΓóπ-
- εΓ, Γ« «íαáíáΓδóáÑΓß∩ ΓѬπΘ¿⌐ ß»αáó«τ¡¿¬.
- ä½∩ ¡áτá½á ñáñ¿¼ ¬αáΓ¬¿⌐ «íº«α ßΓαπ¬Γπαδ ß¿ßΓѼδ Σá⌐½«ó.
- æ»αáó«τ¡¿¬ - φΓ« Σá⌐½, ¬«Γ«αδ⌐ ß«ñÑαª¿Γ ß»¿ß«¬ ¿¼Ñ¡ Σá⌐½«ó ¿
- ¡Ñ¬«Γ«α«Ñ π¬áºá¡¿Ñ « Γ«¼, úñÑ «¡¿ αẼÑΘáεΓß∩. öá¬Γ¿τÑ߬¿
- φΓ« π¬áºá¡¿Ñ ∩ó½∩ÑΓß∩ ¿¡ñѬ߫¼ ñ½∩ ñαπú«⌐ Γáí½¿µδ, ¬«Γ«απε
- ¡áºδóáεΓ "I - πº½«ó«⌐ Γáí½¿µÑ⌐". ä½∩ Σá⌐½á I-πºÑ½ - φΓ« Γ«,
-
- - 177 -
-
- úñÑ ß«ñÑনΓß∩ óß∩ ¿¡Σ«α¼áµ¿∩ « Σá⌐½Ñ, ºá ¿ß¬½ετÑ¡¿Ñ¼ Ñú«
- ¿¼Ñ¡¿. çỿß∞ ó ß»αáó«τ¡¿¬Ñ ß«ßΓ«¿Γ Γ«½∞¬« ¿º ñóπσ φ½Ñ¼Ñ¡-
- Γ«ó: ¡«¼Ñαá I-πº½á ¿ ¿¼Ñ¡¿ Σá⌐½á. Æ«τ¡á∩ ߻ѵ¿Σ¿¬áµ¿∩ »«ßΓπ-
- »áÑΓ »α¿ ó¬½ετÑ¡¿¿ Σá⌐½á SYS/DIR.H, ¬«Γ«αδ⌐ ß«ñÑনΓ
-
- #DEFINE DIRSIZ 14 /*MAX LENGTH OF FILE NAME*/
- STRUCT DIRECT /*STRUCTURE OF DIRECTORY ENTRY*/
- \(
- INO_T&_INO; /*INODE NUMBER*/
- CHAR &_NAME[DIRSIZ]; /*FILE NAME*/
- \);
-
- "Æ¿»" INO_T - φΓ« «»αÑñѽ∩Ѽδ⌐ »«ßαÑñßΓó«¼ TYPEDEF Γ¿»,
- ¬«Γ«αδ⌐ «»¿ßδóáÑΓ ¿¡ñÑ¬ß I-πº½«ó«⌐ Γáí½¿µδ. ìá PDP-11 UNIX
- φΓ¿¼ Γ¿»«¼ «¬áºδóáÑΓß∩ UNSIGNED, ¡« φΓ« ¡Ñ Γ«Γ ß«αΓ ¿¡Σ«α¼á-
- µ¿¿, ¬«Γ«αδ⌐ »«¼ÑΘáεΓ ó¡πΓα∞ »α«úαá¼¼δ: ¡á αạδσ ß¿ßΓѼáσ
- φΓ«Γ Γ¿» ¼«ªÑΓ íδΓ∞ αẽ¿τ¡δ¼. Å«φΓ«¼π ¿ ß½ÑñπÑΓ ¿ß»«½∞º«-
- óáΓ∞ TYPEDEF. Å«½¡δ⌐ ¡áí«α "ß¿ßΓѼ¡δσ" Γ¿»«ó ¡áσ«ñ¿Γß∩ ó
- Σá⌐½Ñ SYS/TUPES.H.
- öπ¡¬µ¿∩ STAT íÑαÑΓ ¿¼∩ Σá⌐½á ¿ ó«ºóαáΘáÑΓ óßε ß«ñÑαªáΘπ-
- εß∩ ó I-«¼ πº½Ñ ¿¡Σ«α¼áµ¿ε «í φΓ«¼ Σá⌐½Ñ (¿½¿ -1, Ñß½¿ ¿¼Ñ-
- ÑΓß∩ «Φ¿í¬á). Æá¬¿¼ «íαẫ¼, ó αѺπ½∞ΓáΓÑ
-
- STRUCT STAT STBUF;
- CHAR *NAME;
- STAT(NAME,&STBUF);
-
- ßΓαπ¬Γπαá STBUF ¡á»«½¡∩ÑΓß∩ ¿¡Σ«α¼áµ¿Ñ⌐ ¿º I-ú« πº½á « Σá⌐½Ñ
- ß ¿¼Ñ¡Ñ¼ NAME. æΓαπ¬Γπαá, «»¿ßδóáεΘá∩ ó«ºóαáΘáѼπε Σπ¡¬µ¿Ñ⌐
- STAT ¿¡Σ«α¼áµ¿ε, ¡áσ«ñ¿Γß∩ ó Σá⌐½Ñ SYS/STAT.H ¿ óδú½∩ñ¿Γ
- ß½ÑñπεΘ¿¼ «íαẫ¼:
-
- STRUCT STAT /*STRUCTURE RETURNED BY STAT*/
- \(
- DEV_T ST_DEV; /* DEVICE OF INODE */
- INO_T ST_INO; /* INODE NUMBER */
- SHORT ST_MODE /* MODE BITS */
- SHORT ST_NLINK; / *NUMBER OF LINKS TO FILE */
- SHORT ST_UID; /* OWNER'S USER ID */
- SHORT ST_GID; /* OWNER'S GROUP ID */
- DEV_T ST_RDEV; /* FOR SPECIAL FILES */
- OFF_T ST_SIZE; /* FILE SIZE IN CHARACTERS */
- TIME_T ST_ATIME; /* TIME LAST ACCESSED */
- TIME_T ST_MTIME; /* TIME LAST MODIFIED */
- TIME_T ST_CTIME; /* TIME ORIGINALLY CREATED */
- \)
-
- ü«½∞Φá∩ τáßΓ∞ φΓ«⌐ ¿¡Σ«α¼áµ¿¿ «íΩ∩ß¡∩ÑΓß∩ ó ¬«¼¼Ñ¡Γáα¿∩σ.
- ¥½Ñ¼Ñ¡Γ ST.MODE ß«ñÑαª¿Γ ¡áí«α Σ½áú«ó, «»¿ßδóáεΘ¿σ Σá⌐½; ñ½∩
- πñ«íßΓóá «»αÑñѽѡ¿∩ Σ½áú«ó Γá¬ªÑ ¡áσ«ñ∩Γß∩ ó Σá⌐½Ñ
- SYS/STAT.H.
-
- - 178 -
-
-
- #DEFINE S_IFMT 0160000 /* TYPE OF FILE */
- #DEFINE S_IFDIR 0040000 /* DIRECTORY */
- #DEFINE S_IFCHR 0020000 /* CHARACTER SPECIAL */
- #DEFINE S_IFBLK 0060000 /* BLOCK SPECIAL */
- #DEFINE S_IFREG 0100000 /* REGULAR */
- #DEFINE S_ISUID 04000 /* SET USER ID ON EXECUTION */
- #DEFINE S_ISGID 02000 /* SET GROUP ID ON EXECUTION */
- #DEFINE S_ISVTX 01000 /*SAVE SWAPPED TEXT AFTER USE*/
- #DEFINE S_IREAD 0400 /* READ PERMISSION */
- #DEFINE S_IWRITE 0200 /* WRITE PERMISSION */
- #DEFINE S_IEXEC 0100 /* EXECUTE PERMISSION */
-
- ÆÑ»Ñα∞ ¼δ ó ß«ßΓ«∩¡¿¿ ¡á»¿ßáΓ∞ »α«úαá¼¼π FSIZE. àß½¿ »«-
- ½πτÑ¡¡δ⌐ «Γ Σπ¡¬µ¿¿ STAT αѪ¿¼ π¬áºδóáÑΓ, τΓ« Σá⌐½ ¡Ñ ∩ó½∩-
- ÑΓß∩ ß»αáó«τ¡¿¬«¼, Γ« Ñú« αẼÑα πªÑ »«ñ απ¬«⌐ ¿ ¼«ªÑΓ íδΓ∞
- ¡á»ÑτáΓá¡ ¡Ñ»«ßαÑñßΓóÑ¡¡«. àß½¿ ªÑ «¡ «¬áºδóáÑΓß∩ ß»αáó«τ¡¿-
- ¬«¼, Γ« ¼δ ñ«½ª¡δ «íαáíáΓδóáΓ∞ φΓ«Γ ß»αáó«τ¡¿¬ «Γñѽ∞¡« ñ½∩
- ¬áªñ«ú« Σá⌐½á; Γᬠ¬á¬ ß»αáó«τ¡¿¬ ¼«ªÑΓ ó ßó«ε «τÑαÑñ∞ ß«-
- ñÑαªáΓ∞ »«ñß»αáó«τ¡¿¬¿, φëà »α«µÑßß «íαáí«Γ¬¿ ∩ó½∩ÑΓß∩ αÑ-
- ¬παß¿ó¡δ¼.
- èᬠ«íδτ¡«, óÑñπΘá∩ »α«úαá¼¼á ú½áó¡δ¼ «íαẫ¼ ¿¼ÑÑΓ ñѽ«
- ß ¬«¼á¡ñ¡«⌐ ßΓ᫬«⌐ áαúπ¼Ñ¡Γ«ó; «¡á »ÑαÑñáÑΓ ¬áªñδ⌐ áαúπ¼Ñ¡Γ
- Σπ¡¬µ¿¿ FSIZE ó í«½∞Φ«⌐ íπΣÑα.
-
- #INCLUDE <STDIO.H.>
- #INCLUDE <SYS/TYPES.H> /*TYPEDEFS*/
- #INCLUDE <SYS/DIR.H> /*DIRECTORY ENTRY STRUCTURE*/
- #INCLUDE <SYS/STAT.H> /*STRUCTURE RETURNED BY STAT*/
- #DEFINE BUFSIZE 256
- MAIN(ARGC,ARGV) /*FSIZE:PRINT FILE SIZES*/
- CHAR *ARGV[];
- \(
- CHAR BUF[BUFSIZE];
- IF(ARGC==1) \( /*DEFAULT:CURRENT DIRECTORY*/
- ATRCPY(BUF,".");
- FSIZE(BUF);
- \) ELSE
- WHILE(--ARGC>0) \(
- STRCPY(BUF,*++ARGV);
- FSIZE(BUF);
- \)
- \)
-
- öπ¡¬µ¿∩ FSIZE »ÑτáΓáÑΓ αẼÑα Σá⌐½á. àß½¿ «ñ¡á¬« Σá⌐½
- «¬áºδóáÑΓß∩ ß»αáó«τ¡¿¬«¼, Γ« FSIZE ß¡áτá½á óδºδóáÑΓ Σπ¡¬µ¿ε
- DIRECTORY ñ½∩ «íαáí«Γ¬¿ óßÑσ π¬áºá¡¡δσ ó ¡Ñ¼ Σá⌐½«ó. ÄíαáΓ¿-
- ΓÑ ó¡¿¼á¡¿Ñ ¡á ¿ß»«½∞º«óá¡¿Ñ ¿¼Ñ¡ Σ½áú«ó S_IFMT ¿ _IFDIR ¿º
- Σá⌐½á STAT.H.
-
- - 179 -
-
- FSIZE(NAME) /*PRINT SIZE FOR NAME*/
- CHAR *NAME;
- \(
- STRUCT STAT STBUF;
- IF(STAT(NAME,&STBUF)== -1) \(
- FPRINTF(STDERR,"FSIZE:CAN'T FIND %S\N",NAME);
- RETURN;
- \)
- IF((STBUF.ST_MODE & S_IFMT)==S_IFDIR)
- DIRECTORY(NAME);
- PRINTF("%8LD %S\N",STBUF.ST_SIZE,NAME);
- \)
- öπ¡¬µ¿∩ DIRECTORY ∩ó½∩ÑΓß∩ ßἫ⌐ ß½«ª¡«⌐. Äñ¡á¬« º¡áτ¿-
- Γѽ∞¡á∩ ÑÑ τáßΓ∞ ßó∩ºá¡á ß ß«ºñ᡿Ѽ ñ½∩ «íαáíáΓδóáѼ«ú« ó
- ñá¡¡δ⌐ ¼«¼Ñ¡Γ Σá⌐½á Ñú« »«½¡«ú« ¿¼Ñ¡¿, »« ¬«Γ«α«¼π ¼«ª¡«
- ó«ßßΓá¡«ó¿Γ∞ »πΓ∞ ó ñÑαÑóÑ.
-
- DIRECTORY(NAME) /*FSIZE FOR ALL FILES IN NAME*/
- CHAR *NAME;
- (
- STRUCT DIRECT DIRBUF;
- CHAR *NBP, *NEP;
- INT I, FD;
- NBP=NAME+STRLEN(NAME);
- *NBP++='/'; /*ADD SLASH TO DIRECTORY NAME*/
- IF(NBP+DIRSIZ+2>=NAME+BUFSIZE) /*NAME TOO LONG*/
- RETURN;
- IF((FD=OPEN(NAME,0))== -1)
- RETURN;
- WHILE(READ(FD,(CHAR *)&DIRBUF,SIZEOF(DIRBUF))>0) \(
- IF(DIRBUF.D_INO==0) /*SLOT NOT IN USE*/
- CONTINUE;
- IF(STRCMP (DIRBUF.D_NAME,".")==0
- \!\! STRCMP(DIRBUF.D_NAME,"..")==0
- CONTINUE; /*SKIP SELF AND PARENT*/
- FOR (I=0,NEP=NBP;I<DIRSIZ;I++)
- *NEP++=DIRBUF.D_NAME[I];
- *NEP++='\0';
- FSIZE(NAME);
- \)
- CLOSE(FD);
- *--NBP='\0'; /*RESTORE NAME*/
- )
-
- àß½¿ ¡Ñ¬«Γ«αá∩ ñδαá ó ß»αáó«τ¡¿¬Ñ ó ¡áßΓ«∩ΘÑÑ óαѼ∩ ¡Ñ
- ¿ß»«½∞ºπÑΓß∩ (»«Γ«¼π τΓ« Σá⌐½ íδ½ πñá½Ñ¡), Γ« ó ß««ΓóÑΓßΓóπ-
- εΘÑÑ I-πº½«ó«Ñ τ¿ß½« αáó¡« ¡π½ε, ¿ φΓá »«º¿µ¿∩ »α«»π߬áÑΓß∩.
- èáªñδ⌐ ß»αáó«τ¡¿¬ Γá¬ªÑ ß«ñÑαª¿Γ ºá»¿ß∞ ó ßἫ¼ ßÑíÑ, ¡áºδ-
- óáѼπε ".", ¿ « ßó«Ñ¼ α«ñ¿ΓѽÑ, ".."; «¡¿, «τÑó¿ñ¡«, ΓᬪÑ
- ñ«½ª¡δ íδΓ∞ »α«»πΘÑ¡δ, á Γ« »α«úαá¼¼á íπñÑΓ αáí«ΓáΓ∞ óÑß∞¼á
- ¿ óÑß∞¼á ñ«½ú«.
-
- - 180 -
-
- ò«Γ∩ »α«úαá¼¼á FSIZE ñ«ó«½∞¡« ߻ѵ¿á½¿º¿α«óá¡¡á, «¡á óßÑ
- ªÑ ñѼ«¡ßΓα¿απÑΓ »áαπ ó᪡δσ ¿ñÑ⌐. ó«-»Ñαóδσ, ¼¡«ú¿Ñ »α«ú-
- αá¼¼δ ¡Ñ ∩ó½∩εΓß∩ "ß¿ßΓѼ¡δ¼¿ »α«úαἼἿ"; «¡¿ Γ«½∞¬« ¿ß-
- »«½∞ºπεΓ ¿¡Σ«α¼áµ¿ε, Σ«α¼á ¿½¿ ß«ñÑαªá¡¿Ñ ¬«Γ«α«⌐ «»αÑñѽ∩-
- ÑΓß∩ «»Ñαᵿ«¡¡«⌐ ß¿ßΓѼ«⌐. é«-óΓ«αδσ, ñ½∩ Γᬿσ »α«úαá¼¼
- ßπΘÑßΓóÑ¡¡«, τΓ« »αÑñßΓáó½Ñ¡¿Ñ φΓ«⌐ ¿¡Σ«α¼áµ¿¿ óσ«ñ¿Γ Γ«½∞¬«
- ó ßΓá¡ñáαΓ¡δÑ "ºáú«½«ó«τ¡δÑ Σá⌐½δ", Γá¬¿Ñ ¬á¬ STAT.H ¿
- DIR.H, ¿ τΓ« »α«úαá¼¼δ ó¬½ετáεΓ φΓ¿ Σá⌐½δ, á ¡Ñ »«¼ÑΘáεΓ
- Σá¬Γ¿τÑ߬¿Ñ «»¿ßá¡¿∩ ó¡πΓα∞ ßἿσ »α«úαá¼¼.
-
- 8.7. Åα¿¼Ñα - αáß»αÑñѽ¿Γѽ∞ »á¼∩Γ¿.
- é ú½áóÑ 5 ¼δ ¡á»¿ß὿ íÑßσ¿Γα«ßΓ¡δ⌐ óáα¿á¡Γ Σπ¡¬µ¿¿
- ALLOC. éáα¿á¡Γ, ¬«Γ«αδ⌐ ¼δ ¡á»¿ΦѼ ΓÑ»Ñα∞, ¡Ñ ß«ñÑαª¿Γ «úαá-
- ¡¿τÑ¡¿⌐: «íαáΘÑ¡¿∩ ¬ Σπ¡¬µ¿∩¼ ALLOC ¿ FREE ¼«úπΓ »ÑαѼѪáΓ∞-
- ß∩ ó ½εí«¼ »«α∩ñ¬Ñ; ¬«úñá φΓ« ¡Ñ«íσ«ñ¿¼«, Σπ¡¬µ¿∩ ALLOC «í-
- αáΘáÑΓß∩ ¬ «»Ñαᵿ«¡¡«⌐ ß¿ßΓÑ¼Ñ ºá ñ«»«½¡¿Γѽ∞¡«⌐ »á¼∩Γ∞ε.
- èα«¼Ñ Γ«ú«, τΓ« φΓ¿ »α«µÑñπαδ »«½Ñº¡δ ßἿ »« ßÑíÑ, «¡¿ Γá¬-
- ªÑ ¿½½εßΓα¿απεΓ ¡Ñ¬«Γ«αδÑ ß««íαáªÑ¡¿∩, ßó∩ºá¡¡δÑ ß ¡á»¿ßá¡¿-
- Ѽ ¼áΦ¿¡¡«-ºáó¿ß¿¼δσ »α«úαá¼¼ «Γ¡«ß¿Γѽ∞¡« ¼áΦ¿¡¡«-¡Ñºáó¿ß¿-
- ¼δ¼ «íαẫ¼, ¿ »«¬áºδóáεΓ »αá¬Γ¿τÑ߬«Ñ »α¿¼Ñ¡Ñ¡¿Ñ ßΓαπ¬Γπα,
- «íΩÑñ¿¡Ñ¡¿⌐ ¿ ¬«¡ßΓαπ¬µ¿⌐ TYPEDEF.
- é¼ÑßΓ« Γ«ú«, τΓ«íδ óδñѽ∩Γ∞ »á¼∩Γ∞ ¿º ߬«¼»¿½¿α«óá¡¡«ú«
- ó¡πΓα¿ ¼áßß¿óá Σ¿¬ß¿α«óá¡¡«ú« αẼÑαá, Σπ¡¬µ¿∩ ALLOC íπñÑΓ
- »« ¼ÑαÑ ¡Ñ«íσ«ñ¿¼«ßΓ¿ «íαáΘáΓ∞ß∩ ºá »á¼∩Γ∞ε ¬ «»Ñαᵿ«¡¡«⌐
- ß¿ßΓѼÑ. ū߬«½∞¬π αẽ¿τ¡δÑ ß«íδΓ¿∩ ó »α«úαá¼¼Ñ ¼«úπΓ ΓαÑ-
- í«óáΓ∞ áß¿¡σα«¡¡«ú« óδñѽѡ¿∩ »á¼∩Γ¿, Γ« »á¼∩Γ∞, π»αáó½∩Ѽá∩
- ALLOC, ¡Ñ ¼«ªÑΓ íδΓ∞ ¡Ñ»αÑαδó¡«⌐. é ß¿½π φΓ«ú« ßó«í«ñ¡á∩ »á-
- ¼∩Γ∞ σαá¡¿Γß∩ ó ó¿ñÑ µÑ»«τ¬¿ ßó«í«ñ¡δσ í½«¬«ó. èáªñδ⌐ í½«¬
- ó¬½ετáÑΓ αẼÑα, π¬áºáΓѽ∞ ß½ÑñπεΘÑú« í½«¬á ¿ ßá¼π ßó«í«ñ¡πε
- »á¼∩Γ∞. ü½«¬¿ π»«α∩ñ«τ¿óáεΓß∩ ó »«α∩ñ¬Ñ ó«ºαáßΓá¡¿∩ áñαÑß«ó
- »á¼∩Γ¿, »α¿τѼ »«ß½Ññ¡¿⌐ í½«¬ (ß ¡á¿í«½∞Φ¿¼ áñαÑß«¼) π¬áºδ-
- óáÑΓ ¡á »Ñαóδ⌐, ΓᬠτΓ« µÑ»«τ¬á Σá¬Γ¿τÑ߬¿ «¬áºδóáÑΓß∩ ¬«½∞-
- 殬.
- Åα¿ »«ßΓπ»½Ñ¡¿¿ ºá»α«ßá ß»¿ß«¬ ßó«í«ñ¡δσ í½«¬«ó »α«ß¼áΓ-
- α¿óáÑΓß∩ ñ« ΓÑσ »«α, »«¬á ¡Ñ íπñÑΓ ¡á⌐ñÑ¡ ñ«ßΓáΓ«τ¡« í«½∞Φ«⌐
- í½«¬. àß½¿ φΓ«Γ í½«¬ ¿¼ÑÑΓ ó Γ«τ¡«ßΓ¿ ΓαÑíπѼδ⌐ αẼÑα, Γ«
- «¡ «ΓµÑ»½∩ÑΓß∩ «Γ ß»¿ß¬á ¿ »ÑαÑñáÑΓß∩ »«½∞º«óáΓѽε. àß½¿ ªÑ
- φΓ«Γ í½«¬ ß½¿Φ¬«¼ óѽ¿¬, Γ« «¡ αáºñѽ∩ÑΓß∩, ¡πª¡«Ñ ¬«½¿τÑßΓ-
- ó« »ÑαÑñáÑΓß∩ »«½∞º«óáΓѽε, á «ßΓáΓ«¬ ó«ºóαáΘáÑΓß∩ ó ßó«í«ñ-
- ¡δ⌐ ß»¿ß«¬. àß½¿ ñ«ßΓáΓ«τ¡« í«½∞Φ«ú« í½«¬á ¡á⌐Γ¿ ¡Ñ πñáÑΓß∩,
- Γ« «»Ñαᵿ«¡¡«⌐ ß¿ßΓѼ«⌐ óδñѽ∩ÑΓß∩ ¡«óδ⌐ í½«¬, ¬«Γ«αδ⌐
- ó¬½ετáÑΓß∩ ó ß»¿ß«¬ ßó«í«ñ¡δσ í½«¬«ó; ºáΓѼ »«¿ß¬ ó«º«í¡«ó-
- ½∩ÑΓß∩.
- Äßó«í«ªñÑ¡¿Ñ »á¼∩Γ¿ Γá¬ªÑ ó½ÑτÑΓ ºá ß«í«⌐ »α«ß¼«Γα ßó«-
- í«ñ¡«ú« ß»¿ß¬á ó »«¿ß¬Ñ »«ñσ«ñ∩ΘÑú« ¼ÑßΓá ñ½∩ óóÑñÑ¡¿∩ «ßó«-
- í«ªñÑ¡¡«ú« í½«¬á. àß½¿ φëà «ßó«í«ñ¿óΦ¿⌐ß∩ í½«¬ ß ¬á¬«⌐-½¿í«
- ßΓ«α«¡δ »α¿¼δ¬áÑΓ ¬ í½«¬π ¿º ß»¿ß¬á ßó«í«ñ¡δσ í½«¬«ó, Γ« «¡¿
- «íΩÑñ¿¡∩εΓß∩ ó «ñ¿¡ í½«¬ í«½∞ΦÑú« αẼÑαá, ΓᬠτΓ« »á¼∩Γ∞ ¡Ñ
- ßΓá¡«ó¿Γß∩ ß½¿Φ¬«¼ αáºñα«í½Ñ¡¡«⌐. Äí¡áαπª¿Γ∞ ߼Ѫ¡δÑ í½«¬¿
- »α«ßΓ«, »«Γ«¼π τΓ« ßó«í«ñ¡δ⌐ ß»¿ß«¬ ß«ñÑনΓß∩ ó »«α∩ñ¬Ñ
- ó«ºαáßΓá¡¿∩ áñαÑß«ó.
-
- - 181 -
-
- Äñ¡á ¿º »α«í½Ñ¼, « ¬«Γ«α«⌐ ¼δ π»«¼¿¡á½¿ ó ú½áóÑ 5, ºá¬-
- ½ετáÑΓß∩ ó «íÑß»ÑτÑ¡¿¿ Γ«ú«, τΓ«íδ ó«ºóαáΘáѼá∩ Σπ¡¬µ¿Ñ⌐
- ALLOC »á¼∩Γ∞ íδ½á óδα«ó¡Ñ¡á »«ñσ«ñ∩Θ¿¼ «íαẫ¼ ñ½∩ ΓÑσ
- «íΩÑ¬Γ«ó, ¬«Γ«αδÑ íπñπΓ ó ¡Ñ⌐ σαá¡¿Γ∞ß∩. ò«Γ∩ ¼áΦ¿¡δ ¿ αáº-
- ½¿τáεΓß∩, ñ½∩ ¬áªñ«⌐ ¼áΦ¿¡δ ßπΘÑßΓóπÑΓ Γ¿», ΓαÑíπεΘ¿⌐ ¡á¿-
- í«½∞Φ¿σ «úαá¡¿τÑ¡¿⌐ »« αẼÑΘÑ¡¿ε »á¼∩Γ¿, Ñß½¿ ñá¡¡δÑ ßἫú«
- «úαá¡¿τ¿Γѽ∞¡«ú« Γ¿»á ¼«ª¡« »«¼ÑßΓ¿Γ∞ ó ¡Ñ¬«Γ«αδ⌐ «»αÑñѽѡ-
- ¡δ⌐ áñαÑß, Γ« φΓ« ªÑ 󫺼«ª¡« ¿ ñ½∩ óßÑσ «ßΓá½∞¡δσ Γ¿»«ó.
- ìá»α¿¼Ñα, ¡á IBM 360/370,HONEYWELL 6000 ¿ ¼¡«ú¿σ ñαπú¿σ ¼á-
- Φ¿¡áσ ½εí«⌐ «íΩÑ¬Γ ¼«ªÑΓ σαá¡¿Γ∞ß∩ ó úαá¡¿µáσ, ß««ΓóÑΓßΓóπε-
- Θ¿¼ »ÑαѼѡ¡δ¼ Γ¿»á DOUBLE; ¡á PDP-11 íπñπΓ ñ«ßΓáΓ«τ¡δ »ÑαÑ-
- ¼Ñ¡¡δÑ Γ¿»á INT.
- æó«í«ñ¡δ⌐ í½«¬ ß«ñÑαª¿Γ π¬áºáΓѽ∞ ß½ÑñπεΘÑú« í½«¬á ó µÑ-
- »«τ¬Ñ, ºá»¿ß∞ « αẼÑαÑ í½«¬á ¿ ßἫ ßó«í«ñ¡«Ñ »α«ßΓαá¡ßΓó«;
- π»αáó½∩εΘá∩ ¿¡Σ«α¼áµ¿∩ ó ¡áτá½Ñ ¡áºδóáÑΓß∩ ºáú«½«ó¬«¼. ä½∩
- π»α«ΘÑ¡¿∩ óδαáó¡¿óá¡¿∩ óßÑ í½«¬¿ ¬αáΓ¡δ αẼÑαπ ºáú«½«ó¬á, á
- ßá¼ ºáú«½«ó«¬ óδα«ó¡Ñ¡ ¡áñ½ÑªáΘ¿¼ «íαẫ¼. ¥Γ« ñ«ßΓ¿úáÑΓß∩ ß
- »«¼«Θ∞ε «íΩÑñ¿¡Ñ¡¿∩, ¬«Γ«α«Ñ ß«ñÑαª¿Γ ªÑ½áѼπε ßΓαπ¬Γπαπ ºá-
- ú«½«ó¬á ¿ «íαáºÑµ ¡á¿í«½ÑÑ «úαá¡¿τ¿Γѽ∞¡«ú« »« óδαáó¡¿óá¡¿ε
- Γ¿»á:
-
- TYPEDEF INT ALIGN; /*FORCES ALIGNMENT ON PDP-11*/
- UNION HEADER \( /*FREE BLOCK HEADER*/
- STRUCT \(
- UNION HEADER *PTR; /*NEXT FREE BLOCK*/
- UNSIGNED SIZE; /*SIZE OF THIS FREE BLOCK*/
- \) S;
- ALIGN X; /*FORCE ALIGNMENT OF BLOCKS*/
- \);
- TYPEDEF UNION HEADER HEADER;
-
- öπ¡¬µ¿∩ ALLOC «¬απú½∩ÑΓ ΓαÑíπѼδ⌐ αẼÑα ó ß¿¼ó«½áσ ñ«
- ¡πª¡«ú« τ¿ß½á Ññ¿¡¿µ αẼÑαá ºáú«½«ó¬á; Σá¬Γ¿τÑ߬¿⌐ í½«¬,
- ¬«Γ«αδ⌐ íπñÑΓ óδñѽѡ, ß«ñÑαª¿Γ ¡á «ñ¡π Ññ¿¡¿µπ í«½∞ΦÑ,
- »αÑñ¡áº¡áτáѼπε ñ½∩ ßἫú« ºáú«½«ó¬á, ¿ φΓ« ¿ ÑßΓ∞ º¡áτÑ¡¿Ñ,
- ¬«Γ«α«Ñ ºá»¿ßδóáÑΓß∩ ó »«½Ñ SIZE ºáú«½«ó¬á. ô¬áºáΓѽ∞, ó«ºó-
- αáΘáѼδ⌐ Σπ¡¬µ¿Ñ⌐ ALLOC, π¬áºδóáÑΓ ¡á ßó«í«ñ¡«Ñ »α«ßΓαá¡ßΓ-
- ó«, á ¡Ñ ¡á ßá¼ ºáú«½«ó«¬.
-
- STATIC HEADER BASE; /*EMPTY LIST TO GET STARTED*/
- STATIC HEADER *ALLOCP=NULL; /*LAST ALLOCATED BLOCK*/
- CHAR *ALLOC(NBYTES)/*GENERAL-PURPOSE STORAGE ALLOCATOR*/
- UNSIGNED NBYTES;
- \(
- HEADER *MORECORE();
- REGISTER HEADER *P, *G;
- REGISTER INT NUNITS;
- NUNITS=1+(NBYTES+SIZEOF(HEADER)-1)/SIZEOF(HEADER);
- IF ((G=ALLOCP)==NULL) \( /*NO FREE LIST YET*/
- BASE.S PTR=ALLOCP=G=&BASE;
- BASE.S.SIZE=0;
- \)
-
- - 182 -
-
- FOR (P=G>S.PTR; ; G=P, P=P->S.PTR) \(
- IF (P->S.SIZE>=NUNITS) \( /*BIG ENOUGH*/
- IF (P->S.SIZE==NUNITS) /*EXACTLY*/
- G->S.PTR=P->S.PTR;
- ELSE \( /*ALLOCATE TAIL END*/
- P->S.SIZE-=NUNITS;
- P+=P->S.SIZE;
- P->S.SIZE=NUNITS;
- \)
- ALLOCP=G;
- RETURN((CHAR *)(P+1));
- \)
- IF(P==ALLOCP) /*WRAPPED AROUND FREE LIST*/
- IF((P=MORECORE(NUNITS))==NULL)
- RETURN(NULL); /*NONE LEFT*/
- \)
- \)
-
- ÅÑαѼѡ¡á∩ BASE ¿ß»«½∞ºπÑΓß∩ ñ½∩ ¡áτá½á αáí«Γδ. àß½¿
- ALLOCP ¿¼ÑÑΓ º¡áτÑ¡¿Ñ NULL, ¬á¬ ó ß½πτáÑ »Ñαó«ú« «íαáΘÑ¡¿∩ ¬
- ALLOC, Γ« ß«ºñáÑΓß∩ óδ᫪ñÑ¡¡δ⌐ ßó«í«ñ¡δ⌐ ß»¿ß«¬: «¡ ß«ßΓ«¿Γ
- ¿º ßó«í«ñ¡«ú« í½«¬á αẼÑαá ¡π½∞ ¿ π¬áºáΓѽ∩ ¡á ßἫú« ßÑí∩.
- é ½εí«¼ ß½πτáÑ ºáΓѼ ¿ßß½ÑñπÑΓß∩ ßó«í«ñ¡δ⌐ ß»¿ß«¬. Å«¿ß¬
- ßó«í«ñ¡«ú« í½«¬á »«ñσ«ñ∩ΘÑú« αẼÑαá ¡áτ¿¡áÑΓß∩ ß Γ«ú« ¼ÑßΓá
- (ALLOCP), úñÑ íδ½ ¡á⌐ñÑ¡ »«ß½Ññ¡¿⌐ í½«¬; Γá¬á∩ ßΓαáΓÑú¿∩ »«-
- ¼«úáÑΓ ß«σαá¡¿Γ∞ «ñ¡«α«ñ¡«ßΓ∞ ñ¿ß¬á. àß½¿ ¡á⌐ñÑ¡ ß½¿Φ¬«¼
- í«½∞Φ«⌐ í½«¬, Γ« »«½∞º«óáΓÑ½ε »αÑñ½áúáÑΓß∩ Ñú« σó«ßΓ«óá∩
- τáßΓ∞; φΓ« »α¿ó«ñ¿Γ ¬ Γ«¼π, τΓ« ó ºáú«½«ó¬Ñ ¿ßσ«ñ¡«ú« í½«¬á
- ¡πª¡« ¿º¼Ñ¡¿Γ∞ Γ«½∞¬« Ñú« αẼÑα. é« óßÑσ ß½πτá∩σ ó«ºóαáΘáÑ-
- ¼δ⌐ »«½∞º«óáΓѽε π¬áºáΓѽ∞ π¬áºδóáÑΓ ¡á ñÑ⌐ßΓó¿Γѽ∞¡« ßó«-
- í«ñ¡πε «í½áßΓ∞, ½ÑªáΘπε ¡á Ññ¿¡¿µπ ñá½∞ΦÑ ºáú«½«ó¬á. ÄíαáΓ¿-
- ΓÑ ó¡¿¼á¡¿Ñ ¡á Γ«, τΓ« Σπ¡¬µ¿∩ ALLOC »ÑαÑñ ó«ºóαáΘÑ¡¿Ñ¼ "P"
- »αÑ«íαáºπÑΓ Ñú« ó π¬áºáΓѽ∞ ¡á ß¿¼ó«½δ.
- öπ¡¬µ¿∩ MORECORE »«½πτáÑΓ »á¼∩Γ∞ «Γ «»Ñαᵿ«¡¡«⌐ ß¿ßΓÑ-
- ¼δ. äÑΓ὿ Γ«ú«, ¬á¬ φΓ« «ßπΘÑßΓó½∩ÑΓß∩, ¼Ñ¡∩εΓß∩, ¬«¡Ñτ¡«,
- «Γ ß¿ßΓÑ¼δ ¬ ß¿ßΓѼÑ. ìá ß¿ßΓÑ¼Ñ UNIX Γ«τ¬á óσ«ñá SBRK(N)
- ó«ºóαáΘáÑΓ π¬áºáΓѽ∞ ¡á "N" ñ«»«½¡¿Γѽ∞¡δσ íá⌐Γ«ó »á¼∩-
- Γ¿.(π¬áºáΓѽ∞ πñó«½ÑΓó«α∩ÑΓ óßѼ «úαá¡¿τÑ¡¿∩¼ ¡á óδαáó¡¿óá-
- ¡¿Ñ). Æá¬ ¬á¬ ºá»α«ß ¬ ß¿ßΓÑ¼Ñ ¡á óδñѽѡ¿Ñ »á¼∩Γ¿ ∩ó½∩ÑΓß∩
- ßαáó¡¿Γѽ∞¡« ñ«α«ú«⌐ «»ÑαᵿÑ⌐, ¼δ ¡Ñ σ«Γ¿¼ ñѽáΓ∞ φΓ« »α¿
- ¬áªñ«¼ «íαáΘÑ¡¿¿ ¬ Σπ¡¬µ¿¿ ALLOC. Å«φΓ«¼π Σπ¡¬µ¿∩ MORECORE
- «¬απú½∩ÑΓ ºáΓαÑí«óá¡¡«Ñ τ¿ß½« Ññ¿¡¿µ ñ« í«½∞ΦÑú« º¡áτÑ¡¿∩;
- φΓ«Γ í«½∞Φ¿⌐ í½«¬ íπñÑΓ ºáΓѼ αáºñѽѡ Γá¬, ¬á¬ ¡Ñ«íσ«ñ¿¼«.
- îáßΦΓáí¿απεΘá∩ óѽ¿τ¿¡á ∩ó½∩ÑΓß∩ »áαá¼ÑΓα«¼, ¬«Γ«αδ⌐ ¼«ªÑΓ
- íδΓ∞ »«ñ«íαá¡ ó ß««ΓóÑΓßΓó¿¿ ß ¡Ñ«íσ«ñ¿¼«ßΓ∞ε.
-
- - 183 -
-
- #DEFINE NALLOC 128 /*#UNITS TO ALLOCATE AT ONCE*/
- STATIC HEADER *MORECORE(NU) /*ASK SYSTEM FOR MEMORY*/
- UNSIGNED NU;
- \(
- CHAR *SBRK();
- REGISTER CHAR *CP;
- REGISTER HEADER *UP;
- REGISTER INT RNU;
- RNU=NALLOC*((NU+NALLOC-1)/NALLOC);
- CP=SBRK(RNU*SIZEOF(HEADER));
- IF ((INT)CP==-1) /*NO SPACE AT ALL*/
- RETURN(NULL);
- UP=(HEADER *)CP;
- UP->S.SIZE=RNU;
- FREE((CHAR *)(UP+1));
- RETURN(ALLOCP);
- \)
-
- àß½¿ í«½∞ΦÑ ¡Ñ «ßΓὫß∞ ßó«í«ñ¡«ú« »α«ßΓαá¡ßΓóá, Γ« Σπ¡-
- ¬µ¿∩ SBRK ó«ºóαáΘáÑΓ "-1", σ«Γ∩ NULL íδ½ íδ ½πτΦ¿¼ óδí«α«¼.
- ä½∩ ¡áñѪ¡«ßΓ¿ ßαáó¡Ñ¡¿∩ "-1" ñ«½ª¡á íδΓ∞ »αÑ«íαẫóá¡á ¬
- Γ¿»π INT. æ¡«óá »α¿σ«ñ¿Γß∩ ¼¡«ú«¬αáΓ¡« ¿ß»«½∞º«óáΓ∞ ∩ó¡δÑ
- »αÑ«íαẫóá¡¿∩ (»ÑαÑó«ñ) Γ¿»«ó, τΓ«íδ «íÑß»Ñτ¿Γ∞ «»αÑñѽѡ-
- ¡πε ¡Ñºáó¿ß¿¼«ßΓ∞ Σπ¡¬µ¿⌐ «Γ ñÑΓá½Ñ⌐ »αÑñßΓáó½Ñ¡¿∩ π¬áºáΓÑ-
- ½Ñ⌐ ¡á αẽ¿τ¡δσ ¼áΦ¿¡áσ.
- ê »«ß½Ññ¡ÑÑ - ßá¼á Σπ¡¬µ¿∩ FREE. ìáτ¿¡á∩ ß ALLOCP, «¡á
- »α«ßΓ« »α«ß¼áΓα¿óáÑΓ ßó«í«ñ¡δ⌐ ß»¿ß«¬ ó »«¿ß¬Ñ ¼ÑßΓá ñ½∩
- óóÑñÑ¡¿∩ ßó«í«ñ¡«ú« í½«¬á. ¥Γ« ¼ÑßΓ« ¡áσ«ñ¿Γß∩ ½¿í« ¼Ñªñπ
- ñóπ¼∩ ßπΘÑßΓóπεΘ¿¼¿ í½«¬á¼¿, ½¿í« ó «ñ¡«¼ ¿º ¬«¡µ«ó ß»¿ß¬á.
- é ½εí«¼ ß½πτáÑ, Ñß½¿ «ßó«í«ñ¿óΦ¿⌐ß∩ í½«¬ »α¿¼δ¬áÑΓ ¬ «ñ¡«¼π
- ¿º ß«ßÑñ¡¿σ, ߼Ѫ¡δÑ í½«¬¿ «íΩÑñ¿¡∩εΓß∩. æ½Ññ¿Γ∞ ¡πª¡« Γ«½∞-
- ¬« ºáΓѼ, τΓ«íδ π¬áºáΓѽ¿ π¬áºδó὿ ¡á Γ«, τΓ« ¡πª¡«, ¿ τΓ«-
- íδ αẼÑαδ í뫨 πßΓá¡«ó½Ñ¡δ »αáó¿½∞¡«.
-
- FREE(AP) /*PUT BLOCKE AP IN FREE LIST*/
- CHAR *AP;
- \(
- REGISTER HEADER *P, *G;
- P=(HEADER*)AP-1; /*POINT TO HEADER*/
- FOR (G=ALLOCP; !(P>G && P>G->S.PTR);G=G->S.PTR)
- IF (G>=G->S.PTR && (P>G \!\! P<G->S.PTR))
- BREAK; /*AT ONE END OR OTHER*/
- IF (P+P->S.SIZE==G->S.PTR)\(/*JOIN TO UPPER NBR*/
- P->S.SIZE += G->S.PTR->S.SIZE;
- P->S.PTR = G->S.PTR->S.PTR;
- \) ELSE
- P->S.PTR = G->S.PTR;
- IF (G+G->S.SIZE==P) \( /*JOIN TO LOWER NBR*/
- G->S.SIZE+=P->S.SIZE;
- G->S.PTR=P->S.PTR;
- \) ELSE
- G->S.PTR=P;
- ALLOCP = G;
- \)
- - 184 -
-
- ò«Γ∩ αáß»αÑñѽѡ¿Ñ »á¼∩Γ¿ »« ßó«Ñ⌐ ßπΓ¿ ºáó¿ß¿Γ «Γ ¿ß-
- »«½∞ºπѼ«⌐ ¼áΦ¿¡δ, »α¿óÑñÑ¡¡á∩ óδΦÑ »α«úαá¼¼á »«¬áºδóáÑΓ,
- ¬á¬ φΓπ ºáó¿ß¿¼«ßΓ∞ ¼«ª¡« αÑúπ½¿α«óáΓ∞ ¿ «úαá¡¿τ¿Γ∞ óÑß∞¼á
- ¡Ñí«½∞Φ«⌐ τáßΓ∞ε »α«úαá¼¼δ. êß»«½∞º«óá¡¿Ñ TYPEDEF ¿ UNION
- »«ºó«½∩ÑΓ ß»αáó¿Γ∞ß∩ ß óδαáó¡¿ó᡿Ѽ (»α¿ πß½«ó¿¿, τΓ« Σπ¡¬-
- µ¿∩ SBRK «íÑß»Ñτ¿óáÑΓ »«ñσ«ñ∩Θ¿⌐ π¬áºáΓѽ∞). ÅÑαÑó«ñδ Γ¿»«ó
- «αúá¡¿ºπεΓ óδ»«½¡Ñ¡¿Ñ ∩ó¡«ú« »αÑ«íαẫóá¡¿∩ Γ¿»«ó ¿ ñáªÑ
- ß»αáó½∩εΓß∩ ß ¡Ñπñáτ¡« αáºαáí«Γá¡¡δ¼ ß¿ßΓѼ¡δ¼ ¿¡ΓÑαΣÑ⌐ß«¼.
- ê σ«Γ∩ αáßß¼«ΓαÑ¡¡δÑ ºñÑß∞ »«ñα«í¡«ßΓ¿ ßó∩ºá¡δ ß αáß»αÑñѽÑ-
- ¡¿Ñ¼ »á¼∩Γ¿, «íΘ¿⌐ »«ñσ«ñ αáó¡δ¼ «íαẫ¼ »α¿¼Ñ¡¿¼ ¿ ¬ ñαπú¿¼
- ß¿Γπᵿ∩¼.
- ô»α᪡ѡ¿Ñ 8-6.
- --------------
- öπ¡¬µ¿∩ ¿º ßΓá¡ñáαΓ¡«⌐ í¿í½¿«ΓѬ¿ CALLOC(N,SIZE) ó«ºóαá-
- ΘáÑΓ π¬áºáΓѽ∞ ¡á "N" «íΩÑ¬Γ«ó αẼÑαá SIZE, »α¿τѼ ß««ΓóÑΓ-
- ßΓóπεΘá∩ »á¼∩Γ∞ ¿¡¿µ¿á½¿º¿απÑΓß∩ ¡á ¡π½∞. ¡á»¿Φ¿ΓÑ »α«úαá¼¼π
- ñ½∩ CALLOC, ¿ß»«½∞ºπ∩ Σπ¡¬µ¿ε ALLOC ½¿í« ó ¬áτÑßΓóÑ «íαẵá,
- ½¿í« ¬á¬ Σπ¡¬µ¿ε, ¬ ¬«Γ«α«⌐ »α«¿ßσ«ñ¿Γ «íαáΘÑ¡¿Ñ.
- ô»α᪡ѡ¿Ñ 8-7.
- ---------------
- öπ¡¬µ¿∩ ALLOC »α¿¡¿¼áÑΓ ºáΓαÑí«óá¡¡δ⌐ αẼÑα, ¡Ñ »α«óÑ-
- α∩∩ Ñú« »αáóñ«»«ñ«í¡«ßΓ¿; Σπ¡¬µ¿∩ FREE »«½áúáÑΓ, τΓ« Γ«Γ
- í½«¬, ¬«Γ«αδ⌐ «¡á ñ«½ª¡á «ßó«í«ñ¿Γ∞, ß«ñÑαª¿Γ »αáó¿½∞¡«Ñ
- º¡áτÑ¡¿Ñ ó »«½Ñ αẼÑαá. ôß«óÑαΦÑ¡ßΓóπ⌐ΓÑ φΓ¿ »α«µÑñπαδ,
- ºáΓαáΓ¿ó í«½∞ΦÑ πß¿½¿⌐ ¡á »α«óÑα¬π «Φ¿í«¬.
- ô»α᪡ѡ¿Ñ 8-8.
- ---------------
- ìá»¿Φ¿ΓÑ Σπ¡¬µ¿ε BFREE(P,N), ¬«Γ«αá∩ ó¬½ετáÑΓ »α«¿ºó«½∞-
- ¡δ⌐ í½«¬ "P" ¿º "N" ß¿¼ó«½«ó ó ß»¿ß«¬ ßó«í«ñ¡δσ í½«¬«ó, π»-
- αáó½∩Ѽδ⌐ Σπ¡¬µ¿∩¼¿ ALLOC ¿ FREE. æ »«¼«Θ∞ε Σπ¡¬µ¿¿ BFREE
- »«½∞º«óáΓѽ∞ ¼«ªÑΓ ó ½εí«Ñ óαѼ∩ ñ«íáó½∩Γ∞ ó ßó«í«ñ¡δ⌐ ß»¿-
- ß«¬ ßΓáΓ¿τÑ߬¿⌐ ¿½¿ ó¡ÑΦ¡¿⌐ ¼áßß¿ó.
-