ࡱ> egbcd)`$ bjbj .&p"FHFHFHFH RH"uhHHHHHHHH.u0u0u0u0u0u0u$/whyfTu-HHHHHTuHHurrrHHH.urH.urrtuHH 0U+FH h t.uu0uuyqyuyu rHHHTuTurHHHuHHHH"""$AFH"""FH""" #  " ,+ /+ 17>@ -B>B @0745; >1AC6405B >A=>2K 8=B5@D59A0 4;O C?@02;5=8O 0A8=E@>==K<8 :><<C=8:0F8>==K<8 ?>@B0<8 (B5@<8=0;L=K<8 ?>@B0<8). $C=:F88, ?5@5G8A;5==K5 =0 AB@0=8F5 @C:>2>4AB20 TERMIOS(2) 8A?>;L7CNBAO 4;O 4>ABC?0 8 :>=D83C@0F88 0??0@0B=>3> 8=B5@D59A0 A B5@<8=0;><. -B8 DC=:F88 8 8E 0@3C<5=BK 1C4CB >1AC640BLAO 2 MB>< @0745;5. 5@20O A5:F8O MB>3> @0745;0 ?@54>AB02;O5B 8=D>@<0F8N, =5>1E>48<CN 4;O ?>=8<0=8O E0@0:B5@8AB8: B5@<8=0;0 8 ?@8=F8?>2 @01>BK 0??0@0B=>3> 8 ?@>3@0<<=>3> B5@<8=0;L=>3> 8=B5@D59A0. 0B5< 1C4CB >1AC640BLAO =5:>B>@K5 0A?5:BK ?@>3@0<<=>3> 8=B5@D59A0 A B5@<8=0;><. @82>4OBAO ?@8<5@K 8A?>;L7>20=8O DC=:F89 termios(2) 4;O 87<5=5=8O MB8E CAB0=>2>:. %0@0:B5@8AB8:8 B5@<8=0;L=>3> 8=B5@D59A0 @81;878B5;L=> 4> :>=F0 80E-=0G0;0 90E, B5@<8=0;K 1K;8 >A=>2=K< A@54AB2>< >@30=870F88 2708<>459AB28O G5;>25:0 A :><?LNB5@><. "5@<8=0; (4>A;>2=>  >:>=5G=>5 CAB@>9AB2>) ?@54AB02;O5B A>1>9 M;5:B@>==CN ?8HCICN <0H8=:C (B5;5B09?) 8;8 CAB@>9AB2>, A>AB>OI55 87 :;0280BC@K 8 48A?;5O (2845>B5@<8=0;). 10 B8?0 B5@<8=0;>2 A>548=5=K A :><?LNB5@>< ?>A;54>20B5;L=K< ?>@B>< (>1KG=>, RS232 8;8 B>:>20O ?5B;O); ?@8 MB>< A8<2>;K, 22>48<K5 A :;0280BC@K, ?5@540NBAO :><?LNB5@C, 0 40==K5, ?5@540205<K5 :><?LNB5@><, ?>:07K20NBAO =0 48A?;55 (2 A;CG05 2845>B5@<8=0;0) 8;8 ?5G0B0NBAO =0 1C<035 (2 A;CG05 B5;5B09?0). 0: B5;5B09?K, B0: 8 2845>B5@<8=0;K ?@54=07=0G5=K 4;O 22>40 8 >B>1@065=8O B5:AB>2>9 8=D>@<0F88. ! B>G:8 7@5=8O :><?LNB5@0, B5@<8=0;L=K9 ?>@B ?@54AB02;O5B A>1>9 42C=0?@02;5==K9 (?>;=>4C?;5:A=K9) ?>A;54>20B5;L=K9 ?>@B, ?> :>B>@><C ?@>872>48BAO >1<5= A8<2>;0<8 :>48@>2:8 ASCII 8;8 =0F8>=0;L=>9 :>48@>2:8, B0:>9, :0: 8. @><5 ASCII, 1>;LH8=AB2> 2845>B5@<8=0;>2 <>3CB ?5@54020BL 8 ?@8=8<0BL :>4K @0AH8@5=8O (escape sequence). 1KG=> MB> <=>3>109B>2K5 :>4K, =0G8=0NI85AO A A8<2>;0 '\0x1B' (ASCII ESC), >1>7=0G0NI85 =060B8O :;028H, 4;O :>B>@KE =5B A>>B25BAB2CNI8E :>4>2 2 ASCII (AB@5;:8, DC=:F8>=0;L=K5 :;028H8 8 B.4.), 0 B0:65 :><0=4K B5@<8=0;C: ?5@542865=85 :C@A>@0, 87<5=5=8O F25B0 B5:AB0 8 B.4.. "0:, =0 <=>38E 2845>B5@<8=0;0E, ?>A;54>20B5;L=>ABL A8<2>;>2 "\0x1B[A" >1>7=0G05B =060B85 :;028H8 AB@5;:0 225@E =0 :;0280BC@5, 0 B0:65 :><0=4C =0 ?5@5<5I5=85 :C@A>@0 =0 >4=C AB@>:C 225@E. >A:>;L:C B5@<8=0;K 1K;8 >A=>2=K< A@54AB2>< 2708<>459AB28O G5;>25:0 A :><?LNB5@><, 2 A8AB5<0E A5<59AB20 Unix 2 4@0925@ B5@<8=0;0 1K; 2AB@>5= @O4 DC=:F89, =5 A2>4OI8EAO : ?@>AB>9 ?5@540G5 40==KE G5@57 ?>@B. ;O C?@02;5=8O 2A5<8 MB8<8 DC=:F8O<8, B5@<8=0;L=K5 CAB@>9AB20 ?>445@6820;8 =01>@ A?5F80;L=KE :><0=4 ioctl(2). !@548 MB8E DC=:F89 A;54C5B C?><O=CBL: 540:B8@>20=85 22>40: AB8@0=85 ?>A;54=53> 22545==>3> A8<2>;0, ?>A;54=53> A;>20 8 2A59 AB@>:8. @5>1@07>20=85 22>40: ?@5>1@07>20=85 A8<2>;>2 :>=F0 AB@>:8, 70<5=0 B01C;OF89 =0 ?@>15;K, 8 4@. 5=5@0F8O A83=0;>2: ?@8 22>45 >?@545;5==KE A8<2>;>2, O4@> ?>AK;05B 3@C??5 ?@>F5AA>2 ?5@2>3> ?;0=0 A83=0;K. >445@6:0 B5@<8=0;L=KE A5AA89 8 C?@02;5=8O 7040=8O<8. K;> @07@01>B0=> <=>65AB2> ?@>3@0<<, @0AAG8B0==KE =0 @01>BC A B5@<8=0;0<8: M:@0==K5 B5:AB>2K5 @540:B>@K, 8=B53@8@>20==K5 A@54K @07@01>B:8, ?>GB>2K5 :;85=BK, :;85=BK gopher, 251-1@0C75@K (lynx 8 links), D09;>2K5 <5=5465@K, 83@K 8 4@. ><0=4=K5 ?@>F5AA>@K A C?@02;5=85< 7040=8O<8 (ksh(1), jsh(1), bash(1)) 8A?>;L7>20;8 ?>445@6:C A> AB>@>=K B5@<8=0;0 (D>=>2K5 3@C??K 8 3@C??K ?5@2>3> ?;0=0, 0 B0:65 A83=0;K C?@02;5=8O 7040=8O<8). @><5 B>3>, <=>385 ?@>3@0<<K, B0:85 :0: su, sudo, login, 8A?>;L7>20;8 =5:>B>@K5 ?@>ABK5 B5@<8=0;L=K5 DC=:F88, B0:85, :0: 2:;NG5=85 8 2K:;NG5=85 ME> (>B>1@065=8O 22>48<KE ?>;L7>20B5;5< A8<2>;>2). 59AB28B5;L=>, ?@8 =01>@5 :><0=4, ?>;L7>20B5;N =5>1E>48<> 2845BL =0 M:@0=5 =018@05<K5 8< A8<2>;K, 0 ?@8 22>45 ?0@>;O MB> <>65B 1KBL =565;0B5;L=>. >MB><C CB8;8BK, B@51CNI85 22>40 ?0@>;O, 2K:;NG0NB >B>1@065=85 22>40, 0 ?>B>< 2:;NG0NB 53> >1@0B=>. =B5@D59A 22>40/2K2>40 803@0<<0 ?>:07K205B >B=>H5=8O <564C ?>;L7>20B5;LA:>9 ?@>3@0<<>9, O4@>< A8AB5<K 8 ?>@B>< 22>40/2K2>40 ?@8 @01>B5 A D878G5A:8< B5@<8=0;><. $878G5A:85 B5@<8=0;K ?@8A>548=ONBAO : :><?LNB5@C G5@57 0??0@0B=K9 8=B5@D59A 22>40/2K2>40, =07K205<K9 ?>@B><. >@BK, A45;0==K5 @07;8G=K<8 873>B>28B5;O<8, CAB@>5=K ?> @07=><C, => ?>445@6820NB AB0=40@B=K5 ?@>B>:>;K >1<5=0, >1KG=> AB0=40@B RS232.  IBM PC-A>2<5AB8<KE :><?LNB5@0E B5@<8=0;L=K5 ?>@BK RS232 =07K20NBAO COM-?>@BK. -B8 ?>@BK >1KG=> :>=D83C@8@CNBAO 8;8 ?@>3@0<<8@CNBAO, B0: GB> >=8 <>3CB @01>B0BL A @07;8G=K<8 B5@<8=0;0<8 8 =0 @07;8G=KE A:>@>ABOE. >;L7>20B5;LA:85 ?@>3@0<<K =5 8<5NB ?@O<>3> 4>ABC?0 : ?>@B0< 22>40/2K2>40. @>3@0<<=K9 8=B5@D59A A ?>@B0<8 ?@54>AB02;O5BAO 4@0925@>< CAB@>9AB20. @0925@ CAB@>9AB20  MB> <>4C;L O4@0 Unix, :>B>@K9 ?@54>AB02;O5B =01>@ 0??0@0B=>-7028A8<KE DC=:F89, :>B>@K5, 2 A2>N >G5@54L, C?@02;ONB ?>@B0<8 8 >ACI5AB2;ONB 4>ABC? : =8<. >ABC? : 4@0925@C ?@>8AE>48B G5@57 A?5F80;L=K9 109B->@85=B8@>20==K9 D09; B5@<8=0;0. <5=0 MB8E D09;>2 =0E>4OBAO 2 48@5:B>@88, >1KG=> /dev 8;8 /dev/term, 8 4>ABC? : =8< <>65B >ACI5AB2;OBLAO B0: 65, :0: : >1KG=K< D09;0<. 2>4 8 2K2>4 =0 B5@<8=0; >ACI5AB2;O5BAO GB5=85< 8 70?8ALN 2 A>>B25BAB2CNI89 A?5F80;L=K9 D09;. =>385 ?@>3@0<<K =5 284OB @07=8FK <564C B5@<8=0;>< 8 >1KG=K< D09;><, GB> ?>72>;O5B ?5@5=0?@02;OBL 22>4-2K2>4 B0:8E ?@>3@0<< =0 B5@<8=0; 8;8 2 D09; 2 7028A8<>AB8 >B ?>B@51=>AB59 ?>;L7>20B5;O.  Unix SVR4, B5@<8=0;L=K5 4@0925@K A0<8 8<5NB <>4C;L=CN AB@C:BC@C 8 A>AB>OB 87 =5A:>;L:8E <>4C;59 STREAMS, STREAMS  MB> ?>O282H89AO 2 Unix SVR3 0A8=E@>==K9 8=B5@D59A 4;O 4@0925@>2 ?>A;54>20B5;L=KE (109B->@85=B8@>20==KE) CAB@>9AB2. API 4;O @07@01>B:8 4@0925@>2 2 Solaris >?8A0=> 2 A5:F88 @C:>2>4AB20 9 8 =5 1C45B ?>4@>1=> >1AC640BLAO 2 MB>< :C@A5. "5@<8=0;L=K9 4@0925@ STREAMS A>AB>8B 87, :0: <8=8<C<, 42CE <>4C;59: A>1AB25==> 4@0925@0 ?>@B0, :>B>@K9 >15A?5G8205B ?@85< 8 ?5@540GC 40==KE 2 D878G5A:89 ?>@B, 8 <>4C;O B5@<8=0;L=>9 48AF8?;8=K ldterm(7m), :>B>@K9 8 >B25G05B 70 A?5F8D8G5A:8 B5@<8=0;L=K5 DC=:F88 8 >1@01>B:C B5@<8=0;L=KE :><0=4 ioctl(2). A524>B5@<8=0;K @8 ?5@5E>45 : 3@0D8G5A:8< 48A?;5O<, 2>7=8: 2>?@>A, :0: >15A?5G8BL A>2<5AB8<>ABL A ?@>3@0<<0<8, >@85=B8@>20==K<8 =0 @01>BC A B5@<8=0;><. ;O MB>3> 2 O4@5 Unix ?@54CA<>B@5= 8=B5@D59A 4;O A>740=8O A?5F80;L=KE ?A524>CAB@>9AB2, :>B>@K5 B0: 8 =07K20NBAO ?A524>B5@<8=0;0<8. A524>CAB@>9AB2> 8;8 28@BC0;L=>5 CAB@>9AB2>  MB> 28@BC0;L=K9 >1J5:B, >1A;C68205<K9 A?5F80;L=K< 4@0925@><. "0:>9 4@0925@ ?>445@68205B B0:85 65 ?@>3@0<<=K5 8=B5@D59AK 8 AB@C:BC@K 40==KE (<8=>@=CN 70?8AL, A?5F80;L=K9 D09; 2 :0B0;>35 /dev), :0: 8 >1KG=K9 4@0925@, =>, 2 >B;8G85 >B >1KG=>3> 4@0925@0, 4@0925@ ?A524>CAB@>9AB20 =5 A2O70= =8 A :0:8< D878G5A:8< CAB@>9AB2><, 0 8<8B8@C5B 2A5 DC=:F88 CAB@>9AB20 ?@>3@0<<=>. @8<5@0<8 ?A524>CAB@>9AB2 O2;ONBAO D09;K /dev/null, /dev/zero, /dev/random (2 Linux). A524>B5@<8=0;K A>740NBAO 4;O ?>445@6:8 A5AA89 C40;5==>3> 4>ABC?0 G5@57 telnet(1), rlogin/rsh(1) 8 ssh(1), 0 B0:65 4;O B5@<8=0;L=KE A5AA89 xterm(1) 8 gnome-terminal(1). A524>B5@<8=0; A>AB>8B 87 42CE ?A524>CAB@>9AB2, 254CI53> (/dev/pts/XX) 8 254><>3> (/dev/pty/XX, 345 X  45AOB8G=0O F8D@0). @>F54C@0 A>740=8O 8 >B:@KB8O MB8E CAB@>9AB2 @07;8G05BAO 2 @07=KE Unix-A8AB5<0E 8 ?>4@>1=> =5 @0AA<0B@8205BAO 2 MB>< :C@A5. !>>B25BAB2CNI0O ?@>F54C@0 4;O Solaris >?8A0=0 =0 AB@0=8F5 @C:>2>4AB20 pts(7D). 10 CAB@>9AB20, 2 459AB28B5;L=>AB8, >1A;C6820NBAO >4=8< 8 B5< 65 <>4C;5< O4@0 8 ?@54AB02;ONB A>1>9 =5GB> 2@>45 B@C1K: 40==K5, 70?8AK205<K5 2 45A:@8?B>@ 254CI53> CAB@>9AB20, G8B0NBAO 87 254><>3>, 8 =0>1>@>B. @><5 B>3>, 254><>5 CAB@>9AB2> ?>445@68205B 2A5 :><0=4K ioctl(2), >1O70B5;L=K5 4;O B5@<8=0;0, 8 2A5 B5@<8=0;L=K5 DC=:F88, ?5@5G8A;5==K5 =0 ?@54K4CI59 AB@0=8F5. 0AA<>B@8< 8A?>;L7>20=85 ?A524>B5@<8=0;0 B5@<8=0;L=K< M<C;OB>@>< xterm(1). xterm(1) ?@54AB02;O5B A>1>9 3@0D8G5A:>5 ?@8;>65=85, 8A?>;L7CNI55 ?@>B>:>; X Window. @8 70?CA:5, xterm(1) A>7405B 8 >B:@K205B >:=> =0 ;>:0;L=>< 8;8 C40;5==>< 48A?;55, 8<O :>B>@>3> >?@545;O5BAO ?5@5<5==>9 A@54K DISPLAY. -B> >:=> ?@54AB02;O5B A>1>9 B5:AB>2>5 >:=>, ?> C<>;G0=8N 8<5NI55 @07<5@ 80x25 A8<2>;>2, GB> A>>B25BAB2C5B AB0=40@B=><C @07<5@C M:@0=0 1>;LH8=AB20 2845>B5@<8=0;>2. @><5 B>3>, xterm(1) A>7405B ?0@C 254CI53> 8 254><>3> CAB@>9AB2 ?A524>B5@<8=0;0, 70?CA:05B ?>4?@>F5AA, 2 MB>< ?>4?@>F5AA5 A>7405B A5AA8N 2K7>2>< setsid(2), >B:@K205B 254><>5 CAB@>9AB2> =0 45A:@8?B>@K 0, 1 8 2 (?@8 MB><, A>>B25BAB2CNI89 ?A524>B5@<8=0; AB0=>28BAO C?@02;ONI8< B5@<8=0;>< MB>9 A5AA88), CAB0=02;8205B ?5@5<5==CN A@54K TERM=xterm 8 70?CA:05B 2 MB>< ?>4?@>F5AA5 ?@>3@0<<C. > C<>;G0=8N, 8<O ?@>3@0<<K 15@5BAO 87 ?5@5<5==>9 A@54K SHELL, =>, 5A;8 C:070BL A>>B25BAB2CNI85 ?0@0<5B@K xterm(1), <>6=> 70?CAB8BL ?@>872>;L=CN ?@>3@0<<C. 0B5<, xterm(1) ?@5>1@07C5B =068<05<K5 ?>;L7>20B5;5< :;028H8 2 :>4K ASCII 8;8 B5:CI59 =0F8>=0;L=>9 :>48@>2:8 (2 =0H5 2@5<O, >1KG=>, UTF-8) 8;8, 5A;8 MB> =5>1E>48<>, 2 :>4K @0AH8@5=8O, 8 ?5@5405B MB8 A8<2>;K 2 254CI55 CAB@>9AB2>, B0: GB> >=8 ?>ABC?0NB =0 AB0=40@B=K9 22>4 70?CI5==>9 ?@>3@0<<K 8;8 :0:>3>-B> 87 5Q ?>4?@>F5AA>2.. @><5 B>3>, 40==K5, 2K2>48<K5 70?CI5==>9 ?@>3@0<<>9 2 45A:@8?B>@K 1 8 2, AG8BK20NBAO ?@>F5AA>< xterm(1) 87 254CI53> CAB@>9AB20 8 >B>1@060NBAO 2 B5:AB>2>< >:=5 B0: 65, :0: >=8 >B>1@060;8AL 1K =0 48A?;55 2845>B5@<8=0;0. @8 MB><, ?5@540205<K5 ?@>3@0<<>9 :>4K @0AH8@5=8O 8=B5@?@5B8@CNBAO ?@>3@0<<>9 xterm(1) :0: :><0=4K ?5@5<5I5=8O :C@A>@0, 87<5=5=8O F25B0 B5:AB0 8 B.4., ?>MB><C ?@>3@0<<K, @0AAG8B0==K5 =0 @01>BC A 2845>B5@<8=0;><, @01>B0NB 2 ?@82KG=>9 4;O =8E A@545. @>3@0<<=K9 8=B5@D59A 22>40/2K2>40 =>385 87 A8AB5<=KE 2K7>2>2 4;O @01>BK A >1KG=K<8 D09;0<8 B0:65 8A?>;L7CNBAO 8 4;O @01>BK A B5@<8=0;L=K<8 A?5F80;L=K<8 D09;0<8. ;O 4>ABC?0 : B5@<8=0;0< <>6=> 8A?>;L7>20BL A;54CNI85 A8AB5<=K5 2K7>2K: open(2) 0: 8 @53C;O@=K5 D09;K, A?5F80;L=K5 109B->@85=B8@>20==K5 D09;K >B:@K20NBAO MB8< A8AB5<=K< 2K7>2><. > A>3;0H5=8N, 8<5=0 2A5E B5@<8=0;L=K9 D09;>2 =0E>4OBAO 2 48@5:B>@88 /dev 8;8 >4=>9 87 ?>448@5:B>@89 /dev.  Solaris >=8 @07<5I5=K 2 /dev/term/XX (D878G5A:85 B5@<8=0;K) 8 /dev/pty/XX (?A524>B5@<8=0;K), 345 XX  42C7=0G=>5 45AOB8G=>5 G8A;>. @><5 B>3>, C?@02;ONI89 B5@<8=0; 20H59 A5AA88 4>ABC?5= 20H59 ?@>3@0<<5 :0: /dev/tty. ioctl(2) -B>B A8AB5<=K9 2K7>2 8A?>;L7C5BAO ?5@540G8 CAB@>9AB20< :><0=4, :>B>@K5 =5 <>3CB 1KBL A2545=K : GB5=8N 8;8 70?8A8. # B5@<8=0;>2, ioctl(2) 8A?>;L7C5BAO :0: 4;O :>=D83C@0F88 D878G5A:>3> ?>@B0 22>40/2K2>40, B0: 8 4;O C?@02;5=8O DC=:F8O<8 B5@<8=0;L=>9 48AF8?;8=K. !>>B25BAB2CNI85 :><0=4K ioctl(2) =5 AB0=40@B87>20=K, @07;8G0NBAO 2 @07=KE Unix-A8AB5<0E 8 =5 1C4CB >1AC640BLAO 2 MB>< :C@A5. 0@0<5B@K ioctl(2) 4;O @01>BK A B5@<8=0;0<8 2 Solaris, >?8A0=K =0 AB@0=8F5 @C:>2>4AB20 termio(7I). termios(3!) -B0 AB@0=8F0 @C:>2>4AB20 A>45@68B =01>@ DC=:F89, ?@54>AB02;ONI8E AB0=40@B87>20==K9 8=B5@D59A 4;O C?@02;5=8O B5@<8=0;L=K<8 CAB@>9AB20<8. -B> 1>;55 ?@54?>GB8B5;L=K9 8=B5@D59A, G5< ioctl(2), ?>B><C GB> >= A>>B25BAB2C5B AB0=40@BC POSIX 8 >15A?5G8205B @07@01>B:C ?5@5=>A8<KE ?@>3@0<<.  MB>< @0745;5 1C4CB >1AC640BLAO, 3;02=K< >1@07><, DC=:F88 termios(3C). isatty(3F) -B>B A8AB5<=K9 2K7>2 >?@545;O5B, A2O70= ;8 D09;>2K9 45A:@8?B>@ A B5@<8=0;L=K< CAB@>9AB2>< 8;8 A D09;>< :0:>3>-B> 4@C3>3> B8?0. A;8 isatty(3F) 2>72@0I05B =5=C;52>5 7=0G5=85, D09;>2K9 45A:@8?B>@ ?>445@68205B B5@<8=0;L=K5 ioctl(2) 8 DC=:F88 termios(3C). read(2) A?>;L7C5BAO 4;O GB5=8O 40==KE 87 A?5F80;L=>3> B5@<8=0;L=>3> D09;0. read(2) 2>72@0I05B :>;8G5AB2> ?@>G8B0==KE 109B>2, :>B>@>5 <>65B 1KBL <5=LH5 70?@>H5==>3>. > C<>;G0=8N, B5@<8=0; >68405B 22>40 ?>;=>9 AB@>:8, >:0=G820NI59AO A8<2>;>< '\n' (ASCII NL) 8 AG8BK205B 40==K5 ?> AB@>:0<. 4=0:> =5 >1O70B5;L=> G8B0BL 2AN AB@>:C 70 >48= @07. A;8 1CD5@ read(2) <5=LH5 4;8=K B5:CI59 AB@>:8, 1C45B AG8B0=> B>;L:> =0G0;> AB@>:8. 'B5=85 A B5@<8=0;0 @07@CH05B 40==K5, B> 5ABL ?@>G8B0==K5 40==K5 =5 <>3CB 1KBL ?@>G8B0=K >?OBL. >MB><C 5A;8 420 ?@>F5AA0 >4=>2@5<5==> G8B0NB A B5@<8=0;0, MB> <>65B ?@82>48BL : ?>B5@5 40==KE. ;O C?@02;5=8O 4>ABC?>< : GB5=8N A B5@<8=0;0 8A?>;L7CNBAO A83=0;K C?@02;5=8O 7040=8O<8 8 DC=:F8O tcsetpgrp(3C), :>B>@K5 @0AA<0B@820NBAO 40;55 2 MB>< @0745;5 write(2) !8AB5<=K9 2K7>2 write(2) 8A?>;L7C5BAO 4;O 70?8A8 A8<2>;>2 2 A?5F80;L=K9 109B->@85=B8@>20==K9 D09;. poll(2) 8 select(3C). -B8 2K7>2K G0AB> 8A?>;L7CNBAO 4;O <C;LB8?;5:A8@>20=8O 22>40-2K2>40, 5A;8 ?@>F5AAC =5>1E>48<> >4=>2@5<5==> @01>B0BL A B5@<8=0;>< 8 4@C38<8 CAB@>9AB20<8 8;8 ?A524>CAB@>9AB20<8, @01>B0 A :>B>@K<8 <>65B ?@825AB8 : 1;>:8@>2:5. libcurses(3LIB) 181;8>B5:0 4;O 35=5@0F88 :>4>2 @0AH8@5=8O B5@<8=0;0 2 7028A8<>AB8 >B 53> B8?0. close(2) !8AB5<=K9 2K7>2 close(2) 70:@K205B 45A:@8?B>@ D09;0, A2O70==K9 A> A?5F80;L=K< D09;><. lseek(2), mmap(2) "5@<8=0;L=K5 CAB@>9AB20 MB8 2K7>2K =5 ?>445@6820NB. 81;8>B5:0 libcurses(3LIB) 8 4@C385 181;8>B5:8 845>B5@<8=0;K 8 B5@<8=0;L=K5 M<C;OB>@K ?>445@6820NB 4>2>;L=> 1>30BK5 DC=:F88 @01>BK A B5:AB><. 4=>9 87 3;02=KE DC=:F89 O2;O5BAO 87<5=5=85 ?>;>65=8O :C@A>@0  B>G:8, 2 :>B>@>9 1C45B 2K2>48BLAO B5:AB =0 M:@0=. 5@5<5I0O :C@A>@, ?>;L7>20B5;LA:0O ?@>3@0<<0 <>65B @8A>20BL =0 M:@0=5 ?>GB8 2AQ, GB> <>6=> 87>1@078BL ?@8 ?><>I8 A8<2>;>2 ASCII: M:@0==K5 D>@<K, 2K?040NI85 <5=N, 480;>3>2K5 >:=0, 4065 87>1@065=8O (B0: =07K205<K9 ASCII art). @><5 B>3>, <=>385 B5@<8=0;K ?>445@6820NB @0AH8@5==K5 A8<2>;K, =0?@8<5@, B0: =07K205<CN ?A524>3@0D8:C. -B8 A8<2>;K ?>72>;ON @8A>20BL =0 M:@0=5 ?@O<>C3>;L=K5 @0<:8 8 B01;8FK. =>385 2845>B5@<8=0;K 8 ?@0:B8G5A:8 2A5 B5@<8=0;L=K5 M<C;OB>@K B0:65 ?>445@6820NB C?@02;5=85 F25B>< A8<2>;>2 8 D>=0. >ABC? :> 2A5< MB8< DC=:F8O< >ACI5AB2;O5BAO ?@8 ?><>I8 :>4>2 @0AH8@5=8O (escape sequences)  <=>3>109B>2KE ?>A;54>20B5;L=>AB59, =0G8=0NI8EAO A A8<2>;0 ASCII ESC. 07=K5 <>45;8 B5@<8=0;>2 ?>445@6820NB @07=K5 =01>@K :>4>2 @0AH8@5=8O. !CI5AB2C5B =5A:>;L:> 45-N@5 8 45-D0:B> AB0=40@B>2 MB8E :>4>2. A=>2=>9 AB0=40@B 45-N@5  MB> ECMA-48, 8725AB=K9 B0:65 :0: ANSI X3.64 8 ISO/IEC 6429, A>>B25BAB2CNI89 =01>@ :>4>2 @0AH8@5=8O B0:65 =07K205BAO ANSI escape sequences. 081>;55 8725AB=K5 AB0=40@BK 45-D0:B>  MB> C?@02;ONI85 :>4K B5@<8=0;>2 DEC VT-50, DEC VT-100 8 xterm. 01>@ :>4>2 @0AH8@5=8O VT-100 A8;L=> ?5@5:@K205BAO A> AB0=40@B>< ANSI 8 AG8B05BAO >4=8< 87 ?5@2KE 0??0@0B=KE B5@<8=0;>2, @50;87>202H8E MB>B AB0=40@B. 01>@ :>4>2 xterm M<C;8@C5B :0: VT-100, B0: 8 ANSI, 0 B0:65 4>102;O5B @O4 DC=:F89, E0@0:B5@=KE 4;O B5@<8=0;L=>3> M<C;OB>@0  B0:, :>4 @0AH8@5=8O ESC]2;stringBEL (34e ESC  MB> ASCII ESC, 0 BEL  ASCII BEL) 70<5=O5B =0720=85 >:=0 xterm =0 string.  A8AB5<=>< @C:>2>4AB25 bash(1) A>45@68BAO 8=D>@<0F8O > B><, :0: =0AB@>8BL AB@>:C ?@83;0H5=8O bash, GB>1K >=0 A>45@60;0 MBC ?>A;54>20B5;L=>ABL 8 D>@<8@>20;0 string B0:, GB>1K MB0 AB@>:0, 2 A2>N >G5@54L, A>45@60;0 8=B5@5A=CN 4;O ?>;L7>20B5;O 8=D>@<0F8N, =0?@8<5@, B5:CI89 :0B0;>3 40==>9 B5@<8=0;L=>9 A5AA88, 8<O A5B52>3> C7;0 8 B.4. "0: 8;8 8=0G5, <=>385 B5@<8=0;K, @50;87CNI85 AB0=40@B=K5 =01>@K :><0=4, ?>445@6820NB 8E =5 ?>;=>ABLN 8;8 4>102;ONB :0:85-B> A2>8 @0AH8@5=8O. /4@> Unix =5 ?@54>AB02;O5B A5@28A>2 4;O @01>BK A :>40<8 @0AH8@5=8O B5@<8=0;>2 8 ?5@5405B MB8 :>4K B5@<8=0;C :0: 5ABL. ;O @01>BK A :>40<8 @0AH8@5=8O =5>1E>48<> 8A?>;L7>20BL 181;8>B5:8, =0?@8<5@, libcurses(3LIB), :>B>@0O 2E>48B 2 ?>AB02:C Solaris. 81;8>B5:0 libcurses >15A?5G8205B D>@<8@>20=85 :>4>2 @0AH8@5=8O 4;O 2K?>;=5=8O 7040==KE DC=:F89, =0?@8<5@, 4;O ?5@5<5I5=8O :C@A>@0 2 7040==CN B>G:C M:@0=0, 0 B0:65 8=B5@?@5B0F8N :>4>2 @0AH8@5=8O, ?>AK;05<KE B5@<8=0;><, 8 8E ?5@52>4 2 =57028A8<K5 >B B5@<8=0;0 ?A524>A8<2>;K. 81;8>B5:0 >?@545;O5B B8? B5@<8=0;0 =0 >A=>25 ?5@5<5==>9 A@54K TERM, 8 8A?>;L7C5B 107C 40==KE, E@0=OICNAO 2 :0B0;>35 /usr/share/lib/terminfo/.  MB>9 1075 4;O :064>3> 8725AB=>3> B8?0 B5@<8=0;0 E@0=8BAO B01;8F0, >?8AK20NI0O ?>445@68205<K5 8< B8?K :><0=4 8 :>4 @0AH8@5=8O, A>>B25BAB2CNI89 :064>9 :><0=40. Libcurses >15A?5G8205B =5:>B>@CN >?B8<870F8N: B0:, 5A;8 B@51C5BAO ?5@5<5AB8BL :C@A>@ 2 7040==CN B>G:C 8 B5@<8=0; ?>445@68205B :><0=4K 4;O CAB0=>2:8 ?>78F88 :C@A>@0, 181;8>B5:0 A35=5@8@C5B A>>B25BAB2CNICN :><0=4C. A;8 65 B5@<8=0; B0:>9 :><0=4K =5 ?>445@68205B, 181;8>B5:0 A35=5@8@C5B ?>A;54>20B5;L=>ABL ?5@5<5I5=89 :C@A>@0 =0 >4=C ?>78F8N 225@E, 2=87 8;8 21>: (B0:0O DC=:F8O 5ABL ?>GB8 C 2A5E 2845>B5@<8=0;>2). >GB8 2A5 ?>;=>M:@0==K5 ?@>3@0<<K, B0:85, :0: B5:AB>2K5 @540:B>@K, 251-1@0C75@K 8;8 D09;>2K5 <5=5465@K, 8A?>;L7CNB libcurses 8;8 :0:>9-B> 87 55 0=0;>3>2, G0I5 2A53> ncurses. 4=0:> 2 =0H5< :C@A5 <K 87CG0BL MBC 181;8>B5:C =5 1C45<. 0=>=8G5A:89 22>4 "5@<8=0; 8<55B 425 >G5@548 22>40 8 >4=0 - 2K2>40. !8<2>;K, 22>48<K5 A :;0280BC@K B5@<8=0;0, ?><5I0NBAO 2 "AK@CN" >G5@54L 22>40. @><5 B>3>, 5A;8 B@51C5BAO ME> (2K2>4 ?5G0B05<KE A8<2>;>2 =0 M:@0=), :>?88 MB8E A8<2>;>2 4>102;ONBAO 2 >G5@54L 2K2>40. A;8 @07@5H5= :0=>=8G5A:89 @568< >1@01>B:8 22>40 (>1KG=> MB> 45;05BAO ?> C<>;G0=8N), A8<2>;K 87 "AK@>9" >G5@548 ?>425@30NBAO ?@54>1@01>B:5 ?@8 :>?8@>20=88 2 :0=>=8G5A:CN >G5@54L 22>40. >?8@>20=85 ?@>8AE>48B ?> AB@>:0<, :>340 ?>ABC?05B A8<2>; ?5@52>40 AB@>:8 (NL). >;L7>20B5;LA:0O ?@>3@0<<0 G8B05B AB@>:8 22>40 87 :0=>=8G5A:>9 >G5@548. 0=>=8G5A:0O ?@54>1@01>B:0 22>40 2:;NG05B >1@01>B:C A8<2>;>2 701>O 8 AB8@0=8O AB@>:8. !8<2>; 701>O ERASE (=0 2845>B5@<8=0;0E MB> >1KG=> '\0x8' (Ctrl-H, ASCII BS) 8;8 '\0x7F' (ASCII DEL); =0 B5;5B09?0E G0AB> 8A?>;L7>20;AO A8<2>; #) C40;O5BAO 2<5AB5 A A8<2>;><, 22545==K< ?5@54 =8<. ;028H0 Backspace =0 B5@<8=0;5 <>65B 1KBL =0AB@>5=0 ?>AK;0BL ;81> ASCII BS, ;81> ASCII DEL. ;028H0 Del 2 xterm 8;8 gnome-terminal ?>AK;05B ?>A;54>20B5;L=>ABL ASCII ESC [3~. # gnome-terminal ?>2545=85 >1>8E :;028H =0AB@08205BAO =0 70:;04:5 =0AB@>5: Edit->Profile Preferences->Compatibility. !8<2>; AB8@0=8O AB@>:8 KILL (Ctrl-W ?> C<>;G0=8N) ?@82>48B : AB8@0=8N 2A59 B5:CI59 AB@>:8. 0?@8<5@, ?@54?>;030O, GB> A8<2>; 701>O @025= ASCII BS, 2K =018@05B5 =0 :;0280BC@5: datxBSe !8<2>;K, =01@0==K5 =0 :;0280BC@5, 70?8AK20NBAO 2 "AK@CN" >G5@54L ?> <5@5 22>40. 0B5< ?@8 :>?8@>20=88 87 "AK@>9" >G5@548 2 :0=>=8G5A:CN, A8<2>;K ?@>A<0B@820NBAO. @8 MB>< A8<2>;K BS 8 AB>OI89 ?5@54 =8< 2K1@0AK20NBAO. >MB><C, ?@>3@0<<0, G8B0NI0O A B5@<8=0;0, ?>;CG8B AB@>:C: date @8 2K2>45, A8<2>;K, 35=5@8@C5<K5 20H59 ?@8:;04=>9 ?@>3@0<<>9, =0:0?;820NBAO 2 2KE>4=>9 >G5@548. @8 MB>< <>65B ?@>8AE>48BL B@51C5<0O =0AB@>9:0<8 ?>AB>1@01>B:0. A?>;L7>20=85 termios(3C) !CI5AB2C5B 1>;55 ?OB845AOB8 @07;8G=KE ?0@0<5B@>2 8 D;03>2, C?@02;ONI8E B5@<8=0;L=K< 8=B5@D59A><. -B8 ?0@0<5B@K <>6=> 87<5=OBL G5@57 ioctl termio(7I), DC=:F88 termios(3C) 8 :><0=4C stty(1). 865 ?@82>4OBAO =5:>B>@K5 87 >A=>2=KE E0@0:B5@8AB8: B5@<8=0;0. 0@0<5B@K RS232 A?>;L7CO D;03 c_cflag, 2K <>65B5 C?@02;OBL A:>@>ABLN ?5@540G8, :>;8G5AB2>< 18B 2 A8<2>;5, :>;8G5AB2>< AB>?>2KE 18B>2, >1@01>B:>9 18B0 G5B=>AB8 8 B.4. -B> =5>1E>48<> ?>B><C, GB> ?@>B>:>; RS232 =5 8<55B A@54AB2 02B>A>3;0A>20=8O C:070==KE ?0@0<5B@>2, 8 8E =5>1E>48<> =0AB@0820BL 2@CG=CN B0:, GB>1K =0AB@>9:8 B5@<8=0;0 8 B5@<8=0;L=>3> ?>@B0 :><?LNB5@0 A>2?040;8. # ?A524>B5@<8=0;>2 MB8 ?0@0<5B@K A>E@0=ONBAO B>;L:> 4;O A>2<5AB8<>AB8; 87<5=5=85 1>;LH8=AB20 87 =8E (:@><5 :>;8G5AB20 18B 2 A8<2>;5) =8 =0 GB> =5 2;8ONB. B>1@065=85 A8<2>;>2. K <>65B5 C?@02;OBL >1@01>B:>9 A8<2>;>2 2>72@0B0 :0@5B:8 (CR) 8 ?5@52>40 AB@>:8 (NL). K <>65B5 ?@5>1@07>2K20BL NL 2 CR (INLCR) 8 CR 2 NL (ICRNL). K <>65B5 B0:65 83=>@8@>20BL ?>ABC?0NI85 A8<2>;K CR (IGNCR). -B> ?>;57=> 4;O B5@<8=0;>2, :>B>@K5 35=5@8@CNB ?>A;54>20B5;L=>ABL A8<2>;>2 CR-NL ?@8 =060B88 :;028H8 <RETURN>. 0 4@C38E B5@<8=0;0E, :>B>@K5 35=5@8@CNB >48=>G=K9 A8<2>; CR, ;CGH5 ?@8=8<0BL MB>B A8<2>; 8 ?@5>1@07>2K20BL 53> 2 NL. $;038 4;O MB8E @568<>2 ?><5I0NBAO 2 c_iflag. !>>B25BAB25==>, D;038 ONLCR 8 OCRNL 2 c_oflag 8A?>;L7CNBAO 4;O ?@5>1@07>20=8O NL 2 CR-NL 8;8 CR 2 NL, A>>B25BAB25==>, ?@8 2K2>45. ;O B5@<8=0;>2, :>B>@K5 >B>1@060NB B>;L:> 1C:2K 25@E=53> @538AB@0, <>3CB 1KBL CAB0=>2;5=K D;038 XCASE 2 c_iflag, IUCLC 2 c_iflag 8 OLCUC 2 c_oflag. C:2K 25@E=53> @538AB@0 >B>1@060NBAO 2 =86=89 @538AB@ ?@8 22>45 8 =0>1>@>B - ?@8 2K2>45. C:2K 25@E=53> @538AB@0 ?@5420@ONBAO A8<2>;>< >1@0B=>9 :>A>9 G5@BK (backslash, \). > C<>;G0=8N, =5:>B>@K5 B5@<8=0;K 8A?>;L7CNB A5<818B=K9 :>4 ASCII 4;O ?@54AB02;5=8O A8<2>;>2. 4=0:> <>65B 1KBL =5>1E>48<0 @01>B0 A 2>AL<818B=K<8 40==K<8. 0?@8<5@, MB> <>65B ?>B@51>20BLAO ?@>3@0<<0<, @01>B0NI8< A =0F8>=0;L=K<8 0;D028B0<8 8;8 UTF-8. ;O B>3>, GB>1K 2K:;NG8BL A@570=85 2>AL<>3> 18B0 ?@8 22>45, 2K 4>;6=K >G8AB8BL D;03 ISTRIP 2 c_iflag, CAB0=>28BL D;03 CS8 4;O ?5@540G8 2>AL<818B=KE A8<2>;>2 8, 2>7<>6=>, 2K:;NG8BL :>=B@>;L G5B=>AB8 >G8AB:>9 PARENB 2 c_cflag. 045@6:8 8 B01C;OF88. ;O <5E0=8G5A:8E B5@<8=0;>2 <>6=> CAB0=>28BL @07;8G=K5 D;038 2 c_oflag, C?@02;ONI85 7045@6:0<8 ?@8 >1@01>B:5 ?5@52>40 AB@>:8, 2>72@0B0 :0@5B:8, 3>@87>=B0;L=>9 B01C;OF88, A42830 :0@5B:8 =0704 (backspace), 25@B8:0;L=>9 B01C;OF88 8 ?5@52>40 AB@0=8FK. >@87>=B0;L=0O B01C;OF8O <>65B ?@5>1@07>2K20BLAO 2 A>>B25BAB2CNI55 G8A;> ?@>15;>2 CAB0=>2:>9 D;030 TAB3. (@>4>;65=85 =0 A;54CNI59 AB@0=8F5) #?@02;5=85 ?>B>:><. K2>4 =0 B5@<8=0; <>65B 1KBL ?@8>AB0=>2;5= =060B85< !"-A8<2>;0, ?> C<>;G0=8N CTRL-S, 8 2>7>1=>2;5= =060B85< !" "-A8<2>;0, ?> C<>;G0=8N CTRL-Q. -B0 2>7<>6=>ABL @07@5H05BAO CAB0=>2:>9 D;030 IXON 2 c_flag. =0G5, MB8 A8<2>;K =5 8<5NB A?5F80;L=>3> A<KA;0. @><5 B>3>, 5A;8 CAB0=>28BL D;03 IXANY, B> ;N1>9 A8<2>; 1C45B 2>7>1=>2;OBL 2K2>4. ;O C?@02;5=8O ?>B>:>< 2K2>40 8A?>;L7C5BAO DC=:F8O tcflow(2). @><5 C?@02;5=8O ?>B>:>< 2K2>40, CAB0=>2:>9 D;030 IXOFF 2 c_iflag <>6=> C?@02;OBL ?>B>:>< 22>40. @8 MB><, 5A;8 2E>4=0O >G5@54L ?@81;8605BAO : 70?>;=5=8N, 4@0925@ B5@<8=0;L=>3> CAB@>9AB20 ?>H;5B !"-A8<2>; 4;O ?@8>AB0=>2:8 22>40, 8 !" "-A8<2>; - 4;O 53> 2>7>1=>2;5=8O. -B> <>65B 1KBL ?>;57=>, 5A;8 ?@8:;04=0O ?@>3@0<<0 ?>;CG05B 40==K5 87 C40;5==>9 A8AB5<K. >;55 C4>1=K9 A?>A>1 C?@02;OBL ?>B>:>< 40==KE ?@8 2K2>45 =0 B5@<8=0;  MB> CB8;8B0 more(1) 8;8 5Q 0=0;>38. 4=0:> =04> ?>4G5@:=CBL, GB> ?@8 8A?>;L7>20=88 more(1), ?@>3@0<<0 >ACI5AB2;O5B 2K2>4 =5 =0 B5@<8=0;, 0 2 ?@>3@0<<=K9 :0=0;, =0?@02;5==K9 =0 2E>4 more(1); MB> <>65B ?>2;8OBL =0 ?>2545=85 =5:>B>@KE ?@>3@0<<. #?@02;ONI85 A8<2>;K @8 22>45 =5:>B>@K5 A8<2>;K 8<5NB A?5F80;L=>5 7=0G5=85. 0?@8<5@, # 8;8 ASCII BS O2;O5BAO A8<2>;>< 701>O, CTRL-W  A8<2>;>< AB8@0=8O AB@>:8, CTRL-D  :>=F>< 22>40 8 B.4. -B8 A8<2>;K E@0=OBAO 2 <0AA825 c_cc[] 8 <>3CB 1KBL 87<5=5=K. 0?@8<5@, ?@8 8A?>;L7>20=88 48A?;5O, 3>@074> C4>1=55 8A?>;L7>20BL 2 :0G5AB25 A8<2>;0 701>O BS (A4283 :0@5B:8 =0704), G5< # -E> "5@<8=0;K >1KG=> @01>B0NB A UNIX-A8AB5<0<8 2 ?>;=>4C?;5:A=>< @568<5. -B> >7=0G05B, GB> 40==K5 ?5@540NBAO 2 >1>8E =0?@02;5=8OE >4=>2@5<5==> 8 GB> :><?LNB5@ >15A?5G8205B ME> (>B>1@065=85 =0 M:@0=5 8;8 =0 ?5G0B8) ?>;CG05<KE A8<2>;>2. -E> 2K:;NG05BAO >G8AB:>9 D;030 ECHO 2 c_lflag. @><5 B>3>, AB5@BK5 =060B85< :;028H8 701>O A8<2>;K <>3CB 70B8@0BLAO CAB0=>2:>9 D;030 ECHOE. A;8 CAB0=>28BL D;03 ECHOK, B> AB8@0=85 AB@>:8 A8<2>;>< KILL 1C45B ?@82>48BL : ?5@52>4C AB@>:8 =0 B5@<8=0;5. 5<54;5==K9 22>4 1KG=> A8<2>;K ?@8 22>45 =0:0?;820NBAO, ?>:0 =5 A>15@5BAO ?>;=0O AB@>:0, 7025@H5==0O NL. ">;L:> ?>A;5 MB>3> C4>2;5B2>@O5BAO 70?@>A read(2), 4065 5A;8 >= B@51>20; B>;L:> >48= A8<2>;. =0G5=85, 2>72@0I05<>5 2K7>2>< read(2), @02=> :>;8G5AB2C ?@>G8B0==KE 2 459AB28B5;L=>AB8 A8<2>;>2. > <=>38E ?@8:;04=KE ?@>3@0<<0E, B0:8E :0: @540:B>@K D>@< 8;8 ?>;=>M:@0==K5 B5:AB>2K5 @540:B>@K, AB@>:8 22>40 =5 8<5NB A<KA;0.  B0:8E ?@>3@0<<0E =5>1E>48<> G8B0BL A8<2>;K ?> <5@5 8E 22>40. @8 >G8AB:5 D;030 ICANON 2 c_lflag 22>48<K5 A8<2>;K =5 3@C??8@CNBAO 2 AB@>:8, 8 read(2) G8B05B 8E ?> <5@5 ?>ABC?;5=8O. -B>B @568< 8725AB5= B0:65 :0: @568< =5:0=>=8G5A:>3> 22>40. <5AB> MB>3> C4>2;5B2>@5=85 70?@>A0 read(2) >?@545;O5BAO ?0@0<5B@0<8 MIN (<8=8<0;L=>5 :>;8G5AB2> =060BKE :;028H) 8 TIME (?@><56CB>: 2@5<5=8 <564C 22545==K<8 A8<2>;0<8). A;8 ICANON CAB0=>2;5=, B> @568< 22>40 =07K205BAO :0=>=8G5A:8<. (@>4>;65=85 =0 A;54CNI59 AB@0=8F5) "!K@>9" B5@<8=0;L=K9 22>4/2K2>4 "5@<8=0;L=K5 ?>@BK <>3CB 8A?>;L7>20BLAO 4;O ?>4:;NG5=8O =5 B>;L:> B5@<8=0;>2, => 8 4@C38E CAB@>9AB2, =0?@8<5@, <>45<>2, <KH59 8;8 @07;8G=>9 :>=B@>;L=>-87<5@8B5;L=>9 0??0@0BC@K. @8 @01>B5 A B0:8<8 CAB@>9AB20<8, ?@8:;04=K5 ?@>3@0<<K 8 4@0925@K B5@<8=0;L=KE CAB@>9AB2 <>3CB 1KBL 2K=C645=K ?5@54020BL 8 ?@8=8<0BL ?@>872>;L=K5 2>AL<818B=K5 40==K5. -B> <>3CB 1KBL A>>1I5=8O <KH8 > ?5@542865=88 8 =060B88 :=>?>:, 40==K5 ?@>B>:>;0 PPP 8;8 ?>ABC?0NI85 A 87<5@8B5;L=>3> CAB@>9AB20 40==K5. ;O @07@5H5=8O MB>3> =5>1E>48<> CAB0=>28BL 2>AL<818B=K5 40==K5, =5:0=>=8G5A:89 22>4, 70?@5B8BL 2A5 >B>1@065=8O A8<2>;>2 8 C?@02;5=85 ?>B>:><, CAB@0=8BL A?5F80;L=K5 7=0G5=8O 2A5E C?@02;ONI8E A8<2>;>2 8 2K:;NG8BL ME>.  :>=F5 @0745;0 ?@82>48BAO ?@8<5@ 8A?>;L7>20=8O "AK@>3>" B5@<8=0;L=>3> 22>40/2K2>40. >;CG5=85 8 CAB0=>2:0 0B@81CB>2 B5@<8=0;0 5@2K5 425 DC=:F88, >?8A0==K5 =0 AB@0=8F5 C:>2>4AB20 termios(3C), 8A?>;L7CNBAO 4;O ?>;CG5=8O 8 CAB0=>2:8 0B@81CB>2 B5@<8=0;0. tcgetattr(3C) ?>;CG05B B5:CI85 CAB0=>2:8 B5@<8=0;L=>3> CAB@>9AB20. tcsetattr(3C) 87<5=O5B MB8 CAB0=>2:8. -B8 DC=:F88 ?>;CG0NB 8 ?5@540NB B@51C5<K5 ?0@0<5B@K 2 2845 C?@02;ONI59 AB@C:BC@K termios. 0@0<5B@K DC=:F89 tcgetattr(3C) 8 tcsetattr(3C) B0:>2K: fildes 45A:@8?B>@ D09;0, A>>B25BAB2CNI89 B5@<8=0;L=><C CAB@>9AB2C. ;O MB>3> 45A:@8?B>@0 2K7>2 isatty(3F) 4>;65= 2>72@0I0BL =5=C;52>5 7=0G5=85. optional_actions ><18=0F8O D;03>2, >?@545;5==KE 2 <termios.h>. optional_actions >?@545;O5B, :>340 4>;6=K 1KBL 2K?>;=5=K 87<5=5=8O 8 GB> 45;0BL A =0E>4OI8<8AO 2 1CD5@0E CAB@>9AB20 40==K<8 ?@8 87<5=5=88 ?0@0<5B@>2. termios_p C:070B5;L =0 AB@C:BC@C termios. -B0 AB@C:BC@0 A>45@68B D;038 8 18B>2K5 ?>;O, 8A?>;L7C5<K5 4;O C?@02;5=8O B5@<8=0;L=K< 8=B5@D59A>< 22>40/2K2>40. $;038 8 ?>;O MB>9 AB@C:BC@K >1AC640NBAO ?>765. >A;5 8A?>;=5=8O tcgetattr(3C) @5:><5=4C5BAO A>E@0=8BL :>?8N MB>9 AB@C:BC@K, GB>1K ?@>3@0<<0 <>3;0 25@=CBL =0G0;L=>5 A>AB>O=85 B5@<8=0;L=>3> 8=B5@D59A0. 5;> 2 B><, GB> DC=:F88 tcsetattr(3C) 87<5=ONB =0AB@>9:8 =5 D09;>2>3> 45A:@8?B>@0 20H53> ?@>F5AA0, 0 =0AB@>9:8 4@0925@0 2 O4@5 Unix. =5A5==K5 20<8 87<5=5=8O =5 >B:0BK20NBAO 02B><0B8G5A:8 ?@8 7025@H5=88 ?@>3@0<<K, ?>MB><C =5=>@<0;L=> 7025@H82H0OAO ?@>3@0<<0 <>65B >AB028BL B5@<8=0; 2 =5?@83>4=>< 4;O @01>BK A>AB>O=88.  =5:>B>@KE A;CG0OE, 4;O 2>AAB0=>2;5=8O ?0@0<5B@>2 B5@<8=0;0 <>6=> 2>A?>;L7>20BLAO :><0=4>9 stty(1).  Solaris, :><0=40 stty sane ?KB05BAO ?@825AB8 B5@<8=0; 2 @568<, ?@83>4=K9 4;O 8=B5@0:B82=>9 @01>BK. @8 87<5=5=88 =0AB@>5: B5@<8=0;0, 2<5AB> B>3>, GB>1K D>@<8@>20BL 7=0G5=8O ?>;59 AB@C:BC@K termios A0<>AB>OB5;L=>, @5:><5=4C5BAO ?>;CG8BL B5:CI85 =0AB@>9:8 B5@<8=0;0 2K7>2>< tcgetattr(3C), 70B5< ?><5=OBL =C6=K5 20< ?0@0<5B@K 2 AB@C:BC@5 8 CAB0=>28BL =>2K5 ?0@0<5B@K 2K7>2>< tcsetattr(3C). @8 MB>< 2K, ?> 2>7<>6=>AB8, A>E@0=8B5 B5 =0AB@>9:8, :>B>@K5 ?>;L7>20B5;L <>3 A45;0BL 4> 70?CA:0 20H59 ?@>3@0<<K. @><5 B>3>, 2 ?>A;54CNI8E 25@A8OE Solaris 8 2 4@C38E Unix-A8AB5<0E, 2 AB@C:BC@5 termios <>3CB ?>O28BLAO 4>?>;=8B5;L=K5 ?>;O 8;8 D;038. A;8 20H0 ?@>3@0<<0 =5 1C45B 157 =C64K 87<5=OBL =57=0:><K5 59 =0AB@>9:8, MB> 7=0G8B5;L=> >1;53G8B 5Q 040?B0F8N : =>2K< 25@A8O< Solaris 8 55 ?5@5=>A =0 4@C385 ?;0BD>@<K. 0@0<5B@ optinal_actions DC=:F88 tcsetattr(2) 0@0<5B@ optional_actions DC=:F88 tcsetattr(2) <>65B ?@8=8<0BL A;54CNI85 7=0G5=8O: TCSANOW B@81CBK 87<5=ONBAO =5<54;5==>. TCSADRAIN 7<5=5=8O 0B@81CB>2 ?@>8AE>4OB B>;L:> ?>A;5 B>3>, :0: 1K; ?5@540= (>ACH5=) 25AL 2K2>4 2 fildes. -B>B 70?@>A <>65B 1KBL 8A?>;L7>20= ?@8 87<5=5=88 0B@81CB>2, :>B>@K5 2;8ONB =0 >1@01>B:C 2K2>40. TCSAFLUSH -B> ?>E>65 =0 TCADRAIN. 7<5=5=85 ?@>8AE>48B ?>A;5 B>3>, :0: 25AL 2K2>4 2 fildes 1K; ?5@540=, 0 =5?@>G8B0==K9 22>4 A1@>H5=. 0?@8<5@, MB>B 70?@>A ?>;575=, 5A;8 =C6=> ?@>83=>@8@>20BL 2A5 A8<2>;K 2 1CD5@5 22>40. !B@C:BC@0 termios !B@C:BC@0 termios 8A?>;L7C5BAO 4;O ?@54AB02;5=8O E0@0:B5@8AB8: B5@<8=0;L=>3> CAB@>9AB20. !B@C:BC@0 >4=0 8 B0 65 4;O 2A5E B5@<8=0;L=KE CAB@>9AB2, =57028A8<> >B 873>B>28B5;O 0??0@0BC@K. -B> ?@54>AB02;O5B 548=>>1@07=K9 A?>A>1 87<5=5=8O E0@0:B5@8AB8: 8 ?>2545=8O B5@<8=0;L=>3> CAB@>9AB20.  G0AB=>AB8, MB0 AB@C:BC@0 8A?>;L7C5BAO <>4C;5< STREAMS 4;O 87<5=5=8O ?>2545=8O 0??0@0B=>3> 8 ?@>3@0<<=>3> 8=B5@D59A0 22>40/2K2>40. 865 ?5@5G8A;5=K ?>;O AB@C:BC@K termios: c_iflag D;038, C?@02;ONI85 ?@54>1@01>B:>9 22>40 A B5@<8=0;0. c_oflag D;038, C?@02;ONI85 A8AB5<=>9 ?>AB>1@01>B:>9 2K2>40 =0 B5@<8=0;. c_cflag D;038, >?8AK20NI85 0??0@0B=K5 E0@0:B5@8AB8:8 B5@<8=0;L=>3> 8=B5@D59A0. c_lflag D;038, C?@02;ONI85 @07185=85< ?>B>:0 =0 AB@>:8. c_cc[] <0AA82 A?5F80;L=KE C?@02;ONI8E A8<2>;>2. -B8 ?>;O 1C4CB ?>4@>1=55 >1AC640BLAO 40;55 2 MB>< @0745;5. !AK;:0: /usr/include/sys/termios.h #?@02;ONI85 A8<2>;K #?@02;ONI85 A8<2>;K, >?@545;5==K5 2 <0AA825 c_cc[] 8<5NB A?5F80;L=>5 7=0G5=85 8 <>3CB 1KBL 87<5=5=K 2K7>2>< tcsetattr(). 0;55 2 MB>< @0745;5, ?@82545=K A8<2>;L=K5 :>=AB0=BK, >?@545;5==K5 2 <termios.h>. -B8 A8<2>;L=K5 :>=AB0=BK <>3CB 1KBL 8A?>;L7>20=K :0: 8=45:AK 2 <0AA825 c_cc[]. =0G5=8O ?> C<>;G0=8N 4;O A>>B25BAB2CNI8E M;5<5=B>2 ?5@5G8A;5=K 2 A:>1:0E. 5:>B>@K5 87 MB8E C?@02;ONI8E A8<2>;>2 >?8A0=K =865. !;54C5B 8<5BL 2 284C, GB> 2 :>48@>2:5 ASCII, ?5@2K5 32 A8<2>;0 70@575@28@>20=K 4;O 2K?>;=5=8O @07;8G=KE C?@02;ONI8E DC=:F89 (A<. ascii(5)). 845>B5@<8=0;K 8 B5@<8=0;L=K5 M<C;OB>@K 35=5@8@CNB B0:85 A8<2>;K ?@8 >4=>2@5<5==>< =060=88 :><18=0F88 0;D028B=KE (8;8 =5:>B>@KE =50;D028B=KE) :;028H 8 :;028H8 Ctrl. 060B85 :;028H8 Ctrl ?@82>48B : A@570=8N AB0@H8E 18B :>40 A>>B25BAB2CNI53> A8<2>;0. A:;NG5=85 A>AB02;O5B :><18=0F8O Ctrl-?, :>B>@0O 2K405B :>4 '\0x1F' (ASCII DEL). "0:, :><18=0F8O :;028H Ctrl-D  MB> A8<2>; '\0x3' (ASCII EOT). VINTR (Ctrl-C 8;8 ASCII DEL) 35=5@8@C5B A83=0; SIGINT, :>B>@K9 ?>AK;05BAO 2A5< ?@>F5AA0< 2 3@C??5 ?5@2>3> ?;0=0, A2O70==>9 A MB8< B5@<8=0;><. > C<>;G0=8N ?@>F5AA ?@8 ?>;CG5=88 MB>3> A83=0;0 1C45B 7025@H5=, => >= <>65B ?@>83=>@8@>20BL MB>B A83=0; 8;8 ?5@5E20B8BL 53> ?@8 ?><>I8 DC=:F88 >1@01>B:8. VQUIT (CTRL-\) 35=5@8@C5B A83=0; SIGQUIT. -B>B A83=0; >1@010BK205BAO B0: 65, :0: 8 SIGINT. VERASE (!trl-H, Ctrl-? 8;8 #) AB8@05B ?@54K4CI89 A8<2>;. = =5 <>65B AB5@5BL A8<2>; ?5@54 =0G0;>< AB@>:8, >3@0=8G5==>9 A8<2>;0<8 NL, EOF, EOL 8;8 EOL2. VWERASE (CTRL-W) >G8I05B ?@54K4CI55 "A;>2>". = =5 <>65B AB5@5BL A;>2> 87 ?@54K4CI59 AB@>:8, >3@0=8G5==>9 A8<2>;0<8 NL, EOF, EOL 8;8 EOL2. -B> DC=:F8O @0AH8@5=8O, ?>MB><C 4;O 55 8A?>;L7>20=8O =5>1E>48<> CAB0=>28BL D;03 IEXTEN. VKILL (Ctrl-U) AB8@05B 2AN AB@>:C, >3@0=8G5==CN A8<2>;0<8 NL, EOF, EOL 8;8 EOL2. VEOF (CTRL-D) <>65B 8A?>;L7>20BLAO 4;O >1>7=0G5=8O :>=F0 D09;0 ?@8 22>45 A B5@<8=0;0. >340 ?>;CG5= MB>B c8<2>;, 2A5 A8<2>;K, >6840NI85 AG8BK20=8O, 1C4CB =5<54;5==> ?5@540=K ?@>3@0<<5, 157 >6840=8O A8<2>;0 =>2>9 AB@>:8, 8 >AB0B>: AB@>:8 83=>@8@C5BAO. "0:8< >1@07><, 5A;8 2 >G5@548 =5 1K;> A8<2>;>2, B> 5ABL EOF 1K; ?>A;0= 2 =0G0;5 AB@>:8, read ?>;CG8B =>;L A8<2>;>2, GB> O2;O5BAO AB0=40@B=K< >1>7=0G5=85< :>=F0 D09;0. (@>4>;65=85 =0 A;54CNI59 AB@0=8F5) VSTOP (CTRL-S) <>65B 8A?>;L7>20BLAO 4;O 2@5<5==>9 ?@8>AB0=>2:8 2K2>40. -B> ?>;57=> =0 M:@0==KE B5@<8=0;0E, GB>1K 2K2>4 =5 8AG570; A M:@0=0, ?>:0 ?>;L7>20B5;L 53> =5 ?@>G8B0;. A;8 2K2>4 C65 ?@8>AB0=>2;5=, 22>48<K5 !"-A8<2>;K 83=>@8@CNBAO 8 =5 1C4CB ?@>G8B0=K. VSTART (CTRL-Q) 8A?>;L7C5BAO 4;O 2>7>1=>2;5=8O 2K2>40, >AB0=>2;5==>3> !"-A8<2>;><. A;8 22>4 =5 1K; ?@8>AB0=>2;5=, A8<2>;K VSTART 83=>@8@CNBAO 8 =5 G8B0NBAO. VSUSP (CTRL-Z) 35=5@8@C5B A83=0; SIGTSTP, :>B>@K9 ?@8>AB0=02;8205B 2A5 ?@>F5AAK 2 3@C??5 ?@>F5AA>2 ?5@2>3> ?;0=0 MB>3> B5@<8=0;0. 0?@8<5@, MB>B A8<2>; 8A?>;L7C5BAO 4;O DC=:F89 C?@02;5=8O 7040=8O<8 2 shell. VDISCARD (CTRL-O) ?@82>48B : B><C, GB> 25AL 2K2>4 1C45B 83=>@8@>20BLAO, ?>:0 =5 1C45B ?>A;0= 5I5 >48= A8<2>; DISCARD, ?@>3@0<<0 =5 2K2545B =>2K5 A8<2>;K 8;8 =5 A1@>A8B A>>B25BAB2CNI55 CA;>285. -B> DC=:F8O @0AH8@5=8O, 8 8A?>;=O5BAO, B>;L:> 5A;8 CAB0=>2;5= D;03 IEXTEN. VLNEXT (CTRL-V) 83=>@8@C5B A?5F80;L=>5 7=0G5=85 A;54CNI53> A8<2>;0. -B> @01>B05B 4;O 2A5E A?5F80;L=KE A8<2>;>2 \~D*\^&6^IPPQ,rsssNt|f xz&r@$ U hsLhsLhsLhsLhhumH sH  hhu6] hhu5hhu3NZ\z | p6%%%'*13:6Z6=.CKFQHQQ$$ Q SV\Z:]J_b^e8f hhi(jjBpfzz}:24$ʋN$46jlh8@l2z|j$Lڹ$$,0ppt(JLPH"$HJ$$b@BlVjb"|F68h$$87 <0AA820 c_cc[]. -B> ?>72>;O5B 22>48BL A8<2>;K, :>B>@K5 2 8=>< A;CG05 1K;8 1K ?@>8=B5@?@5B8@>20=K A8AB5<>9 (B0:85, :0: KILL, QUIT). !8<2>;K VERASE, VKILL 8 VEOF <>3CB B0:65 1KBL 22545=K ?>A;5 A8<2>;0 >1@0B=>9 :>A>9 G5@BK (backslash, \).  MB>< A;CG05 >=8 B0:65 =5 2K7>2CB 8A?>;=5=8O A?5F80;L=>9 DC=:F88. VREPRINT (CTRL-R 8;8 ASCII DC2) ?5G0B05B A8<2>; =>2>9 AB@>:8 8 2A5 A8<2>;K, :>B>@K5 >6840;8 2 >G5@548 22>40 (:0: 5A;8 1K MB> 1K;0 =>20O AB@>:0). -B> AG8B05BAO DC=:F859 @0AH8@5=8O, ?>MB><C @01>B05B, B>;L:> 5A;8 CAB0=>2;5= IEXTEN. ;O 87<5=5=8O C?@02;ONI53> A8<2>;0, =5>1E>48<> ?>;CG8BL B5:CI85 B5@<8=0;L=K5 0B@81CBK 2K7>2>< tcgetattr(3C), ?@8A2>8BL B@51C5<><C M;5<5=BC <0AA820 c_cc[] =>2>5 7=0G5=85 8 87<5=8BL 0B@81CBK B5@<8=0;0 2K7>2>< tcsetattr(3C). A;8 7=0G5=85 C?@02;ONI53> A8<2>;0 1C45B _POSIX_VDISABLE, B> DC=:F8O, 0AA>F88@>20==0O A MB8< A8<2>;><, 1C45B 2K:;NG5=0. 5:>B>@K5 D;038 @568<>2 !;54CNI0O AB@0=8F0 ?5@5G8A;O5B =5:>B>@K5 0B@81CBK B5@<8=0;0, :>B>@K5 <>3CB 1KBL 87<5=5=K. $;038, ?5@5G8A;5==K5 2> 2B>@>9 :>;>=:5 B01;8FK, O2;ONBAO A8<2>;L=K<8 :>=AB0=B0<8, >?@545;5==K<8 2 <sys/termios.h>, 8 ?@54AB02;ONB A>1>9 7=0G5=8O >B45;L=KE 18B>2. =0G5=8O D;03>2 E@0=OBAO 2 A;54CNI8E G5BK@5E ?>;OE AB@C:BC@K termios: c_iflag >;5 c_iflag >?8AK205B @568< >1@01>B:8 22>40. A;8 CAB0=>2;5= D;03 IGNBRK, B> ?>A;54>20B5;L=>ABL =C;52KE 18B (break condition, =5:>B>@K5 B5@<8=0;K 8;8 <>45<K B0:8< >1@07>< :>48@CNB @07@K2 ;8=88) 83=>@8@C5BAO, B> 5ABL =5 ?><5I05BAO 2 >G5@54L 22>40 8 =5 <>65B 1KBL AG8B0=> =8 >4=8< ?@>F5AA><. =0G5, 5A;8 CAB0=>2;5= D;03 BRKINT, CA;>285 @07@K20 35=5@8@C5B A83=0; ?@5@K20=8O 8 A1@0AK205B 2E>4=CN 8 2KE>4=CN >G5@548. A;8 CAB0=>2;5= ISTRIP, B> 22>48<K5 A8<2>;K >1@570NBAO 4> 7 18B, 8=0G5 >=8 ?5@540NBAO :0: 8-18B=K5 7=0G5=8O. A;8 CAB0=>2;5= ICRNL, B> A8<2>; CR ?5@52>48BAO 2 A8<2>; NL. A;8 CAB0=>2;5= IXON, @07@5H05BAO AB0@B/AB>?>2>5 C?@02;5=85 2K2>4><. >;CG5=85 !"-A8<2>;0 1C45B 7045@6820BL 2K2>4, 0 !" "-A8<2>; - 2>7>1=>2;O5B 53>. A5 !" "/!"-A8<2>;K 83=>@8@CNBAO 8 =5 G8B0NBAO. A;8 CAB0=>2;5= IXANY, ;N1>9 22545==K9 A8<2>; 1C45B 2>7>1=>2;OBL ?@8>AB0=>2;5==K9 2K2>4. c_oflag >;5 c_oflag A>45@68B D;038, C?@02;ONI85 >1@01>B:>9 2K2>40. A;8 CAB0=>2;5= D;03 OPOST, 2K2>48<K5 A8<2>;K ?>425@30NBAO ?>AB>1@01>B:5 2 A>>B25BAB288 A >AB0;L=K<8 D;030<8, 8=0G5 >=8 ?5@540NBAO 157 87<5=5=89. A;8 CAB0=>2;5= ONLCR, A8<2>; NL ?5@5405BAO :0: ?0@0 CR-NL. TAB3 8 XTABS 7040NB 70<5=C A8<2>;>2 B01C;OF88 ?@>15;0<8. c_cflag >;5 c_cflag C?@02;O5B 0??0@0B=K<8 0B@81CB0<8 B5@<8=0;L=>3> 8=B5@D59A0. 8BK CBAUD 7040NB A:>@>ABL ?5@540G8. 8BK CSIZE 7040NB @07<5@ A8<2>;0 2 18B0E :0: 4;O ?@85<0, B0: 8 4;O ?5@540G8. A;8 CSTOPB CAB0=>2;5=, ?5@540NBAO 420 AB>?>2KE 18B0. $;038 PARENB 8 PARODD C?@02;ONB :>=B@>;5< G5B=>AB8. c_lflag A;8 CAB0=>2;5= ICANON, @07@5H5=0 :0=>=8G5A:0O >1@01>B:0 22>40. >?CA:0NBAO DC=:F88 @540:B8@>20=8O (701>9 8 AB8@0=85 AB@>:8) 8 >1J548=5=85 22>48<KE A8<2>;>2 2 AB@>:8, >3@0=8G5==K5 A8<2>;0<8 NL, EOF, EOL, EOL2. A;8 ICANON =5 CAB0=>2;5=, 40==K5 4;O C4>2;5B2>@5=8O 70?@>A>2 GB5=8O 15@CBAO ?@O<> 87 "AK@>9" >G5@548. 5:0=>=8G5A:0O >1@01>B:0 1C45B >1AC640BLAO 40;55. A;8 CAB0=>2;5= ECHO, =0 :064K9 ?>;CG5==K9 A8<2>; 2K405BAO ME>. A;8 CAB0=>2;5= @568< ICANON, 4>ABC?5= @O4 DC=:F89 C?@02;5=8O ME>. A;8 CAB0=>2;5=K D;038 ECHO 8 ECHOE, 0 ECHOPRT =5 CAB0=>2;5=, ME> 4;O A8<2>;0 701>O 2K405BAO :0: ASCII BS SP BS (A4283 :0@5B:8 =0704 - ?@>15; - A4283 :0@5B:8 =0704), GB> >G8I05B ?>A;54=89 A8<2>; =0 M:@0=5 B5@<8=0;0. A;8 ECHOK CAB0=>2;5=, 0 ECHOKE =5B, B> ?>A;5 A8<2>;0 AB8@0=8O AB@>:8 ?5@5405BAO NL, GB>1K ?>4G5@:=CBL, GB> AB@>:0 1K;0 AB5@B0. !8<2>; ?5@5:;NG5=8O @568<0 (escape), 84CI89 ?5@54 A8<2>;0<8 >G8AB:8 8;8 AB8@0=8O AB@>:8, ;8H05B MB8 A8<2>;K 8E DC=:F88. A;8 CAB0=>2;5= D;03 ISIG, 22>48<K5 A8<2>;K ?@>25@ONBAO =0 A>2?045=85 A A8<2>;0<8 INTR, QUIT, SUSP 8 DSUSP. A;8 22>48<K9 A8<2>; A>>B25BAB2C5B >4=><C 87 =8E, ?>AK;05BAO A>>B25BAB2CNI89 A83=0;. A;8 ISIG =5 CAB0=>2;5=, =5 2K?>;=O5BAO =8:0:>9 ?@>25@:8. A;8 CAB0=>2;5= D;03 IEXTEN, B> =04 2E>4=K<8 40==K<8 1C4CB 2K?>;=OBLAO DC=:F88 87 @0AH8@5==>3> =01>@0, 7028AOI85 >B @50;870F88. -B>B D;03 4>;65= 1KBL CAB0=>2;5= 4;O @0A?>7=020=8O A8<2>;>2 WERASE, REPEINT, DISCARD 8 LNEXT. 0?8@0=85 B5@<8=0;0 - ?@8<5@ -B0 ?@>3@0<<0 70?8@05B B5@<8=0; ?>;L7>20B5;O. =0 70?@0H8205B ?>;L7>20B5;O 225AB8 :;NG. >=5G=>, ?>;L7>20B5;N 1K;> 1K C4>1=55, GB>1K :;NG A>2?040; A 53> ?0@>;5<, => 2 A>2@5<5==KE Unix-A8AB5<0E EMH8 ?0@>;59 4>ABC?=K B>;L:> ?>;L7>20B5;N root, ?>MB><C :;NG =5>1E>48<> 22>48BL ?@8 70?CA:5 ?@>3@0<<K. -E> 2K:;NG5=>, ?>MB><C :;NG =5 1C45B ?>:070= =0 B5@<8=0;5. -B>B 65 :;NG 4>;65= 1KBL 22545=, GB>1K ?>;CG8BL 4>ABC? : B5@<8=0;C. @>3@0<<0 @01>B05B B0:: 9 1JO2;O5B AB@C:BC@C termios 4;O A>E@0=5=8O CAB0=>2>: B5@<8=0;0. 10 1JO2;O5B ?5@5<5==CN tcflag_t 4;O A>E@0=5=8O B5:CI8E 7=0G5=89 c_lflag. 11 1JO2;O5B <0AA82 A8<2>;>2 4;O A>E@0=5=8O 7=0G5=8O ?5@2>3> :;NG0. ;NG <>65B 1KBL >G5=L 4;8==K<, B0: :0: BUFSIZ 8<55B 1>;LH>5 7=0G5=85. 13 @>3@0<<0 ?>;CG05B B5:CI85 CAB0=>2:8 B5@<8=0;0. 5@2K9 ?0@0<5B@ - 45A:@8?B>@ D09;0 AB0=40@B=>3> 22>40, ?>;CG5==K9 <0:@>A>< fileno, >?@545;5==K< 2 <stdio.h>. A;8 stdin ?5@5=07=0G5=, B> ?@>3@0<<0 @01>B0BL =5 1C45B. B>@>9 0@3C<5=B - 04@5A AB@C:BC@K termios. 14 !>E@0=O5BAO 7=0G5=85 ?>;O c_lflag. -B> 7=0G5=85 70B5< 1C45B 8A?>;L7>20=> 4;O 2>AAB0=>2;5=8O A>AB>O=8O B5@<8=0;L=>3> 8=B5@D59A0. 15-16 0?@5I05BAO A@02=5=85 22>40 A C?@02;ONI8<8 A8<2>;0<8 INTR, QUIT, SUSP 8 DSUSP. -E> 2K:;NG05BAO. tcsetattr(3C) 2K7K205BAO A D;03>< TCSAFLUSH 4;O 87<5=5=8O A>AB>O=8O B5@<8=0;L=>3> 8=B5@D59A0 8 A1@>A0 2A5E 22545==KE A8<2>;>2. 17 0?><8=05BAO :;NG, :>B>@K9 ?>74=55 1C45B 8A?>;L7>20= 4;O >B?8@0=8O B5@<8=0;0. 18-25 ;O B>3>, GB>1K 2K9B8 87 MB>3> F8:;0, ?@>3@0<<0 4>;6=0 ?>;CG8BL 7=0G5=85, A>2?040NI55 A> 7=0G5=85< 8AE>4=>3> :;NG0. A;8 :;NG8 A>2?040NB, B5@<8=0;L=K9 8=B5@D59A 2>72@0I05BAO 2 8AE>4=>5 A>AB>O=85. -B> =5 45;05BAO 02B><0B8G5A:8 ?@8 7025@H5=88 ?@>3@0<<K. A;8 ?@>3@0<<0 7025@H8BAO =5=>@<0;L=>, B5@<8=0; <>65B >AB0BLAO 2 AB@0==>< A>AB>O=88. 28 -B0 DC=:F8O 2>72@0I05B C:070B5;L =0 AB@>:C A8<2>;>2, :>B>@0O A>45@68B :;NG, 22545==K9 ?>;L7>20B5;5<. 30 1JO2;O5BAO <0AA82 A8<2>;>2 4;O A>E@0=5=8O 7=0G5=8O :;NG0. = >1JO2;5= :0: static, 8 C:070B5;L =0 MB>B <0AA82 1C45B 2>72@0I5= DC=:F859. 32 K405BAO ?@83;0H5=85 33 5@2K9 A8<2>; 2 <0AA825 line[] CAB0=02;8205BAO 2 =52>7<>6=>5 7=0G5=85. ;O G53> MB> =C6=>? B25B: A;8 getkey() 1K; 2K720= 2> 2B>@>9 @07, 8 1K; 22545= B>;L:> EOF, =5 1C45B AG8B0=> =8 >4=>3> A8<2>;0; A>45@68<>5 line[] 1C45B B5< 65, GB> 8 @0=LH5, 8 2>72@0I5==0O AB@>:0 A>2?045B A> 7=0G5=85<, ?>;CG5==K< >B ?5@2>3> 2K7>20 MB>9 DC=:F88, GB> A>25@H5==> =5?@028;L=>. 34 !B@>:0 22>40 AG8BK205BAO 157 ME>. 5 45;05BAO ?@>25@:8 =0 A>2?045=85 A C?@02;ONI8<8 A8<2>;0<8, B0:8<8 :0: INTR, QUIT 8 B.4. -B8 A8<2>;K >1@010BK20NBAO B0: 65, :0: >1KG=K5. $09;: termlock.c   "  -    1 #include <string.h> 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <termios.h> 5 static char *getkey(void); 6 7 main() /* lock the terminal */ 8 { 9 struct termios tty; 10 tcflag_t savflags; 11 char key[BUFSIZ]; 12 13 tcgetattr(fileno(stdin), &tty); 14 savflags = tty.c_lflag; 15 tty.c_lflag &= ~(ISIG | ECHO); 16 tcsetattr(fileno(stdin), TCSAFLUSH, &tty); 17 strcpy(key, getkey()); 18 for (;;) { 19 if (strcmp(key, getkey()) == 0){ 20 tty.c_lflag = savflags; 21 tcsetattr(fileno(stdin), TCSAFLUSH, &tty); 22 break; 23 } 24 fprintf(stderr,"incorrect key try again.\n"); 25 } 26 } 27 28 static char *getkey(void) /* prompt user for key */ 29 { 30 static char line[BUFSIZ]; 31 32 fputs("Key: ", stderr); 33 line[0] = '\377'; /*change first char for EOF to fgets*/ 34 fgets(line, BUFSIZ, stdin); 35 fputs("\n", stderr); 36 return(line); 37 } 5:0=>=8G5A:89 22>4  >1KG=>< (:0=>=8G5A:><) @568<5 A8<2>;K A>18@0NBAO 2<5AB5, ?>:0 =5 1C45B 22545=0 ?>;=0O AB@>:0, 7025@H5==0O A8<2>;>< NL. ">;L:> ?>A;5 MB>3> 2K7>2 read(2) 2>72@0I05B C?@02;5=85, 4065 5A;8 >= 70?@0H820; B>;L:> >48= A8<2>;. >72@0I5==>5 2K7>2>< read(2) 7=0G5=85 ?>:07K205B :>;8G5AB2> A8<2>;>2, :>B>@K5 1K;8 ?@>G8B0=K =0 A0<>< 45;5 4> 22>40 NL. 4=0:> 2 =5:>B>@KE ?@8:;04=KE ?@>3@0<<0E, B0:8E, :0: >1@01>B:0 M:@0==KE D>@< 8;8 ?>;=>M:@0==KE @540:B>@0E, "AB@>:8" 22>40 =5 8<5NB A<KA;0. 0?@8<5@, MB8 ?@>3@0<<K <>3CB B@51>20BL A8<2>;K ?> <5@5 8E 22>40 A :;0280BC@K. A;8 >G8AB8BL D;03 ICANON 2 c_iflag, 22>48<K5 A8<2>;K =5 1C4CB A>18@0BLAO 2 AB@>:8 8 read(2) 1C45B G8B0BL 8E ?> <5@5 22>40. 0@0<5B@K MIN 8 TIME >?@545;ONB CA;>28O, ?@8 :>B>@KE 1C45B C4>2;5B2>@5= 70?@>A read(2). MIN >?@545;O5B <8=8<0;L=>5 :>;8G5AB2> A8<2>;>2, :>B>@K5 4>;6=K 1KBL ?>;CG5=K. TIME ?@54AB02;O5B A>1>9 B09<5@ A :20=B>< 2@5<5=8 0.1 A5:C=4K, :>B>@K9 A1@0AK205BAO ?@8 22>45 :064>3> A8<2>;0. "0:8< >1@07><, TIME :>48@C5B =5 >1I55 2@5<O 22>40 AB@>:8, 0 <56A8<2>;L=K9 8=B5@20;. -B> A45;0=> 4;O C?@>I5=8O AG8BK20=8O B5@<8=0;L=KE :>4>2 @0AH8@5=8O, 254L B5@<8=0;K ?5@540NB ?>A;54>20B5;L=K5 A8<2>;K :>40 1KAB@55, G5< >1KG=K9 G5;>25: <>65B =068<0BL :;028H8.. !8<2>;K EOF 8 EOL 2 =5:0=>=8G5A:>< @568<5 =5 8A?>;L7CNBAO, ?>MB><C MB8 ?>78F88 2 <0AA825 c_cc[] 8A?>;L7CNBAO 4;O MIN 8 TIME A>>B25BAB25==>. 865 >?8A0=K G5BK@5 2>7<>6=KE A>G5B0=8O 7=0G5=89 MIN 8 TIME: MIN > 0, TIME > 0.  MB>< A;CG05, TIME A;C68B 4;O 87<5@5=8O 2@5<5=8 <564C 22>4>< >48=>G=KE A8<2>;>2 8 AB0@BC5B ?>A;5 ?>;CG5=8O ?5@2>3> A8<2>;0. !G5BG8: 2@5<5=8 A1@0AK205BAO ?>A;5 :064>3> >G5@54=>3> A8<2>;0. A;8 4> 8AB5G5=8O 8=B5@20;0 2@5<5=8 1C45B ?>;CG5=> MIN A8<2>;>2, 70?@>A read(2) C4>2;5B2>@O5BAO. A;8, =0>1>@>B, 2@5<O 8AB5:05B @0=LH5, G5< 1K;> AG8B0=> MIN A8<2>;>2, B> 2A5 22545==K5 4> MB>3> <><5=B0 A8<2>;K 2>72@0I0NBAO ?>;L7>20B5;N. 0<5G0=85: 5A;8 TIME 8AB5:;>, B> 1C45B 2>72@0I5= ?> :@09=59 <5@5 >48= A8<2>;. A;8 MIN @025= 1, 7=0G5=85 TIME =5 83@05B @>;8. MIN > 0, TIME = 0 A;8 7=0G5=85 TIME @02=> =C;N, B09<5@ =5 8A?>;L7C5BAO. <55B 7=0G5=85 B>;L:> MIN.  MB>< A;CG05 70?@>A read(2) C4>2;5B2>@O5BAO B>;L:> B>340, :>340 ?>;CG5=K MIN A8<2>;>2. MIN = 0, TIME > 0 A;8 MIN @025= =C;N, TIME 1>;LH5 =5 O2;O5BAO AG5BG8:>< <56A8<2>;L=>3> 2@5<5=8. "5?5@L B09<5@ 0:B82878@C5BAO ?@8 >1@01>B:5 A8AB5<=>3> 2K7>20 read(2). 0?@>A read(2) C4>2;5B2>@O5BAO :>340 ?>ABC?8; E>BO 1K >48= A8<2>; 8;8 8AB5:;> 2@5<O. A;8 2 B5G5=88 TIME*0.1 A5:C=4 ?>A;5 =0G0;0 GB5=8O =5 ?>ABC?8;> =8 >4=>3> A8<2>;0, 70?@>A 2>72@0I05B C?@02;5=85 A =C;52K< :>;8G5AB2>< ?@>G8B0==KE A8<2>;>2. MIN = 0, TIME = 0  MB>< A;CG05, read(2) 2>72@0I05B C?@02;5=85 =5<54;5==>. >72@0I05BAO <8=8<C< 87 70?@>H5==>3> 8 8<5NI53>AO =0 40==K9 <><5=B 2 1CD5@5 :>;8G5AB20 A8<2>;>2, 157 >6840=8O 22>40 4>?>;=8B5;L=KE A8<2>;>2. ;0280BC@=K9 B@5=065@ - @8<5@ -B0 ?@>3@0<<0 <>65B A;C68BL 2 :0G5AB25 :;0280BC@=>3> B@5=065@0 8 O2;O5BAO ?@8<5@>< =5:0=>=8G5A:>3> 22>40. =0 2K2>48B =0 M:@0= AB@>:C B5:AB0, 8 ?>;L7>20B5;L 4>;65= =0?5G0B0BL 55. !8<2>;K ?> <5@5 22>40 ?@>25@ONBAO. A;8 22545= =5?@028;L=K9 A8<2>;, ?@>3@0<<0 87405B 72C:>2>9 A83=0; 8 ?5G0B05B 72574>G:C. A;8 22545= ?@028;L=K9 A8<2>;, >= 2K2>48BAO =0 M:@0=. @>3@0<<0 @01>B05B B0:: 15-20 "5@<8=0;L=K9 A?5F80;L=K9 D09; >B:@K205BAO 4;O GB5=8O, 8 53> B5:CI89 @568< 70?8AK205BAO 2 AB@C:BC@C termios. 81;8>B5G=0O DC=:F8O isatty(3F) ?@>25@O5B, A2O70= ;8 D09;>2K9 45A:@8?B>@ 1 A B5@<8=0;><. =K<8 A;>20<8, MB0 ?@>3@0<<0 =5 4>;6=0 8A?>;=OBLAO A 8A?>;L7>20=85< ?5@5=0?@02;5=8O AB0=40@B=>3> 22>40/2K2>40 shell. $C=:F8O isatty >?8A0=0 =0 AB@0=8F5 @C:>2>4AB20 ttyname(3F). 22-24 "5@<8=0;L=K9 8=B5@D59A ?5@52>48BAO 2 @568< =5:0=>=8G5A:>3> 22>40 157 ME> 8 157 >1@01>B:8 A?5F80;L=KE A8<2>;>2. 25 K7>2>< AB0=40@B=>9 181;8>B5G=>9 DC=:F88 setbuf(3) 70?@5I05BAO ;>:0;L=0O 1CD5@870F8O 2 181;8>B5G=KE DC=:F8OE 2K2>40. -B> ?@82>48B : B><C, GB> putchar(3) 2 A;54CNI8E AB@>:0E 1C45B =5<54;5==> 2K7K20BL write(2) 2 AB0=40@B=K9 2K2>4. 28-37 -B>B F8:; G8B05B ?> >4=><C A8<2>;C 8 A@02=8205B 53> A A>>B25BAB2CNI8< A8<2>;>< AB@>:8 text. A;8 A8<2>; 22545= ?@028;L=>, >= =5<54;5==> 2K2>48BAO =0 B5@<8=0;. =0G5 87405BAO 72C:>2>9 A83=0; 8 =0 B5@<8=0; 2K2>48BAO 72574>G:0. 865 ?@82545= ?@8<5@ @01>BK ?@>3@0<<K: $ typtut Type in beneath the following line The quick brown fox jumped over the lazy dog's back The *uick b*own f** jumped over t*e lazy dog's back number of errors: 5 $09;: typtut.c "# + "   -    '!  1 #include <unistd.h> 2 #include <stdio.h> 3 #include <fcntl.h> 4 #include <termios.h> 5 #include <string.h> 6 #include <stdlib.h> 7 8 main() 9 { 10 char ch, *text = 11 "The quick brown fox jumped over the lazy dog\'s back"; 12 int fd, i, errors = 0, len; 13 struct termios tty, savtty; 14 15 fd = open("/dev/tty", O_RDONLY); 16 tcgetattr(fd, &tty); 17 if (isatty(fileno(stdout)) == 0) { 18 fprintf(stderr,"stdout not terminal\n"); 19 exit(1); 20 } 21 savtty = tty; 22 tty.c_lflag &= ~(ISIG | ICANON | ECHO); 23 tty.c_cc[VMIN] = 1; /* MIN */ 24 tcsetattr(fd, TCSAFLUSH, &tty); 25 setbuf(stdout, (char *) NULL); 26 printf("Type beneath the following line\n\n%s\n", text); 27 len = strlen(text); 28 for (i = 0; i < len; i++) { 29 read(fd, &ch, 1); 30 if (ch == text[i]) 31 putchar(ch); 32 else { 33 putchar('\07'); 34 putchar('*'); 35 errors++; 36 } 37 } 38 tcsetattr(fd, TCSAFLUSH, &savtty); 39 printf("\n\nnumber of errors: %d\n", errors); 40 } @>3@0<<0 ?@>A<>B@0 D09;0 - @8<5@ -B0 ?@>3@0<<0 <>65B 8A?>;L7>20BLAO 4;O ?@>A<>B@0 D09;0 =0 B5@<8=0;5 8 A;C68B 4@C38< ?@8<5@>< =5:0=>=8G5A:>3> 22>40. =0 A;C68B 0;LB5@=0B82>9 CTRL-S 8 CTRL-Q, :>B>@K5, A>>B25BAB25==>, 7045@6820NB 8 2>7>1=>2;ONB 2K2>4.  MB>9 ?@>3@0<<5 ;N10O :;028H0 ?@8>AB0=02;8205B 8;8 2>7>1=>2;O5B 2K2>4 =0 B5@<8=0;. 0?@8<5@, ?@>15; <>65B 8A?>;L7>20BLAO :0: ?5@5:;NG0B5;L. -B>B MDD5:B 4>AB8305BAO 87<5=5=85< 7=0G5=8O MIN <564C =C;5< 8 548=8F59. -B0 ?@>3@0<<0 @01>B05B B0:: 13-16 !B0=40@B=0O 181;8>B5G=0O DC=:F8O fopen(3) >B:@K205B D09; 4;O ?@>A<>B@0. 17 !G8BK205BAO B5:CI89 @568< B5@<8=0;L=>3> 8=B5@D59A0. 18 -B>B @568< A>E@0=O5BAO. >74=55 >= 1C45B 8A?>;L7>20BLAO 4;O 2>AAB0=>2;5=8O A>AB>O=8O B5@<8=0;L=>3> 8=B5@D59A0. 19-22 "5@<8=0;L=K9 8=B5@D59A ?5@5:;NG05BAO 2 @568< =5:0=>=8G5A:>3> 22>40. @><5 B>3>, INTR, QUIT 8 >AB0;L=K5 C?@02;ONI85 A8<2>;K =5 0=0;878@CNBAO 8 ME> 2K:;NG5=>. 'B5=85 A B5@<8=0;0 1C45B >6840BL 2 B5G5=88 0.1 A5:C=4K, ?>B><C GB> MIN @025= =C;N, 0 TIME @025= 1. 24-33 -B>B F8:; AG8BK205B AB@>:8 87 D09;0 8 2K2>48B 8E =0 B5@<8=0;. 25 read(2) ?KB05BAO AG8B0BL A B5@<8=0;0 >48= A8<2>;. "0: :0: GB5=85 2>72@0I05B C?@02;5=85 =5<54;5==> (157 >6840=8O), A8<2>; 1C45B ?@>G8B0=, B>;L:> 5A;8 >= 1K; 22545= 4> 2K7>20 read(2). 5?@>G8B0==K5 A8<2>;K =0:0?;820NBAO 2 1CD5@5. A;8 AG8B0= A8<2>;, read(2) 2>72@0I05B 1 8 8A?>;=ONBAO >?5@0B>@K 27-31. A;8 =5 ?@>G8B0=> =8 >4=>3> A8<2>;0,read(2) 2>72@0I05B 0. -B> =07K205BAO >?@>A>< 22>40 A B5@<8=0;0. 26-27 MIN CAB0=>2;5= 2 548=8FC, B0: GB> 70?@>AK GB5=8O A B5@<8=0;0 1C4CB 640BL 22>40. 28 0: B>;L:> A8<2>; 22545=, 70?@>A read(2) C4>2;5B2>@O5BAO 8 2>72@0I05B C?@02;5=85. 29-30 'B5=85 A B5@<8=0;0 A=>20 ?5@52>48BAO 2 @568< >?@>A0. 34 >AAB0=02;8205BAO 8AE>4=K9 @568< @01>BK B5@<8=0;0. >A;5 =060B8O :;028H8 4;O ?@8>AB0=>2:8 2K2>40 2>7=8:05B =51>;LH0O 7045@6:0, 2> 2@5<O :>B>@>9 2K2>48BAO =5A:>;L:> ;8H=8E AB@>:. -B> A2O70=> A 1CD5@870F859 2K2>40 8 =87:>9 A:>@>ABLN @01>BK B5@<8=0;0. 0: <>6=> ?@5:@0B8BL ?@>A<>B@ 4;8==>3> D09;0? 0?@8<5@, ?>A;5 GB5=8O 2 AB@>:5 25, <K <>65< ?@>25@OBL A8<2>; =0 @025=AB2> 1C:25 q (quit). A;8 1K; 22545= MB>B A8<2>;, ?@>3@0<<0 2KE>48B 87 F8:;0. >6=> 4065 8A?>;L7>20BL A8<2>; DEL, B0: :0: >= G8B05BAO =0@02=5 A >AB0;L=K<8A8<2>;0<8. $09;: lister.c     !"  $ -    '!  1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <fcntl.h> 5 #include <termios.h> 6 7 main(int argc, char *argv[]) 8 { 9 struct termios tty, savtty; 10 char ch, line[BUFSIZ]; 11 FILE *fp; 12 13 if ((fp = fopen(argv[1], "r")) == NULL) { 14 printf("Cannot open %s\n", argv[1]); 15 exit(1); 16 } 17 tcgetattr(fileno(stdin), &tty); 18 savtty = tty; 19 tty.c_lflag &= ~(ISIG | ICANON | ECHO); 20 tty.c_cc[VMIN] = 0; /* no characters */ 21 tty.c_cc[VTIME] = 1; /* wait for 100 msec */ 22 tcsetattr(fileno(stdin), TCSANOW, &tty); 23 24 while (fgets(line, BUFSIZ, fp) != NULL) { 25 if (read(fileno(stdin), &ch, 1) == 1) { 26 tty.c_cc[VMIN] = 1; /* one char */ 27 tcsetattr(fileno(stdin), TCSANOW, &tty); 28 read(fileno(stdin), &ch, 1); 29 tty.c_cc[VMIN] = 0; /* no chars */ 30 tcsetattr(fileno(stdin), TCSANOW, &tty); 31 } 32 fputs(line, stdout); 33 } 34 tcsetattr(fileno(stdin), TCSANOW, &savtty); 35 fclose(fp); 36 } 5@540G0 42>8G=>3> D09;0 - @8<5@ 0 A;54CNI59 AB@0=8F5 ?@82545=K ?>4?@>3@0<<K 4;O CAB0=>2:8 B5@<8=0;L=>3> 8=B5@D59A0 2 @568< 22>40/2K2>40 =5>1@01>B0==KE 40==KE ("AK@>9") 8 2>AAB0=>2;5=8O 8AE>4=>3> @568<0. -B8 ?>4?@>3@0<<K @01>B0NBB0:: 8 fd ?@8A208205BAO 0 8;8 1, 5A;8 setrawio 2K7K205BAO ?>;CG0B5;5< (recv) 8;8 ?5@540BG8:>< (xmit), A>>B25BAB25==>. 10-11 A;8 45A:@8?B>@ D09;0 0 8;8 1 =5 0AA>F88@>20= A B5@<8=0;L=K< A?5F80;L=K< D09;><, MB0 DC=:F8O 2>72@0I05B C?@02;5=85 =5<54;5==>. -B> ?>72>;O5B ?@>3@0<<5, 8A?>;L7CNI59 setrawio, ?5@5=0?@028BL A2>9 AB0=40@B=K9 22>4/2K2>4 2 D09; 8;8 ?@>3@0<<=K9 :0=0; (2 MB>< A;CG05, setrawio 2>>1I5 =5 =C65=). A;8 65 45A:@8?B>@ 0AA>F88@>20= A B5@<8=0;L=K< A?5F80;L=K< D09;><, B> @568< 8=B5@D59A0 ?5@5:;NG05BAO =0 "AK@>9" 22>4/2K2>4. 12-15 ;O 7040==>3> 45A:@8?B>@0 D09;0 AG8BK205BAO 7=0G5=85 AB@C:BC@K termios. 16 >?8O AB@C:BC@K termios A>E@0=O5BAO 4;O 2>AAB0=>2;5=8O @568<0 B5@<8=0;L=>3> 8=B5@D59A0, :>B>@K9 1K; 4> 2K7>20 setrawio. 17-22 $;038 2 AB@C:BC@5 termios CAB0=02;820NBAO 4;O ?@85<0 8 ?5@540G8 ?@>872>;L=KE 2>AL<818B=KE 40==KE. !@570=85 AB0@H53> 18B0, >B>1@065=85 22>48<KE A8<2>;>2 8 C?@02;5=85 ?>B>:>< 22>40 2K:;NG5=K. 07<5@ A8<2>;0 CAB0=>2;5= @02=K< 2>AL<8 18B0<, 8 2K:;NG5= :>=B@>;L G5B=>AB8. >8A: A?5F80;L=KE C?@02;ONI8E A8<2>;>2, :0=>=8G5A:89 22>4 8 ME> 2 ?>;5 D;03>2 ;>:0;L=>3> @568<0 B0:65 2K:;NG5=K. 0<5BLB5, GB> MB0 DC=:F8O >4=0 8 B0 65 :0: 4;O 22>40, B0: 8 4;O 2K2>40, B0: :0: CAB0=>2:8 D;03>2 4;O 22>40 =5 2;8ONB =0 2K2>4, 8 =0>1>@>B. 23-24 ;O =5:0=>=8G5A:>3> 22>40 MIN CAB0=02;8205BAO @02=K< @07<5@C 1CD5@0 22>40, 8A?>;L7C5<>3> 2 2K7>25 read(2). "09<5@ =5 8A?>;L7C5BAO, ?>MB><C TIME CAB0=02;8205BAO 2 =>;L. 25 568< B5@<8=0;L=>3> 8=B5@D59A0 1C45B 87<5=5= ?>A;5 B>3>, :0: 25AL 2K2>4 1C45B ?5@540=, 0 22>4 - A1@>H5=. 32 "5@<8=0;L=K9 8=B5@D59A 2>72@0I05BAO 2 B> A>AB>O=85, 2 :>B>@>< >= =0E>48;AO 4> 2K7>20 DC=:F88 setrawio. $09;: setrawio.c  ' ' $ -    setrawio.c 1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <termios.h> 4 #include "xmit.h" 5 6 static struct termios tty, savtty; 7 8 void setrawio(int fd) /* set "raw" input/output modes */ 9 { 10 if (!isatty(fd)) 11 return; 12 if (tcgetattr(fd, &tty) == -1) { 13 perror("tcgetattr"); 14 exit(2); 15 } 16 savtty= tty; 17 tty.c_iflag &= ~(BRKINT | ISTRIP | INLCR | ICRNL 18 | IUCLC | IXON); 19 tty.c_oflag &= ~OPOST; 20 tty.c_cflag |= CS8; 21 tty.c_cflag &= ~PARENB; 22 tty.c_lflag &= ~(ISIG | ICANON | ECHO); 23 tty.c_cc[VMIN] = BLOCKSIZE; /* MIN */ 24 tty.c_cc[VTIME] = 0; /* TIME */ 25 tcsetattr(fd, TCSAFLUSH, &tty); 26 } 27 28 void restorio(int fd) /* restore terminal modes */ 29 { 30 if (!isatty(fd)) 31 return; 32 tcsetattr(fd, TCSAFLUSH, &savtty); 33 } !5AA88 8 3@C??K ?@>F5AA>2 A5 ?@>F5AAK >1J548=5=K 2 A5AA88. @>F5AAK, ?@8=04;560I85 : >4=>9 A5AA88, >?@545;ONBAO >1I8< 845=B8D8:0B>@>< A5AA88 (sid). 845@ A5AA88 - MB> ?@>F5AA, :>B>@K9 A>740; A5AA8N 2K7>2>< setsid(2). 45=B8D8:0B>@ ?@>F5AA0 ;845@0 A5AA88 A>2?0405B A 53> sid. !5AA8O <>65B 2K45;8BL A515 C?@02;ONI89 B5@<8=0; 4;O B>3>, GB>1K 40BL ?>;L7>20B5;N 2>7<>6=>ABL C?@02;OBL 8A?>;=5=85< 7040=89 (3@C?? ?@>F5AA>2) 2=CB@8 A5AA88. @8 2E>45 2 A8AB5<C A>7405BAO A5AA8O, :>B>@0O 8<55B 845=B8D8:0B>@ A5AA88, @02=K9 845=B8D8:0B>@C ?@>F5AA0 20H53> 2E>4=>3> shell'0. "0:65, ?@8 >B:@KB88 :064>3> >:=0 xterm(1) 8;8 70:;04:8 gnome-terminal(1), A>7405BAO A5AA8O, 845=B8D8:0B>@ :>B>@>9 A>2?0405B A 845=B8D8:0B>@>< 4>G5@=53> ?@>F5AA0, 70?CI5==>3> B5@<8=0;L=K< M<C;OB>@><. A;8 20H :><0=4=K9 ?@>F5AA>@ =5 ?@54>AB02;O5B C?@02;5=8O 7040=8O<8, 2A5 ?@>F5AAK 2 20H59 A5AA88 O2;ONBAO B0:65 G;5=0<8 548=AB25==>9 2 MB>9 A5AA88 3@C??K ?@>F5AA>2, :>B>@0O 1K;0 A>740=0 2K7>2>< setsid(2).  MB>< A;CG05, DC=:F8>=0;L=>ABL A5AA88 A>2?0405B A DC=:F8>=0;L=>ABLN 3@C??K ?@>F5AA>2.  :><0=4=>< ?@>F5AA>@5, ?@54>AB02;ONI5< C?@02;5=85 7040=8O<8 (ksh(1), jsh(1), bash(1)), C?@02;ONI89 B5@<8=0; A>2<5AB=> 8A?>;L7C5BAO =5A:>;L:8<8 3@C??0<8 ?@>F5AA>2, B0: :0: 4;O :064>9 :><0=4K, 70?CI5==>9 A C?@02;ONI53> B5@<8=0;0, A>7405BAO A2>O 3@C??0 ?@>F5AA>2. ><0=4=K9 ?@>F5AA>@ =07K205B B0:85 :><0=4K 7040=8O<8 (jobs). 4=>2@5<5==> @01>B0NI85 7040=8O 845=B8D8F8@CNBAO =><5@0<8, >1KG=> A>2?040NI8<8 A ?>@O4:>< 8E 70?CA:0. 0640O 3@C??0 ?@>F5AA>2 8<55B ;845@0 - ?@>F5AA, 845=B8D8:0B>@ :>B>@>3> A>2?0405B A 845=B8D8:0B>@>< 3@C??K ?@>F5AA>2. #?@02;ONI89 B5@<8=0; 2K45;O5B >4=C 87 3@C?? ?@>F5AA>2 2 A5AA88, :0: 3@C??C >A=>2=KE ?@>F5AA>2 (?@>F5AA>2 ?5@2>3> ?;0=0). A5 >AB0;L=K5 ?@>F5AAK 2 A5AA88 ?@8=04;560B : 3@C??0< D>=>2KE ?@>F5AA>2. @C??0 ?@>F5AA>2 ?5@2>3> ?;0=0 ?>;CG05B A83=0;K, ?>A;0==K5 A B5@<8=0;0. > C<>;G0=8N, 3@C??0 ?@>F5AA>2, A2O70==0O A ?@>F5AA><, :>B>@K9 2K45;8; A515 C?@02;ONI89 B5@<8=0;, 87=0G0;L=> AB0=>28BAO 3@C??>9 >A=>2=KE ?@>F5AA>2. @><5 B>3>, 5A;8 ?@>F5AA 87 D>=>2>9 3@C??K ?KB05BAO G8B0BL A B5@<8=0;0 8;8 2K2>48BL =0 =53> 40==K5, >= ?>;CG05B A83=0;, A>>B25BAB25==>, SIGTTIN 8;8 SIGTTOUT. 10 MB8 A83=0;0 ?@82>4OB : >AB0=>2:5 A>>B25BAB2CNI53> ?@>F5AA0. Shell ?@8 MB>< 2K2>48B A>>1I5=85 [8<O ?@>3@0<<K] stopped: tty input. ;O ?@>4>;65=8O 8A?>;=5=8O B0:>9 ?@>3@0<<K =5>1E>48<> ?5@525AB8 A>>B25BAB2CNICN 3@C??C ?@>F5AA>2 =0 ?5@2K9 ?;0= :><0=4>9 fg. 1KG=K5 :><0=4K 70?CA:0NBAO :0: 7040=8O ?5@2>3> ?;0=0. Shell >68405B 7025@H5=8O ;845@0 3@C??K MB>3> 7040=8O 8 2K405B ?@83;0H5=85 B>;L:> ?>A;5 53> 7025@H5=8O. A;8 2 :>=F5 :><0=4K AB>8B A8<2>; &, shell 70?CA:05B B0:CN :><0=4C :0: D>=>2>5 7040=85 8 =5 4>68405BAO 55 7025@H5=8O. A;8 ?>;L7>20B5;L 2> 2@5<O @01>BK :><0=4K ?5@2>3> ?;0=0 22545B A8<2>; VSUSP (Ctrl-Z), 3@C??0 ?>;CG05B A83=0; SIGTSTP 8 >AB0=02;8205BAO, 0 shell 2K405B ?@83;0H5=85. >;L7>20B5;L <>65B 25@=CBLAO : 2708<>459AB28N A MB>9 3@C??>9 ?@>F5AA>2, 2254O :><0=4C fg, 8;8 ?@>4>;68BL 5Q 8A?>;=5=85 2 D>=5 :><0=4>9 bg. A;8 ?>;L7>20B5;L 8<55B =5A:>;L:> ?@8>AB0=>2;5==KE 8;8 D>=>2KE 7040=89, >= <>65B 2K18@0BL <564C =8<8, 845=B8D8F8@CO 8E ?> =><5@0<. "0:, ?5@5:;NG5=85 =0 7040=85 3 45;05BAO :><0=4>9 fg %3. K25AB8 A?8A>: 7040=89, 8E =><5@0 8 A>AB>O=8O <>6=> :><0=4>9 jobs. "0:65, 2AB@>5==0O :><0=40 kill C shell'>2 A C?@02;5=85< 7040=8O<8, <>65B ?@8=8<0BL =><5@ 7040=8O 2<5AB> =><5@0 ?@>F5AA0; ?@8 MB>< A83=0; 1C45B ?>A;0= 2A5< ?@>F5AA0< A>>B25BAB2CNI59 3@C??K. >;CG5=85/CAB0=>2:0 845=B8D8:0B>@0 A5AA88 064K9 ?@>F5AA ?@8=04;568B : A5AA88 8 3@C??5 ?@>F5AA>2. !5AA8O A>7405BAO 4;O 20A, :>340 2K 2E>48B5 2 A8AB5<C. 5@2K9 B5@<8=0;, >B:@KBK9 ;845@>< A5AA88, :>B>@K9 =5 1K; C65 0AA>F88@>20= A 4@C3>9 A5AA859, AB0=>28BAO C?@02;ONI8< B5@<8=0;>< 4;O MB>9 A5AA88. A;8 ?@8 >B:@KB88 B5@<8=0;0 ;845@ A5AA88 C:065B D;03 NOCTTY, B5@<8=0; =5 AB0=5B C?@02;ONI8<. -B> ?>72>;O5B ?@>F5AA0<-45<>=0< 2K2>48BL A>>1I5=8O =0 A8AB5<=CN :>=A>;L. #?@02;ONI89 B5@<8=0; 35=5@8@C5B A83=0;K 7025@H5=8O 8 ?@5@K20=8O (quit 8 interrupt), 0 B0:65 A83=0;K C?@02;5=8O 7040=8O<8. #?@02;ONI8< B5@<8=0;>< 4;O 20H53> shell'0 O2;O5BAO B>B B5@<8=0;, A :>B>@>3> 2K 2>H;8 2 A8AB5<C. #?@02;ONI89 B5@<8=0; =0A;54C5BAO ?@>F5AA><, ?>@>645==K< ?@8 ?><>I8 fork(2). @>F5AA <>65B @07>@20BL A2O7L A> A2>8< C?@02;ONI8< B5@<8=0;><, A>7402 =>2CN A5AA8N A 8A?>;L7>20=85< setsid(2). A;8 A5AA8O B0: 8 =5 >B:@>5B C?@02;ONI89 B5@<8=0;, A>>B25BAB2CNI89 ?@>F5AA 1C45B =07K20BLAO 45<>=>< (daemon). >;LH8=AB2> A8AB5<=KE A5@28A=KE ?@>F5AA>2, B0:8E, :0: init(1M), svc.startd(1M) crond(1M) 8;8 A5B52KE A5@28A>2, B0:8E, :0: sshd(1M), 70?CA:0NBAO :0: 45<>=K. =>340 45<>=0<8 =07K20NB B0:65 A8AB5<=K5 ?@>F5AAK ttymon(1M), >1A;C6820NI85 B5@<8=0;L=K5 ?>@BK, E>BO MB8 ?@>F5AAK 8<5NB C?@02;ONI85 B5@<8=0;K. A;8 2K7K20NI89 ?@>F5AA =5 O2;O5BAO C65 ;845@>< 3@C??K ?@>F5AA>2, setsid(2) CAB0=02;8205B 845=B8D8:0B>@K 3@C??K ?@>F5AA>2 8 A5AA88 2K7K20NI53> ?@>F5AA0 @02=K<8 53> 845=B8D8:0B>@C ?@>F5AA0 8 >BA>548=O5B 53> >B C?@02;ONI53> B5@<8=0;0. setsid(2) A>7405B =>2CN A5AA8N, ?@52@0I0O 2K7202H89 ?@>F5AA 2 ;845@0 MB>9 A5AA88. >2K5 A5AA88 A>740NBAO GB>1K: 1. >BA>548=8BL 2K7202H89 ?@>F5AA >B B5@<8=0;0, B0: GB> MB>B ?@>F5AA =5 1C45B ?>;CG0BL >B MB>3> B5@<8=0;0 A83=0;K SIGHUP, SIGINT 8 A83=0;K C?@02;5=8O 7040=8O<8. 2. ?>72>;8BL ?@>F5AAC =07=0G8BL =>2K9 C?@02;ONI89 B5@<8=0;. ">;L:> ;845@ A5AA88 <>65B =07=0G8BL C?@02;ONI89 B5@<8=0;. 0?@8<5@, ttymon A>7405B =>2CN A5AA8N 8, B0:8< >1@07><, =07=0G05B C?@02;ONI89 B5@<8=0;, :>340 ?>;L7>20B5;L 2E>48B 2 A8AB5<C. getsid(2) 2>72@0I05B 845=B8D8:0B>@ A5AA88 ?@>F5AA0 A 845=B8D8:0B>@><, @02=K< pid. A;8 pid @025= =C;N, getsid(2) 2>72@0I05B 845=B8D8:0B>@ A5AA88 2K7202H53> ?@>F5AA0. >;CG5=85/CAB0=>2:0 845=B8D8:0B>@0 3@C??K ?@>F5AA>2 #AB0=>28BL 845=B8D8:0B>@ 3@C??K ?@>F5AA>2 - @8<5@ -B>B ?@8<5@ ?>:07K205B, :0: A>740BL 3@C??C ?@>F5AA>2, 8A?>;L7CO setpgid(2). !>740NBAO B@8 ?>4?@>F5AA0, 8 :064K9 @0A?5G0BK205B 7=0G5=85 A2>53> 845=B8D8:0B>@0 3@C??K ?@>F5AA>2. @8<5@ 45<>=AB@8@C5BAO B0:: $ setpgid [6426] Original process group id: 179 [6426] New process group id: 6426 [6427] Process group id: 6426 [6428] Process group id: 6426 [6429] Process group id: 6426 -B0 2K40G0 ?@54?>;0305B, GB> ?@>3@0<<0 70?CI5=0 87 sh. N1>9 ?@>F5AA, 70?CI5==K9 A C?@02;ONI53> B5@<8=0;0, ?@8=04;568B >A=>2=>9 3@C??5. "0:8< >1@07><, ?@>F5AA 87=0G0;L=> ?@8=04;568B : 3@C??5 >A=>2=KE ?@>F5AA>2. 0B5<, 2 AB@>:5 14, >= AB0=>28BAO ;845@>< 3@C??K ?@>F5AA>2. 3> ?>4?@>F5AAK =0A;54CNB =>2K9 845=B8D8:0B>@ 3@C??K ?@>F5AA>2, 8 ?@8=04;560B B>9 65 3@C??5, GB> 8 8E @>48B5;L. -B0 =>20O 3@C??0 ?@>F5AA>2 1C45B D>=>2>9, 8 ?>MB><C =5 1C45B ?>;CG0BL A83=0;K, A2O70==K5 A B5@<8=0;><. A;8 ?@>3@0<<0 8A?>;=O5BAO 87 ksh 8;8 bash, 2K2>4 1C45B 2K3;O45BL B0:: $ setpgid [6426] Original process group id: 6426 [6426] New process group id: 6426 [6427] Process group id: 6426 [6428] Process group id: 6426 [6429] Process group id: 6426 ksh A>7405B =>2CN 3@C??C ?@>F5AA>2 4;O :064>9 8A?>;=O5<>9 :><0=4K. >MB><C setpgid(2) 2 AB@>:5 14 =5 45;05B =8G53> =01;N405<>3>, 254L ?@>F5AA C65 O2;O5BAO ;845@>< 3@C??K. 'B>1K 4>18BLAO 1>;55 8=B5@5A=>3> ?>2545=8O, <>6=> A=0G0;0 70?CAB8BL sh, 0 B>;L:> ?>B>< 70?CA:0BL ?@>3@0<<C, B>340 ?@8 70?CA:5 ?@>3@0<<K ;845@>< 55 3@C??K 1C45B ?@>F5AA sh. $09;: setpgid.c #!"", "$"   #+  &!! -    1 #include <sys/types.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 #define NUMCHILD 3 6 7 main() 8 { 9 int i; 10 11 printf("[%ld] Original process group id: %ld\n", 12 getpid(), getpgid(0)); 13 14 if (setpgid(0, 0) == -1) { 15 perror(""); 16 exit(1); 17 } 18 19 printf("[%ld] New process group id: %ld\n", 20 getpid(), getpgid(0)); 21 22 for (i = 0; i < NUMCHILD; i++ ) { 23 if (fork() == 0) { /* child */ 24 printf("\n\t[%ld] Process group id: %ld\n", 25 getpid(), getpgid(0)); 26 exit(0); 27 } 28 } 29 } >;CG5=85 8 CAB0=>2:0 3@C??K ?@>F5AA>2 ?5@2>3> ?;0=0. tcsetpgrp(3!) CAB0=02;8205B 4;O B5@<8=0;0 A 45A:@8?B>@>< D09;0 fildes 845=B8D8:0B>@ 3@C??K ?5@2>3> ?;0=0 @02=K< pgid. ><=8B5, GB> ?@>F5AAK 87 >A=>2=>9 3@C??K ?>;CG0NB A83=0;K, A2O70==K5 A B5@<8=0;><, B0:85 :0: SIGINT 8 SIGQUIT. A;8 D>=>2K9 ?@>F5AA ?>?KB05BAO A45;0BL tcsetpgrp(3!), >= ?>;CG8B A83=0; SIGTTOU. 0?@8<5@, 5A;8 D>=>2K9 ?@>F5AA ?>?KB05BAO AB0BL >A=>2=K< ?@>F5AA><, >= ?>;CG8B MB>B A83=0;. $>=>2K9 ?@>F5AA, >4=0:>, <>65B ?@>83=>@8@>20BL 8;8 >1@01>B0BL MB>B A83=0;. @><5 B>3>, D>=>2K5 ?@>F5AAK ?>;CG0NB A83=0;K SIGTTIN 8 SIGTTOU ?@8 ?>?KB:5 G8B0BL A C?@02;ONI53> B5@<8=0;0 8;8 ?8A0BL =0 =53>. ><0=4=K9 ?@>F5AA>@ bash ?>4 SVR4 B@048F8>==> A>18@0NB A 83=>@8@>20=85< SIGTTOU, ?>MB><C D>=>2K5 ?@>F5AAK, 70?CI5==K5 87-?>4 bash, =5 <>3CB G8B0BL A B5@<8=0;0, => <>3CB ?8A0BL =0 =53>, B0: GB> 8E 2K2>4 <>65B A<5H820BLAO A 2K2>4>< B5:CI59 ?@>3@0<<K ?5@2>3> ?;0=0. -B> A45;0=> 4;O A>2<5AB8<>AB8 A B@048F8>==K<8 Unix-A8AB5<0<8, 345 =5 1K;> A?>A>10 701;>:8@>20BL 2K2>4 D>=>2KE ?@>F5AA>2. tcgetpgrp(2) 2>72@0I05B 845=B8D8:0B>@ 3@C??K >A=>2=KE ?@>F5AA>2 4;O B5@<8=0;0 A 45A:@8?B>@>< D09;0 fildes. tcgetsid(2) 2>72@0I05B 845=B8D8:0B>@ A5AA88, 4;O :>B>@>9 C?@02;ONI8< B5@<8=0;>< O2;O5BAO B5@<8=0; A 45A:@8?B>@>< D09;0 fildes. @8<5@ - @C??0 ?5@2>3> ?;0=0, A2O70==0O A B5@<8=0;>< -B0 ?@>3@0<<0 45<>=AB@8@C5B 87<5=5=85 3@C??K ?@>F5AA>2 ?5@2>3> ?;0=0. -B> >4=0 87 >A=>2=KE 7040G ?@8 C?@02;5=88 7040=8O<8. @>3@0<<0 @01>B05B B0:: 11 0A?5G0BK205BAO =0G0;L=K9 845=B8D8:0B>@ 3@C??K 4;O MB>3> ?@>F5AA0. 13 !>7405BAO ?>4?@>F5AA. 14-17 @8 ?><>I8 setpgid(2) A>7405BAO =>20O 3@C??0. 19 0A?5G0BK205BAO =>2K9 845=B8D8:0B>@ 3@C??K ?@>F5AA>2. 21 >4?@>F5AA 70AK?05B =0 10 A5:C=4. 26 0A?5G0BK205BAO 845=B8D8:0B>@ 3@C??K >A=>2=KE ?@>F5AA>2. >48B5;LA:89 ?@>F5AA ?@8=04;568B 3@C??5 ?5@2>3> ?;0=0. 27 "0: :0: @>48B5;LA:89 ?@>F5AA ?@8=04;568B >A=>2=>9 3@C??5, 2> 2@5<O 8A?>;=5=8O 2K7>20 sleep(2), MB>B ?@>F5AA <>65B ?>;CG0BL A83=0;K, A2O70==K5 A B5@<8=0;><. 0?@8<5@, ?>;L7>20B5;L <>65B ?>A;0BL SIGINT 8 @>48B5;LA:89 ?@>F5AA 7025@H8BAO. 28 @C??0 >A=>2=KE ?@>F5AA>2 87<5=O5BAO 2K7>2>< tcsetpgrp(2). "5?5@L ?>@>645==K9 ?@>F5AA ?@8=04;568B : >A=>2=>9 3@C??5. 30 A5 A2O70==K5 A B5@<8=0;>< A83=0;K 1C4CB ?>;CG5=K ?>4?@>F5AA>< 8 2K7>2CB 53> 7025@H5=85. 7-?>4 ksh 8;8 bash MB0 ?@>3@0<<0 8A?>;=O5BAO A;54CNI8< >1@07><: $ tcsetpgrp Original PGID: 8260 New PGID: 8376 Foreground PGID: 8260 (terminal signals received by parent) Foreground PGID: 8376 (terminal signals received by child) child done parent done 7-?>4 sh, shell =5>1E>48<> A=>20 A45;0BL >A=>2=K< ?@>F5AA>< ?@5645, G5< =0H ?@>F5AA 7025@H8BAO. =0G5 ?>;L7>20B5;L 1C45B 2K1@>H5= 87 A8AB5<K ?@8 7025@H5=88 ?@>3@0<<K. $09;: tcsetpgrp.c    -  # !+%  &!! 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <termios.h> 5 #include <stdio.h> 6 7 main() 8 { 9 pid_t pid; 10 11 printf("Original PGID: %ld\n", getpgid(0)); 12 13 if ((pid = fork()) == 0) { 14 if (setpgid(0, 0) == -1) { 15 perror(""); 16 exit(1); 17 } 18 19 printf("New PGID: %ld\n", getpgid(0)); 20 21 sleep(10); 22 printf("child done\n"); 23 exit(0); 24 } 25 26 printf("Foreground PGID: %ld\n", tcgetpgrp(0)); 27 sleep(5); /* parent receives terminal signals */ 28 tcsetpgrp(0, pid); 29 printf("Foreground PGID: %ld\n", tcgetpgrp(0)); 30 wait(0); /* child receives terminal signals */ 31 printf("done parent\n"); 32 } hb>!"#%l&)-0222D6678;(<>>AxBCCGzH|H$|HHI0I^IIIIIRJ\JJJJKTKKKHLLLMLMMMMlNNNN$NOOTOZOOPfPPPPPQSbV(\`bbHeff:g4j:m0npq,r$$,r>rrrrVsXssssttLtxtttu0u6uJuTuuvNvvvv(w~wwwxxFxxxJyyzRzzz{>{^{{{||,|||||@}rڀ~$ڂ~`ĎbdHNސ<B,>zHNJ&@(*n:ޞڟf$fB< <fl>Hz*Nb2pH^hn@֮DvT$p8:$: HJ2:<$&np$$p,`fzRX`F 2DNNP~~^\^*n0N@Vn$npPR>DXb6~HNv^l  " $ $ ,1h/ =!n"n#n$n% h@h Normal$a$1$*$A$/B*OJQJCJmHsHKHPJ^JaJ_H9tH9T@QT Heading 2@& & F & FCJ65aJ]\N@QN Heading 3@& & F & FCJ5aJ\DA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k@(No List JOJ Absatz-StandardschriftartROR 03>;>2>: x$OJQJCJPJ^JaJ6B@6 Body Text x$/@"$ ListFO2F 0720=85 xx $CJ6aJ]2OB2 #:070B5;L $NON Heading x$OJQJCJPJ^JaJD"@bD Caption xx $CJ6aJ]*Or* Index $^O^ Preformatted Text OJQJCJPJ^JaJp &'-.~ z E { R-!$$$%@'.)*+Q-./0o001D1!439:>???@AC'DDDDEEFFFFGGIIKzLMOOOQ=Q>QRQSYTUUU W WXX\t\\\____8apabbce_f%i&iTiUiiijkkkkHmqmmnUnnnn o!o6opr+tt5u1vvHxlxmxy>z#{X|1~#yz݁E}]ֆ6!"?\La>іj-_vٙܙ (C]`Ϛ!4^қݛ#&af.DIJ_.B[\{{ͭ !U0H_vy),Urϰ1[+Fb}Dz߲UZ[~K׵KU4$$@OԼ%*Mk|$9hҾ6i׿9q~SMk|:=}$]w4e)./I.S.&z{)*PQw"#IJpq0G^t ,?OX[8Znw X.U6B~?Q  #UXy:LTWJinor 0( 0000( 0000000000%0%0%0%0%0%0( 000000( 0000000000000( 000000( 0000000000000( 0000000000000000000000000000000( 00000000000( 0000000( 000000000000( 0000000000000000000( 00000000000000( 000000000000000000000000000000000000000000000000000000000000000000( 00000000000000000000000000000000000000000000000000000000000( 000000000000000000000000000000000000000000000000000000( 00000000000000000000000000000000000000000000000( 000000000( 000000000( 0000000000000000000000000000000000000000000000000000000000( 00000000( 0000000000000000000000000000000000000000000000000000000000$ Qh|HN,rwf:pNn$      $ ! % ! ' ) 5 7 ; > C P R T X Z _   #$(,,*<'*  !"(,14C} 2569-2/5DIpuQ _ Q!V!!!""-#2###%%A&D&a&d&h&o&&&&&&&&&&&7':';'>'@'E'''d(i(((((!)').)5)))****,+2+++++++++,,- -s.|...../ /&/,/00o0t00000001(122j4p4q4z4~445555O6T66677777778C8G88899::::::;;G<J<K<P<Q<T<U<]<= =>>??D?K?uB{B CCgCjCnCsCxCCCCCDD D DDD%DDDJDDDEEFF;G@GAGGGUG\GlGpGGGHH1IAIKKLLLLLM MMMMMMINVNO#OFOROOOOOwPPQQQQR%RRR+S2SSSTTTTUUYUoVsVX!XYYYYZZ&[*[[[]^^^)`0`s`|```/a6aJaSaZacapavaaabb?bHbKb[bbbc cccldudddeeef ffffff ggpgyghhDhKhhi/i>iGiPi^iniwii;jAjjkkkkkhmomqmxmmmn nUn\nnnoobofoooooJpNpVq[qqqrrrr~rrrrrrtttt@SU^_pwxz'-29v{OS*>FNʼҼ !178?@CEKY[xzֽڽ !+147@Kowʾξپ')JPQVZ\xĿѿԿHQRXY^kn $(<@ ckDKbi"/KOaiq{ $%,-028EMNQRT",7 <Dmvwy &?B]d+2478="(_d"&)129#)ntV\!$+.;A$+>J`ghmnpqt`b'.=ET\kr39bh CIMTei-115 3=%*my~EP)/HOcf"(]c~PVX\]er{ ' +5!A P """"##O&Q&((77;;^CCZEfEEEVMWMNNQQZS[SSS[\jjppRqTqqqttvv`ylyyy~v{ $.  agflFI%֖ܖ˙ҙߙ#&PThrך AH"6=zFH&)פ ?Aӥۥƫɫʫͫ|9>]g~ذݰ?Bcm49px'.WY$ٵݵZ`BL&* @C]b½47OQuxپEJ~HRX^ HQ-0EN";=BEmw+-9:;>'*3:FKbi pvyZ^W[8<SZ )0in")CH]dkmr3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333.-$$??ZFF__kk"o6oRppz"?\{U~)I|8JorP^`P@^@`0^`0`^``^`^`^``^``0^0`husL@HrHr,HrHr(D|pUnknownGz Times New Roman5Symbol3& z ArialS DejaVu SansMS Mincho]4DejaVu Sans MonoMS Mincho"A h Lj':%6:%6! 24 XsLDmitry IrtegovDmitry V Irtegov Oh+'0|   , 8 D P\dltDmitry IrtegovNormalDmitry V Irtegov2Microsoft Office Word@G@@/P˜@+:%6՜.+,0 hp|  NSU'  Title  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQSTUVWXY[\]^_`afRoot Entry F`+h1Table zWordDocument.&SummaryInformation(RDocumentSummaryInformation8ZCompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q