BBSˮľÇ廪վ¡Ã¾«»ªÇø

·¢ÐÅÈË: forest (ÇẮС¥~~С¼ªÆª), ÐÅÇø: Unix        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-19 (×ªÔØ) 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Fri Mar 17 17:53:07 2000) 
 
¡¾ ÒÔÏÂÎÄ×Ö×ªÔØ×Ô Linux ÌÖÂÛÇø ¡¿ 
¡¾ Ô­ÎÄÓÉ SuperSB Ëù·¢±í ¡¿ 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--µÚ19Õ αÖÕ¶Ë  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 14:24:07 2000), ×ªÐÅ  
   
   
µÚÊ®¾ÅÕ                Î±ÖÕ¶Ë  
19.1  ÒýÑÔ  
ÔÚµÚ¾ÅÕÂÖÐÎÒÃǽéÉÜÁ˽øÐÐÖն˵Ǽʱ£¬ÐèҪͨ¹ýÒ»¸öÖÕ¶ËÉ豸×Ô¶¯ÌṩÖն˵ÄÓï  
Òå¡£ÔÚÖն˺ÍÔËÐгÌÐòÖ®¼äÓÐÒ»¸öÖÕ¶ËÐйæ³Ì£¨Í¼11.2£©£¬Í¨¹ýÕâ¸ö¹æ³ÌÎÒÃÇÄܹ»  
ÔÚÖÕ¶ËÉÏÉèÖÃÌØÊâ×Ö·û£¨Í˸ñ¡¢ÐÐɾ³ý¡¢Öжϵȣ©¡£µ«ÊÇ£¬µ±Ò»¸öµÇ¼ÇëÇóµ½´ïÍø  
ÂçÁ¬½Óʱ£¬ÖÕ¶ËÐйæ³Ì²¢²»ÊÇ×Ô¶¯±»¼ÓÔØµ½ÍøÂçÁ¬½ÓºÍµÇ¼³ÌÐòshellÖ®¼äµÄ¡£Í¼  
9.5ÏÔʾÁËÓÐÒ»¸öαÖÕ¶ËÉ豸Çý¶¯³ÌÐò±»ÓÃÀ´ÌṩÖÕ¶ËÓïÒå¡£  
        ³ýÁËÓÃÓÚÍøÂçµÇ¼£¬Î±ÖÕ¶Ë»¹±»ÓÃÔÚÆäËû·½Ã棬ÎÒÃǽ«ÔÚ±¾ÕÂÖнøÐнéÉÜ¡£ÎÒÃÇ  
½«Ê×ÏÈÌṩÔÚSVR4ºÍ4.3+BSDϵͳÏÂÓÃÓÚ´´½¨Î±Öն˵ĺ¯Êý£¬È»ºóʹÓÃÕâЩº¯Êý±à  
дһ¸ö³ÌÐòÓÃÀ´µ÷ÓÃpty¡£ÎÒÃǽ«¿´µ½Õâ¸ö³ÌÐòµÄ²»Í¬Ê¹ÓãºÔÚÊäÈë×Ö·ûºÍÖÕ¶ËÏÔ  
ʾ֮¼ä½øÐÐת»»£¨BSDµÄÂëת»»³ÌÐò£©ºÍÔËÐÐЭͬ½ø³ÌÀ´±ÜÃâÎÒÃÇÔÚ³ÌÐò14.10ÖÐÓö  
µ½µÄ»º³åÇøÎÊÌâ¡£  
19.2   ¸ÅÊö  
αÖÕ¶ËÕâ¸öÃû´Ê°µÊ¾ÁËÓëÒ»¸öÓ¦ÓóÌÐòÏà±È£¬Ëü¸ü¼ÓÏóÒ»¸öÖÕ¶Ë¡£µ«ÊÂʵÉÏ£¬Î±ÖÕ  
¶Ë²¢²»ÊÇÒ»¸öÕæÕýµÄÖÕ¶Ë¡£Í¼19.1ÏÔʾÁËʹÓÃαÖն˵Ľø³ÌµÄµäÐͽṹ¡£ÆäÖйؼü  
µãÈçÏ£º  
ͼ19.1  Ê¹ÓÃαÖն˵ĵäÐͽø³Ì½á¹¹  
1 Í¨³£Ò»¸ö½ø³Ì´ò¿ªÎ±ÖÕ¶ËÖ÷É豸Ȼºóµ÷ÓÃfork¡£×Ó½ø³Ì½¨Á¢ÁËÒ»¸öеĻỰ£¬´ò  
¿ªÒ»¸öÏàÓ¦µÄαÖÕ¶Ë´ÓÉ豸£¬½«Ëü¸´ÖƳɱê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼³ö´í£¬È»ºóµ÷  
ÓÃexec¡£Î±ÖÕ¶Ë´ÓÉ豸³ÉΪ×Ó½ø³ÌµÄ¿ØÖÆÖÕ¶Ë¡£  
2 ¶ÔÓÚαÖÕ¶Ë´ÓÉ豸֮ÉϵÄÓû§½ø³ÌÀ´Ëµ£¬Æä±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼³ö´í¶¼ÄÜ  
µ±×÷ÖÕ¶ËÉ豸ʹÓá£Óû§½ø³ÌÄܹ»µ÷ÓÃ11ÕÂÖн²µ½µÄËùÓÐÊäÈë/Êä³öº¯Êý¡£µ«ÊÇÒò  
ΪÔÚαÖÕ¶Ë´ÓÉ豸֮ϲ¢Ã»ÓÐÕæÕýµÄÉ豸£¬ÎÞÒâÒåµÄº¯Êýµ÷Óã¨¸Ä±ä²¨ÌØÂÊ¡¢·¢ËÍ  
ÖжϷû¡¢ÉèÖÃÆæÅ¼Ð£ÑéµÈ£©½«±»ºöÂÔ¡£  
3 ÈκÎдµ½Î±ÖÕ¶ËÖ÷É豸µÄÊäÈë¶¼»á×÷ΪÔÚ´ÓÉ豸¶ËµÄÊäÈ룬·´Ö®ÒàÈ»¡£ÊÂʵÉÏËù  
ÓдÓÉ豸¶ËµÄÊäÈë¶¼À´×ÔÓÚÖ÷É豸ÉϵÄÓû§½ø³Ì¡£Õâ¿´ÆðÀ´¾ÍÏóÒ»¸öÁ÷¹ÜµÀ£¨Í¼1  
5.3£©£¬µ«´ÓÉ豸ÉϵÄÖÕ¶ËÐйæ³ÌʹÎÒÃÇÓµÓÐÆÕͨ¹ÜµÀÖ®ÍâµÄÆäËû´¦ÀíÄÜÁ¦¡£  
ͼ19.1ÏÔʾÁËBSDϵͳÖеÄαÖն˽ṹ¡£ÔÚ19.3.2ÖÐÎÒÃǽ«¿´µ½ÈçºÎ´ò¿ªÕâЩÉ豸  
¡£  
ÔÚSVR4ϵͳÖÐαÖÕ¶ËÊÇʹÓÃÁ÷ϵͳÀ´´´½¨µÄ£¨12.4½Ú£©¡£Í¼19.2ÏêϸÃèÊöÁËSVR4ϵ  
ͳÖи÷¸öαÖÕ¶ËÄ£¿éÖ®¼äµÄ¹ØÏµ¡£ÔÚÐéÏß¿òÖеÄÁ½¸öÁ÷Ä£¿éÊÇ¿ÉÑ¡µÄ¡£Çë×¢ÒâÔÚ´Ó  
É豸ÉϵÄÈý¸öÁ÷Ä£¿éͬ12.10ÍøÂçµÇ¼³ÌÐòµÄÊä³öÊÇÒ»ÑùµÄ¡£ÔÚ19.3.1С½ÚÖн«½é  
ÉÜÈçºÎ×éÖ¯ÕâЩÁ÷Ä£¿é¡£  
        ´ÓÏÖÔÚ¿ªÊ¼½«¼ò»¯ÒÔÉÏͼʾ£¬Ê×ÏÈÎÒÃDz»ÔÙ»­³öͼ19.1µÄ"¶Á¡¢Ð´¹¦ÄÜ"»òͼ19.2  
µÄÁ÷Êס£ÎÒÃÇ»¹Ê¹ÓÃËõд"pty"±íʾαÖÕ¶Ë£¬²¢½«Í¼19.2ÖÐËùÓÐαÖÕ¶Ë´ÓÉ豸֮ÉÏ  
µÄÁ÷Ä£¿é¼¯ºÏ±íʾΪ"ÖÕ¶ËÐйæ³Ì"Ä£¿é¡£  
ͼ19.2  ÔÚSVR4ϵÄαÖÕ¶Ë×éÖ¯½á¹¹  
        ÏÖÔÚÀ´¿´Ò»ÏÂαÖն˵ļ¸ÖÖµäÐÍÓ÷¨¡£  
ÍøÂçµÇ¼·þÎñÆ÷  
        Î±ÖÕ¶ËÓÃÓÚ¹¹ÔìÍøÂçµÇ¼·þÎñÆ÷¡£µäÐ͵ÄÀý×ÓÊÇtelnetdºÍrlogind·þÎñÆ÷¡£ÔÚSt  
evens[1990]µÄµÚ15ÕÂÖÐÏêϸÌÖÂÛÁËÌṩrlogin·þÎñµÄ²½Öè¡£Ò»µ©µÇ¼shellÔËÐÐÔÚ  
Ô¶¶ËÖ÷»úÉÏ£¬ÎÒÃǵõ½Èçͼ19.3µÄ½á¹¹¡£Í¬ÑùµÄ½á¹¹Ò²ÓÃÓÚtelnetd·þÎñÆ÷¡£  
ÔÚrlogind·þÎñÆ÷ºÍµÇ¼shellÖ®¼äÓÐÁ½¸öexecµ÷Óã¬ÕâÊÇÒòΪlogin³ÌÐòͨ³£ÊÇÔÚ  
Á½¸öexecÖ®¼ä¼ìÑéÓû§ÊÇ·ñºÏ·¨µÄ¡£  
ͼ19.3  rlogind·þÎñÆ÷µÄ½ø³Ì×éÖ¯½á¹¹  
±¾Í¼µÄÒ»¸ö¹Ø¼üµãÊÇÇý¶¯Î±ÖÕ¶ËÖ÷É豸µÄ½ø³Ìͨ³£Í¬Ê±ÔÚ¶ÁдÁíÒ»¸öÊäÈë/Êä³öÁ÷  
¡£ÔÚ±¾ÀýÖÐÁíÒ»¸öÊäÈë/Êä³öÁ÷ÊÇTCP/IP¡£Õâ±íʾ¸Ã½ø³Ì±ØÈ»Ê¹ÓÃÁËijÖÖÐÎʽµÄÈç  
select»òpollÄÇÑùµÄÊäÈë/Êä³ö¶à·ת½Ó£¨½Ú12.5£©£¬»ò±»·Ö³ÉÁ½¸ö½ø³Ì¡£Çë»ØÒä  
ÎÒÃÇÔÚ18.7½ÚÌÖÂÛ¹ýµÄÒ»¸ö½ø³ÌºÍÁ½¸ö½ø³ÌµÄµÄ±È½Ï¡£  
script³ÌÐò  
script³ÌÐòÊÇËæSVR4ºÍ4.3+BSDÌṩµÄ£¬¸Ã³ÌÐò½«Öն˻ỰÆÚ¼äËùÓеÄÊäÈëºÍÊä³ö  
ÐÅÏ¢ÔÚÒ»¸öÎļþÖÐ×öÒ»¸ö¿½±´¡£Ëüͨ¹ý½«×Ô¼ºÖÃÓÚÖն˺͵ǼshellµÄÒ»¸öеĵ÷  
ÓÃÖ®¼äÀ´Íê³ÉÕâ¸ö¹¤×÷¡£Í¼19.4ÏêϸÃèÊöÁËscript³ÌÐòÏà¹ØµÄ½»»¥¡£ÕâÀïÎÒÃÇÌØ±ð  
Ö¸³öscript³ÌÐòͨ³£ÊǴӵǼshellÆô¶¯µÄ£¬¸ÃshellÈ»ºóµÈ´ý³ÌÐòµÄ½áÊø¡£  
µ±script³ÌÐòÔÚÔËÐеÄʱºò£¬ÔÚαÖÕ¶Ë´ÓÉ豸֮ÉÏÖÕ¶ËÐйæ³ÌµÄËùÓÐÊä³ö¶¼±»¸´ÖÆ  
µ½Ò»¸öscriptÎļþÖУ¨Í¨³£½Ð×ötypescript£©¡£ÒòΪÎÒÃǵĻ÷¼üͨ³£±»Ðйæ³ÌµÄÄ£  
¿é»ØÏÔ£¬¸ÃscriptÎļþÒ²°üÀ¨ÁËÊäÈëµÄÄÚÈÝ¡£µ«ÊÇ£¬ÒòΪ¿ÚÁî×Ö²»±»»ØÏÔ£¬¸Ãscr  
iptÎļþ²»»á°üº¬¿ÚÁî×Ö¡£  
ͼ19.4  script³ÌÐò  
±¾ÊéÖÐËùÓÐÔËÐгÌÐò²¢ÏÔʾÆäÊä³öµÄʵÀý¶¼ÊÇÓÉscript³ÌÐòʵÏֵģ¬ÕâÑù±ÜÃâÁËÊÖ  
¶¯¿½±´³ÌÐòÊä³ö¿ÉÄÜ´øÀ´µÄ´íÎó¡£  
ÔÚ19.5½Ú¿ª·¢Ò»¸öͨÓõÄpty³ÌÐòºó£¬ÎÒÃǽ«¿´µ½Ò»¸öÇÉÃîµÄshell³ÌÐòÄܹ»½«Ëüת  
»¯³ÉÒ»¸öscript³ÌÐò¡£  
expect³ÌÐò  
        Î±ÖÕ¶Ë¿ÉÒÔÓÃÀ´Ê¹½»»¥Ê½µÄ³ÌÐòÔËÐÐÔڷǽ»»¥µÄ״̬ÖС£Ðí¶à³ÌÐòÐèÒªÒ»¸öÖÕ¶Ë  
À´ÔËÐУ¬18.7½ÚÖеÄcall½ø³Ì¾ÍÊÇÒ»¸öÀý×Ó¡£Ëü¼Ù¶¨±ê×¼ÊäÈëÊÇÒ»¸öÖն˲¢ÔÚÆô¶¯  
ʱ½«ÆäÉèÖÃΪ³õʼģʽ£¨18.20³ÌÐò£©¡£¸Ã³ÌÐò²»ÄÜ´ÓÒ»¸öshell³ÌÐòÖб»ÔËÐÐÀ´×Ô  
¶¯²¦ºÅµ½Ô¶³Ìϵͳ£¬µÇ¼£¬È¡³öÐÅÏ¢ºÍµÇ³ö¡£  
        Í¬ÐÞ¸ÄËùÓн»»¥Ê½³ÌÐòÀ´Ö§³ÖÅú´¦ÀíģʽµÄ²Ù×÷±È½Ï£¬Ò»¸ö¸üºÃµÄ½â¾ö·½·¨ÊÇÌá  
¹©Ò»ÖÖÊÖ¶ÎÀ´Í¨¹ýÒ»¸öscriptÀ´Çý¶¯½»»¥Ê½³ÌÐò¡£expect³ÌÐò[Libes 1990;1991]  
ÌṩÁËÕâÑùµÄ·½·¨¡£ÀàËÆÓÚ19.5½ÚµÄpty³ÌÐò£¬ËüʹÓÃαÖÕ¶ËÀ´ÔËÐÐÆäËû³ÌÐò¡£µ«  
ÊÇ£¬expect»¹ÌṩÁËÒ»ÖÖ±à³ÌÓïÑÔÓÃÓÚ¼ì²é³ÌÐòµÄÊä³öÀ´È·¶¨ÒÔʲô×÷ΪÊäÈë·¢ËÍ  
¸ø¸Ã³ÌÐò¡£µ±Ò»¸ö½»»¥Ê½µÄ³ÌÐò¿ªÊ¼´ÓÒ»¸öscriptÔËÐÐʱ£¬ÎÒÃDz»Äܽö½öÊǽ«scr  
iptÖеÄËùÓÐÄÚÈÝÊäÈëµ½³ÌÐòÖÐÈ¥¡£ÏàÓ¦µÄ£¬ÎÒÃÇҪͨ¹ý¼ì²é³ÌÐòµÄÊä³öÀ´¾ö¶¨Ï  
Ò»²½ÊäÈëµÄÄÚÈÝ¡£  
ÔËÐÐЭͬ½ø³Ì  
        ÔÚ14.10µÄ³ÌÐòÀý×ÓÖУ¬ÎÒÃDz»Äܵ÷ÓÃʹÓñê×¼ÊäÈë/Êä³ö¿â½øÐÐÊäÈë¡¢Êä³öµÄЭ  
ͬ½ø³Ì£¬ÕâÊÇÒòΪµ±ÎÒÃÇͨ¹ý¹ÜµÀÓëЭͬ½ø³Ì½øÐÐͨѶʱ£¬±ê×¼ÊäÈë/Êä³ö¿â»á½«  
±ê×¼ÊäÈë¡¢Êä³öµÄÄÚÈݷŵ½»º³åÇøÖУ¬´Ó¶øÒýÆðËÀËø¡£Èç¹ûЭͬ½ø³ÌÊÇÒ»¸öÒѾ­±à  
ÒëµÄ³ÌÐò¶øÎÒÃÇÓÖûÓÐÔ´³ÌÐò£¬ÎÒÃǾÍÎÞ·¨ÔÚÔ´³ÌÐòÖмÓÈëfflushÓï¾äÀ´½â¾öÕâ¸ö  
ÎÊÌ⡣ͼ14.9ÏÔʾÁËÒ»¸ö½ø³ÌÇý¶¯Ð­Í¬½ø³ÌµÄÇé¿ö¡£ÎÒÃÇÐèÒª×öµÄÊǽ«Ò»¸öαÖÕ¶Ë  
·Åµ½Á½¸ö½ø³ÌÖ®¼ä£¬Èçͼ19.5Ëùʾ¡£  
ͼ19.5  ÓÃαÖÕ¶ËÇý¶¯Ò»¸öЭͬ½ø³Ì  
        ÏÖÔÚЭͬ½ø³ÌµÄ±ê×¼ÊäÈëºÍ±ê×¼Êä³ö¾ÍÏóÒ»¸öÖÕ¶ËÉ豸һÑù£¬ËùÒÔ±ê×¼ÊäÈë/Êä³ö  
¿â»á½«ÕâÁ½¸öÁ÷ÉèÖÃΪÐлº³åµÄ¡£  
¸¸½ø³ÌÓÐÁ½ÖÖ²»Í¬µÄ·½·¨ÔÚ×ÔÉíºÍЭͬ½ø³ÌÖ®¼ä»ñµÃαÖÕ¶Ë£¨ÕâÖÖÇé¿öϵĸ¸½ø³Ì  
¿ÉÒÔÏó³ÌÐò14.9£¬Ê¹ÓÃÁ½¸ö¹ÜµÀºÍЭͬ½ø³Ì½øÐÐͨѶ£»»òÕßÏó³ÌÐò15.1ÄÇÑù£¬Ê¹Óà 
Ò»¸öÁ÷¹ÜµÀ£©¡£Ò»¸ö·½·¨ÊǸ¸½ø³ÌÖ±½Óµ÷ÓÃpty_forkº¯Êý£¨19.4½Ú£©¶ø²»ÊÇfork¡£  
ÁíÒ»ÖÖ·½·¨ÊÇexec¸Ãpty³ÌÐò£¬½«Ð­Í¬½ø³Ì×÷Ϊ²ÎÊý£¨19.5½Ú£©¡£ÎÒÃǽ«ÔÚ˵Ã÷pt  
y³ÌÐòºó½éÉÜÕâÁ½ÖÖ·½·¨¡£  
¹Û¿´³¤Ê±¼äÔËÐгÌÐòµÄÊä³ö  
        Ê¹ÓÃÈÎÒ»¸ö±ê×¼shell£¬ÎÒÃǶ¼¿ÉÒÔ½«Ò»¸öÐèÒª³¤Ê±¼äÔËÐеijÌÐò·Åµ½ºǫ́ÔËÐС£  
µ«ÊÇÈç¹ûÎÒÃǽ«¸Ã³ÌÐòµÄ±ê×¼Êä³öÖØ¶¨Ïòµ½Ò»¸öÎļþ£¬²¢ÇÒÈç¹ûËü²úÉúµÄÊä³ö²»¶à  
£¬ÎÒÃǾͲ»ÄÜ·½±ãµØ¼à¿Ø³ÌÐòµÄ½øÕ¹£¬ÕâÊÇÒòΪ±ê×¼µÄÊäÈë/Êä³ö¿â»á½«±ê×¼Êä³ö  
·ÅÔÚ»º³åÇøÖб£´æ¡£ÎÒÃÇ¿´µ½µÄ½«Ö»ÊdzɿéµÄÊä³ö½á¹û£¬ÓÐʱÉõÖÁ¿ÉÄÜÊÇ8192×Ö½Ú  
Ò»¿é¡£  
        Èç¹ûÎÒÃÇÓÐÔ´³ÌÐò£¬ÎÒÃÇ¿ÉÒÔ¼ÓÈëfflushµ÷Óá£ÁíÒ»ÖÖ·½·¨ÊÇ£¬ÎÒÃÇ¿ÉÒÔÔÚpty³Ì  
ÐòÏÂÔËÐиóÌÐò£¬Èñê×¼ÊäÈë/Êä³ö¿âÈÏΪÊä³öÊÇÖÕ¶Ë¡£Í¼19.6˵Ã÷ÁËÕâ¸ö½á¹¹£¬  
ÎÒÃǽ«Õâ¸ö»ºÂýÊä³öµÄ³ÌÐò³ÆÎªslowout¡£´ÓµÇ¼shellµ½pty½ø³ÌµÄfort/exec¼ýÍ·  
ÓÃÐéÏß±íʾ£¬ÒÔÇ¿µ÷pty½ø³ÌÊÇ×÷Ϊºǫ́ÈÎÎñÔËÐеġ£  
19.3   ´ò¿ªÎ±ÖÕ¶ËÉ豸  
ÔÚSVR4ºÍ4.3+BSDϵͳÖдò¿ªÎ±ÖÕ¶ËÉ豸µÄ·½·¨ÓÐËù²»Í¬¡£ÎÒÃÇÌṩÁ½¸öº¯ÊýÀ´´¦  
ÀíËùÓÐϸ½Ú£ºptym_openÓÃÀ´´ò¿ªÏÂÒ»¸öÓÐЧµÄαÖÕ¶ËÖ÷É豸£¬ptys_openÓÃÀ´´ò¿ª  
ÏàÓ¦µÄ´ÓÉ豸¡£  
ͼ19.6  Ê¹ÓÃαÖÕ¶ËÔËÐÐÒ»¸ö»ºÂýÊä³öµÄ³ÌÐò  
#include "ourhdr.h"  
int ptym_open(char *pts_name);  
                                        ·µ»Ø£ºÈç¹û²Ù×÷³É¹¦£¬·µ»ØÎ±ÖÕ¶ËÖ÷É豸Îļþ  
 Êö·û£»·ñÔò·µ»Ø-1  
int ptys_open(int fdm, char *pts_name);  
                                        ·µ»Ø£ºÈç¹û²Ù×÷³É¹¦£¬·µ»ØÎ±ÖÕ¶Ë´ÓÉ豸Îļþ  
 Êö·û£»·ñÔò·µ»Ø-1  
ͨ³£ÎÒÃDz»Ö±½Óµ÷ÓÃÕâÁ½¸öº¯Êý--º¯Êýpty_fork£¨19.4½Ú£©µ÷ÓÃËüÃDz¢fork³öÒ»¸ö  
×Ó½ø³Ì¡£  
ptym_open¾ö¶¨ÏÂÒ»¸öÓÐЧµÄαÖÕ¶ËÖ÷É豸²¢´ò¿ª¸ÃÉ豸¡£Õâ¸öµ÷ÓñØÐë·ÖÅäÒ»¸ö  
Êý×éÀ´´æ·ÅÖ÷É豸»ò´ÓÉ豸µÄÃû³Æ£¬²¢ÇÒÈç¹ûµ÷Óóɹ¦£¬ÏàÓ¦µÄÖ÷É豸»ò´ÓÉ豸µÄ  
Ãû³Æ»áͨ¹ýpts_name·µ»Ø¡£Õâ¸öÃû³ÆºÍptym_open·µ»ØµÄÎļþÃèÊö·û½«´«¸øptys_o  
pen£¬¸Ãº¯ÊýÓÃÀ´´ò¿ªÒ»¸ö´ÓÉ豸¡£  
ÔÚÎÒÃǽ²½âpty_forkº¯ÊýÖ®ºó£¬Ê¹ÓÃÁ½¸öº¯ÊýÀ´´ò¿ªÕâÁ½¸öÉ豸µÄÔ­Òò½«»áºÜÃ÷ÏÔ  
¡£Í¨³££¬Ò»¸ö½ø³Ìµ÷ÓÃptym_openÀ´´ò¿ªÒ»¸öÖ÷É豸²¢Çҵõ½´ÓÉ豸µÄÃû³Æ¡£¸Ã½ø  
³ÌÈ»ºófork×Ó½ø³Ì£¬×Ó½ø³ÌÔÚµ÷ÓÃsetid½¨Á¢ÐµĻỰºóµ÷ÓÃptys_openÀ´´ò¿ª´ÓÉè  
±¸¡£Õâ¾ÍÊÇ´ÓÉ豸ÈçºÎ³ÉΪ×Ó½ø³ÌµÄ¿ØÖÆÖն˵Ĺý³Ì¡£  
19.1.1 ÏµÍ³VµÄ°æ±¾4  
ËùÓÐÔÚSVR4ϵͳϵÄαÖն˵ÄÁ÷ʵÏÖϸ½ÚÔÚAT&T[1990d]µÄµÚÊ®¶þÕÂÖÐÓÐËù˵Ã÷¡£  
Èý¸öº¯ÊýÔÚÏÂÁÐÊÖ²áÒ³ÖÐÃèÊö£ºgrantpt(3)£¬unlockpt(3)£¬ºÍptsname(3)¡£  
        Î±ÖÕ¶ËÖ÷É豸ÊÇ/dev/ptmx¡£ÕâÊÇÒ»¸öÁ÷µÄÔöÖ³É豸¡£ÕâÒâζ×ŵ±ÎÒÃÇ´ò¿ª¸ÃÔöÖ³  
É豸£¬ÆäopenÀý³Ì×Ô¶¯¾ö¶¨µÚÒ»¸öδ±»Ê¹ÓõÄαÖÕ¶ËÖ÷É豸²¢´ò¿ªÕâ¸öÉ豸¡££¨ÔÚ  
ÏÂÒ»½ÚÎÒÃǽ«¿´µ½ÔÚBerkeleyϵͳÖУ¬ÎÒÃDZØÐë×Ô¼ºÕÒµ½µÚÒ»¸öδ±»Ê¹ÓõÄαÖÕ¶Ë  
Ö÷É豸¡££©  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        <stropts.h>  
#include        "ourhdr.h"  
extern char     *ptsname(int);  /* prototype not in any system header */  
int  
ptym_open(char *pts_name)  
{  
        char    *ptr;  
        int             fdm;  
        strcpy(pts_name, "/dev/ptmx");  /* in case open fails */  
        if ( (fdm = open(pts_name, O_RDWR)) < 0)  
                return(-1);  
        if (grantpt(fdm) < 0) {         /* grant access to slave */  
                close(fdm);  
                return(-2);  
        }  
        if (unlockpt(fdm) < 0) {        /* clear slave's lock flag */  
                close(fdm);  
                return(-3);  
        }  
        if ( (ptr = ptsname(fdm)) == NULL) {    /* get slave's name */  
                close(fdm);  
                return(-4);  
        }  
        strcpy(pts_name, ptr);  /* return name of slave */  
        return(fdm);                    /* return fd of master */  
}  
int  
ptys_open(int fdm, char *pts_name)  
{  
        int             fds;  
                        /* following should allocate controlling terminal */  
        if ( (fds = open(pts_name, O_RDWR)) < 0) {  
                close(fdm);  
                return(-5);  
        }  
        if (ioctl(fds, I_PUSH, "ptem") < 0) {  
                close(fdm);  
                close(fds);  
                return(-6);  
        }  
        if (ioctl(fds, I_PUSH, "ldterm") < 0) {  
                close(fdm);  
                close(fds);  
                return(-7);  
        }  
        if (ioctl(fds, I_PUSH, "ttcompat") < 0) {  
                close(fdm);  
                close(fds);  
                return(-8);  
        }  
        return(fds);  
}  
_______________________________________________________________________  
________  
³ÌÐò19.1        SVR4µÄαÖÕ¶Ë´ò¿ªº¯Êý  
        ÎÒÃÇÊ×ÏÈ´ò¿ªÉ豸/dev/ptmx²¢µÃµ½Î±ÖÕ¶ËÖ÷É豸µÄÎļþÃèÊö·û¡£´ò¿ªÕâ¸öÖ÷É豸  
×Ô¶¯Ëø¶¨Á˶ÔÓ¦µÄ´ÓÉ豸¡£  
        ÎÒÃÇÈ»ºóµ÷ÓÃgrantptÀ´¸Ä±ä´ÓÉ豸µÄȨÏÞ¡£Ö´ÐÐÈçϲÙ×÷£º£¨a£©½«´ÓÉ豸µÄËù  
ÓÐȨ¸ÄΪÓÐЧÓû§ID£»£¨b£©½«×éËùÓÐȨ¸ÄΪ×étty£»£¨c£©½«È¨ÏÞ¸ÄΪֻÔÊÐíuser  
-read£¬user-writeºÍgroup-write¡£½«×éËùÓÐȨÉèÖÃΪtty²¢ÔÊÐígroup-writeȨÏÞ  
ÊÇÒòΪ³ÌÐòwall(1)ºÍwrite(1)µÄ×é±êʶ·û±»ÉèÖÃΪ×étty¡£µ÷Óú¯ÊýgrantptÖ´ÐР 
/user/lib/pt_chmod¡£¸Ã³ÌÐòµÄÓû§±»ÉèÖÃΪrootÒò´ËËüÄܹ»Ð޸ĴÓÉ豸µÄËùÓÐÕß  
ºÍȨÏÞ¡£  
        º¯ÊýunlockptÓÃÀ´Çå³ý´ÓÉ豸µÄÄÚ²¿Ëø¡£ÔÚ´ò¿ª´ÓÉ豸ǰÎÒÃDZØÐë×öÕâ¼þÊÂÇé¡£  
²¢ÇÒÎÒÃDZØÐëµ÷ÓÃptsnameÀ´µÃµ½´ÓÉ豸µÄÃû³Æ¡£Õâ¸öÃû³ÆµÄ¸ñʽÊÇ/dev/pts/NNN  
¡£  
        ÎļþÖнÓÏÂÀ´µÄº¯ÊýÊÇptys_open£¬¸Ãº¯ÊýÕæÕý±»ÓÃÀ´´ò¿ªÒ»¸ö´ÓÉ豸¡£ÔÚSVR4ϵ  
ͳÖУ¬Èç¹ûµ÷ÓÃÕßÊÇÒ»¸ö»¹Ã»ÓпØÖÆÖն˵ĻỰ£¬open¾Í»á·ÖÅäÒ»¸ö´ÓÉ豸×÷Ϊ¿Ø  
ÖÆÖÕ¶Ë¡£Èç¹ûÎÒÃDz»Ï£Íûº¯Êý×Ô¶¯×öÕâ¼þÊ£¬¿ÉÒÔÔÚµ÷ÓÃʱָÃ÷O_NOCTTY±êÖ¾¡£  
        ÔÚ´ò¿ª´ÓÉ豸ºó£¬ÎÒÃǽ«Èý¸öÁ÷Ä£¿é·ÅÔÚ´ÓÉ豸µÄÁ÷ÉÏ¡£PtemÊÇ"αÖÕ¶Ë"ÐéÄâÄ£  
¿é£¬ldtermÊÇÖÕ¶ËÐйæ³ÌÄ£¿é¡£ÕâÁ½¸öÄ£¿éºÏÔÚÒ»ÆðÏóÒ»¸öÕæÕýµÄÖÕ¶ËÄ£¿éÒ»Ñù¹¤  
×÷¡£ttcompatÌṩÁËÏòÀÏϵͳÈçV7¡¢4BSDºÍXenixµÄioctlµ÷ÓõļæÈÝÐÔ¡£ÕâÊÇÒ»¸ö  
¿ÉÑ¡µÄÄ£¿é£¬µ«ÊÇÒòΪËü×Ô¶¯³¢ÊÔ¿ØÖÆÌ¨µÇ¼ºÍÍøÂçµÇ¼£¨¼û³ÌÐò12.10µÄÊä³ö£©  
£¬ÎÒÃǽ«Æä¼Óµ½´ÓÉ豸µÄÁ÷ÖС£  
        µ÷ÓÃÕâÁ½¸öº¯ÊýµÄ½á¹ûÊǵõ½£ºÎ±ÖÕ¶ËÖ÷É豸µÄÎļþÃèÊö·ûºÍ´ÓÉ豸µÄÎļþÃèÊö  
·û¡£  
19.3.2  4.3+BSD  
ÔÚ4.3+BSDϵͳÖÐÎÒÃDZØÐë×Ô¼ºÀ´È·¶¨µÚÒ»¸ö¿ÉÓõÄαÖÕ¶ËÖ÷É豸¡£Îª´ïµ½Õâ¸öÄ¿  
µÄ£¬ÎÒÃÇ´Ó/dev/ptyp0¿ªÊ¼²¢²»¶Ï³¢ÊÔÖ±µ½³É¹¦´ò¿ªÒ»¸ö¿ÉÓõÄαÖÕ¶ËÖ÷É豸»òÊÔ  
ÍêËùÓÐÉ豸¡£ÔÚ´ò¿ªÉ豸µÄʱºò£¬ÎÒÃǻῴµ½Á½ÖÖ¿ÉÄܵĴíÎó£ºEIOÖ¸É豸ÒѾ­±»  
ʹÓã»ENOENT±íʾÉ豸²»´æÔÚ¡£ÔÚºóÒ»ÖÖÇé¿ö£¬ÎÒÃÇ¿ÉÒÔÍ£Ö¹ËÑË÷£¬ÒòΪËùÓеÄα  
ÖÕ¶ËÉ豸¶¼ÔÚ±»Ê¹ÓÃÖС£Ò»µ©ÎÒÃdzɹ¦´ò¿ªÒ»¸öÀýÈçÃûΪ/dev/ptyMNµÄαÖÕ¶ËÖ÷Éè  
±¸£¬ÄÇô¶ÔÓ¦µÄ´ÓÉ豸µÄÃû³ÆÎª/dev/ttyMN¡£  
³ÌÐò19.2Öеĺ¯Êýptys_open´ò¿ª¸Ã´ÓÉ豸¡£ÎÒÃÇÔڸú¯ÊýÖе÷ÓÃchownºÍchmod£¬  
±ØÐëÒâʶµ½µ÷ÓÃÕâÁ½¸öº¯ÊýµÄ½ø³Ì±ØÐëÓг¬¼¶Óû§µÄȨÏÞ¡£Èç¹û±ØÐë¸Ä±äȨÏÞ±êÖ¾  
£¬ÄÇôÕâÁ½¸öº¯Êý±ØÐë·ÅÔÚÒ»¸öset_user_IDµÄrootÓû§µÄ¿ÉÖ´ÐгÌÐòÖУ¬ÕâÀàËÆ  
ÓÚ4.3+BSDϵͳϵÄgrantptº¯Êý¡£  
ÔÚ4.3+BSDϵͳ֮Ï´ò¿ªpty´ÓÉ豸²»¾ßÓÐÏó·ÖÅä×÷Ϊ¿ØÖÆÖն˵ÄÉ豸ÄÇÑùµÄ¸±×÷Óà 
¡£ÎÒÃǽ«ÔÚÏÂÒ»½Ú̽ÌÖÈçºÎÔÚ4.3+BSDϵͳÏ·ÖÅä¿ØÖÆÖÕ¶Ë¡£  
Õâ¸öº¯Êý³¢ÊÔ16¸ö²»Í¬µÄαÖÕ¶ËÖ÷É豸£º´Ó/dev/ptyp0µ½/dev/ptyTf¡£¾ßÌåÓÐЧµÄ  
ptyÉ豸ºÅÈ¡¾öÓÚÁ½¸öÒòËØ£º£¨a£©ÔÚÄÚºËÖÐÅäÖõĺÅÂ룻£¨b£©ÔÚ/devĿ¼ÏµÄÌØ  
ÊâÎļþºÅ¡£¶ÔÓÚÈκγÌÐòÀ´Ëµ£¬ÓÐЧµÄºÅÂëÊÇ£¨a£©ºÍ£¨b£©ÖнÏСµÄÒ»¸ö¡£²¢ÇÒ£¬  
¼´Ê¹£¨a£©ºÍ£¨b£©ÖÐСµÄÖµ´óÓÚ64£¬Ðí¶àÏÖÓеÄBSDÓ¦Óã¨telnetd£¬rlogind£¬µÈ  
µÈ£©»áËÑË÷³ÌÐò19.2ÖеÚÒ»¸öforÑ­»·ÖеÄ"pqrs"¡£  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        <grp.h>  
#include        "ourhdr.h"  
ʹÓã»ENOENT±íʾÉ豸²»´æÔÚ¡£ÔÚºóÒ»ÖÖÇé¿ö£¬ÎÒÃÇ¿ÉÒÔÍ£Ö¹ËÑË÷£¬ÒòΪËùÓеÄα  
ÖÕ¶ËÉ豸¶¼ÔÚ±»Ê¹ÓÃÖС£Ò»µ©ÎÒÃdzɹ¦´ò¿ªÒ»¸öÀýÈçÃûΪ/dev/ptyMNµÄαÖÕ¶ËÖ÷Éè  
±¸£¬ÄÇô¶ÔÓ¦µÄ´ÓÉ豸µÄÃû³ÆÎª/dev/ttyMN¡£  
³ÌÐò19.2Öеĺ¯Êýptys_open´ò¿ª¸Ã´ÓÉ豸¡£ÎÒÃÇÔڸú¯ÊýÖе÷ÓÃchownºÍchmod£¬  
±ØÐëÒâʶµ½µ÷ÓÃÕâÁ½¸öº¯ÊýµÄ½ø³Ì±ØÐëÓг¬¼¶Óû§µÄȨÏÞ¡£Èç¹û±ØÐë¸Ä±äȨÏÞ±êÖ¾  
£¬ÄÇôÕâÁ½¸öº¯Êý±ØÐë·ÅÔÚÒ»¸öset_user_IDµÄrootÓû§µÄ¿ÉÖ´ÐгÌÐòÖУ¬ÕâÀàËÆ  
ÓÚ4.3+BSDϵͳϵÄgrantptº¯Êý¡£  
ÔÚ4.3+BSDϵͳ֮Ï´ò¿ªpty´ÓÉ豸²»¾ßÓÐÏó·ÖÅä×÷Ϊ¿ØÖÆÖն˵ÄÉ豸ÄÇÑùµÄ¸±×÷Óà 
¡£ÎÒÃǽ«ÔÚÏÂÒ»½Ú̽ÌÖÈçºÎÔÚ4.3+BSDϵͳÏ·ÖÅä¿ØÖÆÖÕ¶Ë¡£  
Õâ¸öº¯Êý³¢ÊÔ16¸ö²»Í¬µÄαÖÕ¶ËÖ÷É豸£º´Ó/dev/ptyp0µ½/dev/ptyTf¡£¾ßÌåÓÐЧµÄ  
ptyÉ豸ºÅÈ¡¾öÓÚÁ½¸öÒòËØ£º£¨a£©ÔÚÄÚºËÖÐÅäÖõĺÅÂ룻£¨b£©ÔÚ/devĿ¼ÏµÄÌØ  
ÊâÎļþºÅ¡£¶ÔÓÚÈκγÌÐòÀ´Ëµ£¬ÓÐЧµÄºÅÂëÊÇ£¨a£©ºÍ£¨b£©ÖнÏСµÄÒ»¸ö¡£²¢ÇÒ£¬  
¼´Ê¹£¨a£©ºÍ£¨b£©ÖÐСµÄÖµ´óÓÚ64£¬Ðí¶àÏÖÓеÄBSDÓ¦Óã¨telnetd£¬rlogind£¬µÈ  
µÈ£©»áËÑË÷³ÌÐò19.2ÖеÚÒ»¸öforÑ­»·ÖеÄ"pqrs"¡£  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <sys/stat.h>  
#include        <errno.h>  
#include        <fcntl.h>  
#include        <grp.h>  
#include        "ourhdr.h"  
int  
ptym_open(char *pts_name)  
{  
        int             fdm;  
        char    *ptr1, *ptr2;  
        strcpy(pts_name, "/dev/ptyXY");  
          /* array index: 0123456789 (for references in following code) */  
        for (ptr1 = "pqrstuvwxyzPQRST"; *ptr1 != 0; ptr1++) {  
                pts_name[8] = *ptr1;  
                for (ptr2 = "0123456789abcdef"; *ptr2 != 0; ptr2++) {  
                        pts_name[9] = *ptr2;  
                                                /* try to open master */  
                        if ( (fdm = open(pts_name, O_RDWR)) < 0) {  
                                if (errno == ENOENT)    /* different from EIO */  
                                        return(-1);                     /* out o  
 pty devices */  
                                else  
                                        continue;                       /* try n  
xt pty device */  
                        }  
                        pts_name[5] = 't';      /* change "pty" to "tty" */  
                        return(fdm);            /* got it, return fd of master *  
   
                }  
        }  
        return(-1);             /* out of pty devices */  
}  
int  
ptys_open(int fdm, char *pts_name)  
{  
        struct group    *grptr;  
        int                             gid, fds;  
        if ( (grptr = getgrnam("tty")) != NULL)  
                gid = grptr->gr_gid;  
        else  
                gid = -1;               /* group tty is not in the group file */  
                        /* following two functions don't work unless we're root  
/  
        chown(pts_name, getuid(), gid);  
        chmod(pts_name, S_IRUSR | S_IWUSR | S_IWGRP);  
        if ( (fds = open(pts_name, O_RDWR)) < 0) {  
                close(fdm);  
                return(-1);  
        }  
        return(fds);  
}  
_______________________________________________________________________  
________  
³ÌÐò19.2                4.3+BSDϵͳϵÄαÖÕ¶Ëopenº¯Êý  
19.4   pty_forkº¯Êý  
ÏÖÔÚÎÒÃÇʹÓÃÉÏÒ»½ÚÖеÄÁ½¸öº¯Êý£ºptym_openºÍptys_open£¬±àдÎÒÃdzÆÖ®Îªpty  
_forkµÄº¯Êý¡£Õâ¸öк¯Êý¾ßÓÐÁËÈçϹ¦ÄÜ£º´ò¿ªÖ÷É豸ºÍ´ÓÉ豸£¬½¨Á¢×÷Ϊ»á»°  
¹ÜÀíÕßµÄ×Ó½ø³Ì²¢Ê¹Æä¾ßÓпØÖÆÖÕ¶Ë¡£  
#include <sys/types.h>  
#include <termios.h>  
#include <sys/ioctl.h>          /* 4.3+BSDϵͳÖУ¬ÔÚÕâÀﶨÒåÁËwinsize½á¹¹ */  
#include <ourhdr.h>  
pid_t pty_fork(int *ptrfdm, char *slave_name,  
                        const struct termios *slave_termios,  
                        const struct winsize *slave_winsize);  
·µ»Ø£ºÔÚ×Ó½ø³Ì·µ»Ø0£»ÔÚ¸¸½ø³Ì·µ»Ø×Ó½ø³ÌµÄ½ø³ÌID£»Óöµ½´íÎó·µ»Ø-1  
PtyÖ÷É豸µÄÎļþÃèÊö·ûͨ¹ýptrfdmÖ¸Õë·µ»Ø¡£  
Èç¹ûslave_name²»Îª¿Õ£¬´ÓÉ豸µÄÃû³Æ±»´æ·ÅÔÚ¸ÃÖ¸ÕëÖ¸ÏòµÄ´æ´¢ÇøÖС£µ÷ÓÃÕ߱ؠ 
ÐëΪ¸Ã´æ´¢Çø·ÖÅä¿Õ¼ä¡£  
Èç¹ûÖ¸Õëslave_termios²»Îª¿Õ£¬¸ÃÖ¸ÕëËùÒýÓõĽṹ½«´ÓÉ豸µÄÖÕ¶ËÐйæ³Ì³õʼ  
»¯¡£Èç¹û¸ÃÖ¸ÕëΪ¿Õ£¬ÏµÍ³½«´ÓÉ豸µÄtermios½á¹¹³õʼ»¯ÎªÒ»¸öÓɾßÌåÓ¦Óö¨Òå  
µÄ³õʼ״̬¡£ÀàËÆµÄ£¬Èç¹ûslave_winsizeÖ¸Õ벻Ϊ¿Õ£¬¸ÃÖ¸ÕëËùÒýÓõĽṹ½«´Ó  
É豸µÄ´°¿Ú´óС³õʼ»¯¡£Èç¹û¸ÃÖ¸ÕëΪ¿Õ£¬winsize½á¹¹Í¨³£±»³õʼ»¯Îª0¡£  
³ÌÐò19.3ÏÔʾÁËÕâ¸ö³ÌÐòµÄ´úÂë¡£µ÷ÓÃÏàÓ¦µÄptym_openºÍptys_openº¯Êý£¬Õâ¸öº¯  
ÊýÔÚSVR4ºÍ4.3+BSDϵͳ϶¼¿ÉÒÔʹÓᣠ 
ÔÚ´ò¿ªÎ±ÖÕ¶ËÖ÷É豸ºó£¬fork½«±»µ÷Óá£ÕýÈçÇ°ÃæÌáµ½µÄ£¬ÎÒÃÇÒªµÈµ½µ÷ÓÃsetid  
½¨Á¢ÐµĻỰºó²Åµ÷ÓÃptys_open¡£µ±µ÷ÓÃsetidʱ£¬×Ó½ø³Ì»¹²»ÊÇÒ»¸ö½ø³Ì×éµÄl  
eader£¨ÏëÒ»ÏëΪʲô£¿£©Òò´ËµÚ9.5½ÚÁгöµÄÈý¸ö²Ù×÷±»Ê¹Ó㺣¨a£©×Ó½ø³Ì×÷Ϊ  
¶Ô»°µÄ¹ÜÀíÕß´´½¨Ò»¸öеĶԻ°£»£¨b£©×Ó½ø³Ì´´½¨Ò»¸öеĽø³Ì×飻£¨c£©×Ó½ø³Ì  
ûÓпØÖÆÖÕ¶Ë¡£ÔÚSVR4ϵͳÖУ¬µ±µ÷ÓÃptys_openʱ£¬´ÓÉ豸³ÉΪÁË¿ØÖÆÖÕ¶Ë¡£ÔÚ  
4.3+BSDϵͳÖУ¬ÎÒÃDZØÐëµ÷ÓÃioctl²¢Ê¹ÓòÎÊýTIOCSCTTYÀ´·ÖÅäÒ»¸ö¿ØÖÆÖÕ¶Ë¡£  
È»ºótermiosºÍwinsizeÕâÁ½¸ö½á¹¹ÔÚ×Ó½ø³ÌÖб»³õʼ»¯¡£×îºó´ÓÉ豸µÄÎļþÃèÊö·û  
±»¸´ÖƵ½×Ó½ø³ÌµÄ±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼³ö´íÖС£Õâ±íʾÓÉ×Ó½ø³ÌËùexecµÄ½ø  
³Ì¶¼»á½«ÉÏÊöÈý¸ö¾ä±úͬαÖÕ¶Ë´ÓÉ豸ÁªÏµÆðÀ´¡£  
ÔÚµ÷ÓÃforkºó£¬¸¸½ø³Ì·µ»ØÎ±ÖÕ¶ËÖ÷É豸µÄÃèÊö·û²¢·µ»Ø¡£ÔÚÏÂÒ»½ÚÎÒÃǽ«ÔÚpty  
³ÌÐòÖÐʹÓÃpty_fork¡£  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <termios.h>  
#ifndef TIOCGWINSZ  
#include        <sys/ioctl.h>   /* 44BSD requires this too */  
#endif  
#include        "ourhdr.h"  
pid_t  
pty_fork(int *ptrfdm, char *slave_name,  
                 const struct termios *slave_termios,  
                 const struct winsize *slave_winsize)  
{  
        int             fdm, fds;  
        pid_t   pid;  
        char    pts_name[20];  
        if ( (fdm = ptym_open(pts_name)) < 0)  
                err_sys("can't open master pty: %s", pts_name);  
        if (slave_name != NULL)  
                strcpy(slave_name, pts_name);   /* return name of slave */  
        if ( (pid = fork()) < 0)  
                return(-1);  
        else if (pid == 0) {            /* child */  
                if (setsid() < 0)  
                        err_sys("setsid error");  
                                        /* SVR4 acquires controlling terminal on  
open() */  
                if ( (fds = ptys_open(fdm, pts_name)) < 0)  
                        err_sys("can't open slave pty");  
                        err_sys("dup2 error to stderr");  
                if (fds > STDERR_FILENO)  
                        close(fds);  
                return(0);              /* child returns 0 just like fork() */  
        } else {                                        /* parent */  
                *ptrfdm = fdm;  /* return fd of master */  
                return(pid);    /* parent returns pid of child */  
        }  
}  
_______________________________________________________________________  
________  
³ÌÐò19.3                pty_forkº¯Êý  
19.5   pty³ÌÐò  
дpty³ÌÐòµÄÄ¿µÄÊÇΪÁËÓüüÈë  
        pty prog arg1 arg2  
À´´úÌæ  
        prog arg1 arg2  
        ÕâÑùʹÎÒÃÇ¿ÉÒÔÓÃptyÀ´Ö´ÐÐÁíÒ»¸ö³ÌÐò£¬¸Ã³ÌÐòÔÚÒ»¸ö×Ô¼ºµÄ»á»°ÖÐÖ´ÐУ¬²¢ºÍ  
Ò»¸öαÖÕ¶ËÁ¬½Ó¡£  
        ÈÃÎÒÃÇ¿´ÒÔÏÂpty³ÌÐòµÄÔ´´úÂë¡£³ÌÐò19.4°üº¬mainº¯Êý¡£Ëüµ÷ÓÃÉÏÒ»½ÚµÄpty_f  
orkº¯Êý¡£  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <termios.h>  
#ifndef TIOCGWINSZ  
#include        <sys/ioctl.h>   /* 44BSD requires this too */  
#endif  
#include        "ourhdr.h"  
static void     set_noecho(int);        /* at the end of this file */  
void            do_driver(char *);      /* in the file driver.c */  
void            loop(int, int);         /* in the file loop.c */  
int  
main(int argc, char *argv[])  
{  
        int                             fdm, c, ignoreeof, interactive, noecho,  
erbose;  
        pid_t                   pid;  
        char                    *driver, slave_name[20];  
        struct termios  orig_termios;  
        struct winsize  size;  
        interactive = isatty(STDIN_FILENO);  
        ignoreeof = 0;  
        noecho = 0;  
        verbose = 0;  
        driver = NULL;  
        opterr = 0;             /* don't want getopt() writing to stderr */  
        while ( (c = getopt(argc, argv, "d:einv")) != EOF) {  
                switch (c) {  
                case 'd':               /* driver for stdin/stdout */  
                        driver = optarg;  
                        break;  
                case 'e':               /* noecho for slave pty's line disciplin  
 */  
                        noecho = 1;  
                        break;  
                case 'i':               /* ignore EOF on standard input */  
                        ignoreeof = 1;  
                        break;  
                case 'n':               /* not interactive */  
                        interactive = 0;  
                        break;  
                case 'v':               /* verbose */  
                        verbose = 1;  
                        break;  
                case '?':  
                        err_quit("unrecognized option: -%c", optopt);  
                }  
        }  
        if (optind >= argc)  
                err_quit("usage: pty [ -d driver -einv ] program [ arg ... ]");  
        if (interactive) {      /* fetch current termios and window size */  
                if (tcgetattr(STDIN_FILENO, &orig_termios) < 0)  
                        err_sys("tcgetattr error on stdin");  
                if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *) &size) < 0)  
                        err_sys("TIOCGWINSZ error");  
                pid = pty_fork(&fdm, slave_name, &orig_termios, &size);  
        } else  
                pid = pty_fork(&fdm, slave_name, NULL, NULL);  
        if (pid < 0)  
                err_sys("fork error");  
        else if (pid == 0) {            /* child */  
                if (noecho)  
                        set_noecho(STDIN_FILENO);       /* stdin is slave pty */  
                if (execvp(argv[optind], &argv[optind]) < 0)  
                        err_sys("can't execute: %s", argv[optind]);  
        }  
        if (verbose) {  
                        err_quit("unrecognized option: -%c", optopt);  
                }  
        }  
        if (optind >= argc)  
                err_quit("usage: pty [ -d driver -einv ] program [ arg ... ]");  
        if (interactive) {      /* fetch current termios and window size */  
                if (tcgetattr(STDIN_FILENO, &orig_termios) < 0)  
                        err_sys("tcgetattr error on stdin");  
                if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *) &size) < 0)  
                        err_sys("TIOCGWINSZ error");  
                pid = pty_fork(&fdm, slave_name, &orig_termios, &size);  
        } else  
                pid = pty_fork(&fdm, slave_name, NULL, NULL);  
        if (pid < 0)  
                err_sys("fork error");  
        else if (pid == 0) {            /* child */  
                if (noecho)  
                        set_noecho(STDIN_FILENO);       /* stdin is slave pty */  
                if (execvp(argv[optind], &argv[optind]) < 0)  
                        err_sys("can't execute: %s", argv[optind]);  
        }  
        if (verbose) {  
        stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);  
        stermios.c_oflag &= ~(ONLCR);  
                        /* also turn off NL to CR/NL mapping on output */  
        if (tcsetattr(fd, TCSANOW, &stermios) < 0)  
                err_sys("tcsetattr error");  
}  
_______________________________________________________________________  
________  
³ÌÐò19.4                pty³ÌÐòµÄmainº¯Êý  
        ÔÚÏÂÒ»½ÚÎÒÃǼì²âpty³ÌÐòµÄ²»Í¬Ê¹ÓÃʱ£¬½«»á̽ÌÖ²»Í¬µÄÐÐÃüÁîÑ¡Ïî¡£  
        ÔÚµ÷ÓÃpty_forkǰ£¬ÎÒÃÇÈ¡µÃÁËtermiosºÍwinsize½á¹¹µÄÖµ£¬½«Æä´«µÝ¸øpty_fo  
rk¡£Í¨¹ýÕâÖÖ·½·¨£¬Î±ÖÕ¶Ë´ÓÉ豸¾ßÓкÍÏÖÔÚµÄÖÕ¶ËÏàͬµÄ³õʼ״̬¡£  
        ´Ópty_fork·µ»Øºó£¬×Ó½ø³Ì¹Ø±ÕÁËαÖÕ¶Ë´ÓÉ豸µÄ»ØÏÔ£¬²¢µ÷ÓÃexecvpÀ´Ö´ÐÐÃü  
ÁîÐÐÖ¸¶¨µÄ³ÌÐò¡£ËùÓеÄÃüÁîÐÐÑ¡Ï³ÉΪ³ÌÐòµÄÑ¡Ïî¡£  
        ¸¸½ø³ÌÔÚµ÷ÓÃexitʱִÐÐÔ­ÏÈÉèÖõÄexit´¦Àí³ÌÐò£¬Ëü¸´Ô­ÖÕ¶Ë״̬£¬½«Óû§ÖÕ  
¶ËÉèÖÃΪ³õʼģʽ£¨¿ÉÑ¡£©¡£ÎÒÃǽ«ÔÚÏÂÒ»½ÚÌÖÂÛdo_driverº¯Êý¡£  
        ½ÓÏÂÀ´¸¸½ø³Ìµ÷Óú¯Êýloop£¨³ÌÐò19.5£©¡£¸Ãº¯Êý½ö½öÊǽ«ËùÓбê×¼ÊäÈ뿽±´µ½  
αÖÕ¶ËÖ÷É豸£¬²¢½«Î±ÖÕ¶ËÖ÷É豸ÊÕµ½µÄËùÓÐÄÚÈÝ¿½±´µ½±ê×¼Êä³ö¡£Í¬18.7½ÚÒ»Ñù  
£¬ÎÒÃÇÓÐÁ½¸öÑ¡Ôñ--Ò»¸ö½ø³Ì»¹ÊÇÁ½¸ö£¿ÎªÁËÓÐËùÇø±ð£¬ÎÒÃÇÔÚÕâÀïʹÓÃÁ½¸ö½ø³Ì  
£¬¾¡¹ÜʹÓÃselect»òpollµÄµ¥½ø³ÌÒ²ÊÇ¿ÉÐеġ£  
_______________________________________________________________________  
________  
#include        <sys/types.h>  
#include        <signal.h>  
#include        "ourhdr.h"  
#define BUFFSIZE        512  
static void     sig_term(int);  
static volatile sig_atomic_t    sigcaught;      /* set by signal handler */  
void  
loop(int ptym, int ignoreeof)  
{  
        pid_t   child;  
        int             nread;  
        char    buff[BUFFSIZE];  
        if ( (child = fork()) < 0) {  
                err_sys("fork error");  
        } else if (child == 0) {        /* child copies stdin to ptym */  
                for ( ; ; ) {  
                        if ( (nread = read(STDIN_FILENO, buff, BUFFSIZE)) < 0)  
                                err_sys("read error from stdin");  
                        else if (nread == 0)  
                                break;          /* EOF on stdin means we're done  
*/  
                        if (writen(ptym, buff, nread) != nread)  
                                err_sys("writen error to master pty");  
                }  
                        /* We always terminate when we encounter an EOF on stdin  
   
                           but we only notify the parent if ignoreeof is 0. */  
                if (ignoreeof == 0)  
                        kill(getppid(), SIGTERM);       /* notify parent */  
                exit(0);        /* and terminate; child can't return */  
        }  
                /* parent copies ptym to stdout */  
        if (signal_intr(SIGTERM, sig_term) == SIG_ERR)  
                err_sys("signal_intr error for SIGTERM");  
        for ( ; ; ) {  
                if ( (nread = read(ptym, buff, BUFFSIZE)) <= 0)  
                        break;          /* signal caught, error, or EOF */  
                if (writen(STDOUT_FILENO, buff, nread) != nread)  
                        err_sys("writen error to stdout");  
        }  
        /* There are three ways to get here: sig_term() below caught the  
         * SIGTERM from the child, we read an EOF on the pty master (which  
         * means we have to signal the child to stop), or an error. */  
        if (sigcaught == 0)     /* tell child if it didn't send us the signal */  
                kill(child, SIGTERM);  
        return;         /* parent returns to caller */  
}  
/* The child sends us a SIGTERM when it receives an EOF on  
 * the pty slave or encounters a read() error. */  
static void  
sig_term(int signo)  
{  
        sigcaught = 1;          /* just set flag and return */  
        return;                         /* probably interrupts read() of ptym */  
}  
_______________________________________________________________________  
________  
³ÌÐò19.5                loopº¯Êý  
        ×¢Ò⣬µ±Ê¹ÓÃÁ½¸ö½ø³Ìʱ£¬Èç¹ûÒ»¸öÖÕÖ¹£¬ÄÇôËü±ØÐë֪ͨÁíÒ»¸ö¡£ÎÒÃÇÓÃSIGT  
ERM½øÐÐÕâÖÖ֪ͨ¡£  
19.6   Ê¹ÓÃpty³ÌÐò  
½ÓÏÂÀ´ÎÒÃÇ¿´Ò»ÏÂpty³ÌÐòµÄ²»Í¬Àý×Ó£¬Á˽âÒ»ÏÂʹÓò»Í¬ÃüÁîÐÐÑ¡ÏîµÄ±ØÒªÐÔ¡£  
   
Èç¹ûʹÓÃKornShell£¬ÎÒÃÇÖ´ÐУº  
        pty ksh  
µÃµ½Ò»¸öÔËÐÐÔÚÒ»¸öαÖÕ¶ËϵÄеÄshell¡£  
        Èç¹ûÎļþttynameͬÎÒÃÇÔÚ³ÌÐò11.7¿´µ½µÄ³ÌÐòÏàͬ£¬ÎÒÃǿɰ´ÈçÏ·½Ê½Ö´ÐÐpty  
³ÌÐò£º  
$who  
stevens         console Feb     6       10:43  
stevens         ttyp0   Feb     6       15:00  
stevens         ttyp1   Feb     6       15:00  
stevens         ttyp2   Feb     6       15:00  
stevens         ttyp3   Feb     6       15:48  
stevens         ttyp4   Feb     7       14:28           ttyp4ÊÇÕýÔÚʹÓõÄ×î¸ßÖÕ¶  
É豸  
$pty ttyname                                                    ÔÚptyÉÏÔËÐгÌÐò1  
.7  
fd 0:           /dev/ttyp5                                      ttyp5ÊÇÏÂÒ»¸öÓÐР 
µÄptyÉ豸ºÅ  
fd 1:           /dev/ttyp5  
fd 2:           /dev/ttyp5  
utmpÎļþ  
ÔÚ6.7½Ú£¬ÎÒÃÇÌÖÂÛÁ˼Ǽµ±Ç°UnixϵͳµÇ¼Óû§µÄutmpÎļþ¡£ÄÇôÔÚαÖÕ¶ËÉÏÔË  
ÐгÌÐòµÄÓû§ÊÇ·ñ±»ÈÏΪµÇ¼ÁËÄØ£¿Èç¹ûÊÇÔ¶³ÌµÇ¼£¬telnetdºÍrlogind£¬ÏÔȻα  
ÖÕ¶ËÉϵÄÓû§Ó¦¸ÃÔÚutmpÖÐÓµÓÐÏàÓ¦ÌõÄ¿¡£µ«ÊÇ£¬´Ó´°¿Úϵͳ»òscript³ÌÐòÔËÐеĠ 
£¬ÔÚαÖÕ¶ËÉÏÔËÐÐshellµÄÓû§ÊÇ·ñÓ¦¸ÃÔÚutmpÖÐÓµÓÐÏàÓ¦ÌõÄ¿ÄØ£¿Õâ¸öÎÊÌâÒ»Ö±  
ûÓÐÒ»¸öͳһµÄÈÏʶ¡£ÓеÄϵͳÓмǼ£¬ÓеÄûÓС£Èç¹ûûÓмǼµÄ»°£¬who£¨1£©  
³ÌÐòÒ»°ã²»»áÏÔʾÕýÔÚ±»Ê¹ÓõÄαÖÕ¶Ë¡£  
³ý·ÇutmpÔÊÐíÆäËûÓû§µÄдȨÏÞ£¬·ñÔòÒ»°ãµÄ³ÌÐò½«²»ÄÜ¶ÔÆä½øÐÐд²Ù×÷¡£µ«ÊÇ£¬  
һЩϵͳÌṩÕâ¸öдȨÏÞ¡£  
×÷Òµ¿ØÖƽ»»¥  
µ±ÎÒÃÇÔÚptyÉÏÔËÐÐ×÷Òµ¿ØÖÆshellʱ£¬ËüÄܹ»Õý³£µØÔËÐС£ÀýÈ磬ÔÚptyÉÏÔËÐÐKo  
rnShell¡£ÎÒÃÇÄܹ»ÔÚÕâ¸öÐÂshellÏÂÔËÐгÌÐòºÍʹÓÃ×÷Òµ¿ØÖÆ£¬ÈçͬÔڵǼshell  
ÖÐÒ»Ñù¡£µ«Èç¹ûÔÚptyÏÂÎÒÃÇÔËÐÐÒ»¸ö½»»¥Ê½³ÌÐò¶ø²»ÊÇ×÷Òµ¿ØÖÆshell£¬±ÈÈ磺  
        pty cat  
Ò»ÇÐÕý³£Ö±µ½ÎÒÃǼüÈë×÷Òµ¿ØÖƵÄÔÝÍ£×Ö·û¡£ÔÚSVR4ºÍ4.3+BSDϵͳÖÐ×÷Òµ¿ØÖÆÔÝ  
Í£×Ö·û½«»á±»ÏÔʾΪ^Z¶ø±»ºöÂÔ¡£ÔÚSunOS4.1.2ÖУ¬cat½ø³ÌÖÕÖ¹£¬pty½ø³ÌÖÕÖ¹£¬  
ÎÒÃǻص½³õʼµÇ¼shell¡£  
        ÎªÁËÃ÷°×ÆäÖеÄÔ­Òò£¬ÎÒÃÇÐèÒª¼ì²éËùÓÐÏà¹ØµÄ½ø³Ì¡¢ÕâЩ½ø³ÌËùÊôµÄ½ø³Ì×éºÍ  
»á»°¡£Í¼19.7ÏÔʾÁËpty catÔËÐеĽṹͼ¡£  
ͼ19.7          pty catµÄ½ø³Ì×éºÍ»á»°  
   
µ±ÎÒÃǼüÈëÔÝÍ£×Ö·û£¨Control-Z£©£¬Ëü½«±»cat½ø³ÌϵÄÐйæ³ÌÄ£¿éËùʶ±ð£¬ÕâÊÇ  
ÒòΪpty½«ÖÕ¶Ë£¨ÔÚpty parent֮ϣ©ÉèÖÃΪ³õʼģʽ¡£µ«Äں˲»»áÖÕÖ¹cat½ø³Ì£¬  
ÕâÊÇÒòΪËüÊôÓÚÒ»¸ö¹Â¶ù½ø³Ì×飨9.10½Ú£©¡£catµÄ¸¸½ø³ÌÊÇptyµÄ¸¸½ø³Ì£¬ÊôÓÚÁí  
Ò»¸ö»á»°¡£  
 ²»Í¬µÄϵͳ´¦ÀíÕâ¸öÇé¿öµÄ·½·¨Ò²²»Í¬¡£ÔÚPOSIX.1ÖÐÕâ¸öSIGTSTPÐźŲ»±»·¢ËÍ  
¸ø½ø³Ì¡£ÔçÆÚµÄBerkleyϵͳ·¢ËÍÒ»¸ö½ø³ÌÉõÖÁ²»Äܲ¶»ñµÄSIGKILL¡£Õâ¾ÍÊÇÎÒÃÇÔÚ  
SunOS4.1.2Öп´µ½µÄ¡££¨POSIX.1 Rationale½¨ÒéÓÃSIGHUP×÷Ϊ¸üºÃµÄÌæ´ú£¬ÒòΪ  
½ø³ÌÄܹ»²¶»ñËü¡££©ÓóÌÐò8.17²é¿´cat½ø³ÌµÄÖÕֹ״̬£¬¿ÉÒÔ·¢Ïָýø³ÌȷʵÓÉ  
SIGKILLÐźÅÖÕÖ¹¡£  
 ÔÚSVR4ºÍ4.3+BSDϵͳÖУ¬ÎÒÃÇÐÞ¸ÄÁ˳ÌÐò10.22À´¹Û²ì½á¹û¡£Ð޸ĺóµÄ³ÌÐòÄܹ»  
ÔÚ²¶»ñSIGTSTPºó½øÐдòÓ¡£¬²¢ÔÚ²¶»ñSIGCONTÐźźóÔÙ´òÓ¡Ò»´Î²¢¼ÌÐøÖ´ÐС£Õâ˵  
Ã÷SIGTSTP±»½ø³Ì²¶»ñ£¬µ«Êǵ±½ø³ÌÊÔͼ·¢ËÍÐźŸø×Ô¼ºÀ´ÔÝÍ£±¾½ø³ÌµÄʱºò£¬ÄÚ  
ºËÁ¢¼´·¢ËÍSIGCONTÐźÅʹ֮¼ÌÐøÖ´ÐС£Äں˽«²»»áÈýø³Ì±»×÷Òµ¿ØÖÆÍ£Ö¹¡£SVR4  
ºÍ4.3+BSDϵͳµÄÕâÖÖ´¦Àí·½·¨±ÈÆð·¢ËÍÒ»¸öSIGKILLµÄ·½·¨À´ÏԵò»ÄÇô¼¤ÁÒ¡£  
 µ±ÎÒÃÇʹÓÃptyÀ´ÔËÐÐ×÷Òµ¿ØÖÆshellʱ£¬±»Õâ¸öÐÂshellµ÷ÓõÄ×÷Òµ½«²»ÊÇÈκι  
¶ù½ø³Ì×éµÄ³ÉÔ±£¬ÕâÊÇÒòΪ×÷Òµ¿ØÖÆshell×ÜÊÇÊôÓÚͬһ¸ö»á»°¡£ÔÚÕâÖÖÇé¿öÏ£¬  
Control-Z±»·¢Ë͵½±»shellµ÷ÓõĽø³Ì£¬¶ø²»ÊÇshell±¾Éí¡£  
 Î¨Ò»µÄÈñ»ptyµ÷ÓõĽø³ÌÄܹ»´¦Àí×÷Òµ´¦ÀíÐźŵķ½·¨ÊÇ£ºÁíÍâÔö¼ÓÒ»¸öÃüÁîÐР 
±êÖ¾ÈÃpty×Ó½ø³ÌÄܹ»×Ô¼ºÈÏʶ×÷ÒµÔÝÍ£×Ö·û£¬¶ø²»ÊÇÈøÃ×Ö·ûͨ¹ýÆäËûÐйæ³ÌÄ£  
¿é¡£  
¼ì²é³¤Ê±¼äÔËÐгÌÐòµÄÊä³ö  
ÁíÒ»¸öʹÓÃpty½øÐÐ×÷Òµ¿ØÖƽ»»¥µÄÀý×ÓÊÇͼ19.6¡£Èç¹ûÎÒÃÇÔËÐÐÒ»¸ö³ÌÐò£º  
 pty slowout > file.out &  
µ±×Ó½ø³ÌÊÔͼ´Ó±ê×¼ÊäÈ루ÖÕ¶Ë£©¶ÁÈëÊý¾Ýʱ£¬pty½ø³ÌÁ¢¿ÌÍ£Ö¹ÔËÐС£ÕâÊÇÒòΪ  
¸Ã×÷ÒµÊÇÒ»¸öºǫ́×÷Òµ²¢ÇÒµ±ËüÊÔͼ·ÃÎÊÖÕ¶Ëʱ»áʹ×÷Òµ¿ØÖÆÍ£Ö¹¡£Èç¹ûÎÒÃǽ«±ê  
×¼ÊäÈëÖØ¶¨ÏòʹµÃpty²»´ÓÖն˶ÁÈ¡Êý¾Ý£¬È磺  
 pty slowout < /dev/null > file.out &  
ÄÇôpty³ÌÐòÁ¢¼´ÖÕÖ¹£¬ÕâÊÇÒòΪËü´Ó±ê×¼ÊäÈë¶ÁÈ¡µ½Ò»¸öÎļþ½áÊø·û¡£½â¾öÕâ¸ö  
ÎÊÌâµÄ·½·¨ÊÇʹÓÃ-iÑ¡Ïî¡£Õâ¸öÑ¡ÏîµÄº¬ÒåÊǺöÂÔÀ´×Ô±ê×¼ÊäÈëµÄÎļþ½áÊø·û£º  
 pty -i slowout < /dev/null > file.out &  
Õâ¸ö±êÖ¾µ¼ÖÂÔÚÓöµ½Îļþ½áÊø·ûʱ£¬³ÌÐò19.5µÄ×Ó½ø³ÌÖÕÖ¹£¬µ«×Ó½ø³Ì²»»áʹ¸¸½ø  
³ÌÒ²ÖÕÖ¹¡£Ïà·´µÄ£¬¸¸½ø³ÌÒ»Ö±½«Î±ÖÕ¶Ë´ÓÉ豸µÄÊä³ö¿½±´µ½±ê×¼Êä³ö£¨±¾ÀýÖеĠ 
file.out£©¡£  
script³ÌÐò  
ʹÓÃpty³ÌÐò£¬ÎÒÃÇ¿ÉÒÔÓÃÏÂÃæµÄ·½Ê½ÊµÏÖBSDϵͳÖеÄscript£¨1£©³ÌÐò¡£  
 #!/bin/sh  
 pty  "${SHELL:-/bin/sh}" | tee typescript  
Ò»µ©Ö´ÐÐÕâ¸öscript³ÌÐò£¬ÎÒÃÇ¿ÉÒÔÔËÐÐpsÀ´¹Û²ì½ø³ÌÖ®¼äµÄ¹ØÏµ¡£Í¼19.8ÏÔʾÁË  
ÕâЩ¹ØÏµ¡£  
ͼ19.8 ÓÃshell³ÌÐòʵÏÖµÄscriptµÄÓйؽø³Ì  
ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃǼÙÉèSHELL±äÁ¿ÊÇKornShell£¨¿ÉÄÜÊÇ/dev/ksh£©¡£ÕýÈçÎÒÃÇǰ  
ÃæÌáµ½µÄ£¬script½ö½öÊǽ«ÐµÄshell£¨ºÍËùÓеÄ×Ó½ø³Ì£©µÄÊä³ö¿½±´³öÀ´£¬µ«ÊÇ  
ÒòΪαÖÕ¶Ë´ÓÉ豸ÉϵÄÐйæ³ÌÄ£¿éͨ³£ÔÊÐí»ØÏÔ£¬¾ø´ó¶àÊýÎÒÃǵļüÈë¶¼±»Ð´µ½t  
ypescriptÎļþÖÐÈ¥¡£  
ÔËÐÐЭͬ½ø³Ì  
ÔÚ³ÌÐò14.9ÖУ¬ÎÒÃDz»ÄÜÈÃЭͬ½ø³ÌʹÓñê×¼ÊäÈë/Êä³öº¯Êý£¬ÆäÔ­ÒòÊDZê×¼ÊäÈë  
ºÍÊä³ö²»ÊÇÖÕ¶Ë£¬ËûÃǵÄÊäÈëºÍÊä³ö½«±»·Åµ½»º³åÇøÖС£Èç¹ûÎÒÃÇÓà 
if (execl("./pty", "pty", "-e", "add2", (char *) 0) < 0)  
Ìæ´ú  
 if (execl("./add2", "add2", (char *) 0) < 0)  
ÔÚptyÏÂÔËÐÐЭͬ½ø³Ì£¬¸Ã³ÌÐò¼´Ê¹Ê¹ÓÃÁ˱ê×¼ÊäÈë/Êä³öÈÔÈ»¿ÉÒÔÕýÈ·ÔËÐС£  
 Í¼19.9ÏÔʾÁËÔÚʹÓÃαÖÕ¶Ë×÷ΪЭͬ½ø³ÌµÄÊäÈë/Êä³öµÄÇé¿öÏ£¬½ø³ÌÔËÐеÄÏ໥  
½á¹¹¡£¿òÖеÄ"driving program"ÊÇÇ°ÃæÌáµ½¹ýµÄ¸Ä±äÁËexeclµÄ³ÌÐò14.9¡£ÕâÊÇͼ  
19.5µÄÒ»¸öÀ©³ä£¬ËüÏÔʾÁËËùÓеĽø³Ì¼äÁªÏµºÍÊý¾ÝÁ÷¡£  
ͼ19.9 ÔËÐÐһЭͬ½ø³Ì£¬ÒÔpty×÷ΪÆäÊäÈëºÍÊä³ö  
 Õâ¸öÀý×ÓÏÔʾÁËpty³ÌÐòµÄ-e£¨²»»ØÏÔ£©¿ª¹ØµÄÖØÒªÐÔ¡£pty²»ÊÇÒÔ½»»¥·½Ê½ÔËÐР 
µÄ£¬ÕâÊÇÒòΪËüµÄ±ê×¼ÊäÈë²»ÊÇÒ»¸öÖÕ¶Ë¡£ÔÚ³ÌÐò19.4ÖÐinteractive±ê־ȱʡÊÇ  
false£¬ÕâÊÇÒòΪ¶Ôisattyµ÷Óõķµ»Ø½á¹ûÊÇfalse¡£ÕâÒâζ×ÅÔÚÕæÕýµÄÖÕ¶ËÖ®ÉϵĠ 
Ðйæ³Ì±£³ÖÔÚµäÐÍģʽϲ¢ÔÊÐí»ØÏÔ¡£Ö¸¶¨-eÑ¡Ïîºó£¬ÎÒÃǹصôÁËÔÚαÖÕ¶Ë´ÓÉ豸  
µÄÉϵÄÐйæ³ÌÄ£¿éµÄ»ØÏÔ¡£Èç¹ûÎÒÃDz»ÕâÑù×ö£¬ÎÒÃǼüÈëµÄÿһ¸ö×Ö·û¶¼½«±»Á½¸ö  
Ðйæ³ÌÄ£¿éÏÔʾÁ½´Î¡£  
ÎÒÃÇ»¹ÒªÓÃ-eÑ¡Ïî¹Ø±Õtermios½á¹¹µÄONLCR±êÖ¾£¬·ÀÖ¹ËùÓеÄЭͬ½ø³ÌµÄÊä³ö±»»Ø  
³µºÍ»»ÐзûÖÕÖ¹¡£  
ÔÚ²»Í¬µÄϵͳÉϲâÊÔÕâ¸öÀý×Ó»áÓöµ½ÎÒÃÇÔÚ12.8½ÚÖÐÃèÊöreadnºÍwritenº¯ÊýʱÌá  
µ½µÄÎÊÌâ¡£µ±ÃèÊö·û²»ÊÇÒýÓÃÆÕͨµÄ´ÅÅÌÎļþʱ£¬´Óread·µ»ØµÄ¶ÁÈ¡Êý¾ÝÁ¿¿ÉÄÜÒò  
ʵÏÖ²»Í¬¶øÓÐËùÇø±ð¡£Ð­Í¬½ø³ÌʹÓÃptyʱ£¬Èç¹ûµ÷ÓÃͨ¹ý¹ÜµÀµÄread¶ø·µ»Ø½á¹û  
²»µ½Ò»ÐУ¬½«Êä³ö²»¿ÉÔ¤²âµÄ½á¹û¡£½â¾öµÄ·½·¨²»ÊÇʹÓóÌÐò14.9¶øÊÇÐ޸ĹýµÄʹ  
Óñê×¼ÊäÈë/Êä³ö¿âµÄÁ·Ï°14.5µÄ³ÌÐò£¬½«Á½¸ö¹ÜµÀ¶¼ÉèÖÃΪÐлº³åµÄ¡£ÕâÑùfget  
sº¯Êý½«»á¶ÁÍêÒ»¸öÕûÐÐΪֹ¡£³ÌÐò14.9µÄwhileÑ­»·¼ÙÉèË͵½Ð­Í¬½ø³ÌµÄÿһÐж¼  
»á´øÀ´Ò»Ðеķµ»Ø½á¹û¡£  
Ó÷ǽ»»¥Ä£Ê½Çý¶¯½»»¥Ê½µÄ³ÌÐò  
ËäÈ»ÈÃptyÔËÐÐËùÓеÄЭͬ½ø³ÌÊǷdz£ÓÕÈ˵ÄÏë·¨£¬µ«Èç¹ûЭͬ½ø³ÌÊǽ»»¥Ê½µÄ£¬  
¾Í²»ÄÜÕý³£¹¤×÷¡£ÎÊÌâÔÚÓÚptyÖ»Êǽ«Æä±ê×¼ÊäÈë¸´ÖÆµ½pty£¬²¢½«À´×ÔptyµÄ¸´ÖÆ  
µ½Æä±ê×¼Êä³ö¡£¶ø²¢²»¹ØÐľßÌåµÃµ½Ê²Ã´Êý¾Ý¡£  
¾Ù¸öÀý×Ó£¬ÎÒÃÇ¿ÉÒÔÔÚptyÔËÐÐ18.7½ÚµÄcall¿Í»§¶ËÖ±½Ó¿ØÖÆmodem£º  
pty call t2500  
ÕâÑù×ö²»±ÈÖ±½Ó¼üÈëcall t2500ÓÐʲôÓŵ㣬µ«ÎÒÃÇ¿ÉÄÜÏ£Íû´ÓÒ»¸öscriptÔËÐÐc  
all³ÌÐòÀ´È¡µÃmodemµÄһЩÄÚ²¿¼Ä´æÆ÷µÄÄÚÈÝ¡£Èç¹ût2500.cmd°üÀ¨Á½ÐУº  
 aatn?  
~.  
µÚÒ»ÐдòÓ¡³ömodemµÄ¼Ä´æÆ÷Öµ£¬µÚ¶þÐÐÖÕÖ¹call³ÌÐò¡£µ«ÊÇÈç¹ûÎÒÃÇÔËÐУº  
 pty -I < t2500.cmd call t2500  
½á¹û¾Í²»ÊÇÎÒÃÇÏ£ÍûµÃµ½µÄ¡£ÊÂʵÉÏÎļþt2500.cmdµÄÄÚÈÝÊ×Ïȱ»Ë͵½ÁËmodem¡£µ±  
ÎÒÃǽ»»¥ÔËÐÐcall³ÌÐòʱÎÒÃǵȴýmodemµÄ"connected"£¬µ«ÊÇpty³ÌÐò²»ÖªµÀÕâÑù  
×ö¡£Õâ¾ÍÊÇΪʲôÐèÒª±Èpty¸üÇÉÃîµÄ³ÌÐò£¬Èçexpect£¬À´´ÓscriptÎļþÔËÐн»»¥  
ʽ³ÌÐò¡£  
 ÔÚptyÉϼ´Ê¹ÔËÐгÌÐò14.9Ò²²»ÄÜÕý³£¹¤×÷£¬ÕâÊÇÒòΪ³ÌÐò14.9ÈÏΪËüÔÚÒ»¸ö¹ÜµÀ  
дÈëµÄÿһÐж¼»áÔÚÁíÒ»¸ö¹ÜµÀ²úÉúÒ»ÐС£¶øÇÒ£¬14.9³ÌÐò×ÜÊÇÏÈ·¢ËÍÒ»Ðе½ÏµÍ³  
½ø³Ì£¬È»ºóÔÙ¶ÁȡһÐС£ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇÐèÒªÏÈÊÕµ½ÐÐ"ÒÑÁ¬½Ó"£¬È»ºóÔÙ·¢  
ËÍÊý¾Ý¡£  
 ÕâÀïÓÐһЩͨ¹ýscriptÇý¶¯½»»¥Ê½³ÌÐòµÄ·½·¨¡£ÎÒÃÇ¿ÉÒÔÔÚptyÉÏÔö¼ÓÒ»ÖÖÃüÁîÓï  
ÑÔºÍÒ»¸ö½âÊÍÆ÷¡£µ«ÊÇÒ»¸öÊʵ±µÄÃüÁîÓïÑÔ¿ÉÄÜÊ®±¶ÓÚpty³ÌÐòµÄ´óС¡£ÁíÒ»ÖÖ·½  
·¨ÊÇʹÓÃÃüÁîÓïÑÔ²¢ÓÃpty_forkº¯ÊýÀ´µ÷Óý»»¥Ê½³ÌÐò£¬ÕâÕýÊÇexpect³ÌÐòËù×öµÄ  
¡£  
 ÎÒÃǽ«²ÉÓÃÒ»ÖÖ²»Í¬µÄ·½·¨£¬Ê¹ÓÃÑ¡Ïî-dÈÃpty³ÌÐòͬһ¸ö¹ÜÀíÊäÈëºÍÊä³öµÄÇý¶¯  
½ø³ÌÁ¬½ÓÆðÀ´¡£¸ÃÇý¶¯½ø³ÌµÄ±ê×¼Êä³öÊÇptyµÄ±ê×¼ÊäÈ룬·´Ö®ÒàÈ»¡£ÕâÓеãÏóЭ  
ͬ½ø³Ì£¬Ö»ÊÇÔÚptyµÄ"ÁíÒ»±ß"¡£´ËÖÖ½ø³Ì½á¹¹Óëͼ19.9ÖÐËùʾµÄ¼¸ºõÏàͬ£¬µ«ÊÇ  
ÔÚÕâÖÖÇé¿öÏÂÓÉptyÀ´Íê³ÉÇý¶¯½ø³ÌµÄforkºÍexec¡£¶øÇÒÎÒÃǽ«ÔÚptyºÍÇý¶¯½ø³ÌÖ®  
¼äʹÓÃÒ»¸öµ¥¶ÀµÄ¹ÜµÀ£¬¶ø²»ÊÇÁ½¸ö°ëË«¹¤¹ÜµÀ¡£  
 ³ÌÐò19.6ÊÇdo_driverº¯ÊýµÄÔ´´úÂ룬¸Ãº¯Êý±»19.4½Úpty³ÌÐòµÄmainº¯ÊýÔÚʹÓà 
-dÑ¡Ïîʱµ÷Óᣠ 
_______________________________________________________________________  
________  
#include <sys/types.h>  
#include <signal.h>  
#include "ourhdr.h"  
void  
do_driver(char *driver)  
{  
 pid_t child;  
 int  pipe[2];  
  /* create a stream pipe to communicate with the driver */  
 if (s_pipe(pipe) < 0)  
  err_sys("can't create stream pipe");  
 if ( (child = fork()) < 0)  
  err_sys("fork error");  
 else if (child == 0) {   /* child */  
  close(pipe[1]);  
    /* stdin for driver */  
  if (dup2(pipe[0], STDIN_FILENO) != STDIN_FILENO)  
   err_sys("dup2 error to stdin");  
    /* stdout for driver */  
  if (dup2(pipe[0], STDOUT_FILENO) != STDOUT_FILENO)  
   err_sys("dup2 error to stdout");  
  close(pipe[0]);  
    /* leave stderr for driver alone */  
  execlp(driver, driver, (char *) 0);  
  err_sys("execlp error for: %s", driver);  
 }  
 close(pipe[0]);  /* parent */  
 if (dup2(pipe[1], STDIN_FILENO) != STDIN_FILENO)  
  err_sys("dup2 error to stdin");  
 if (dup2(pipe[1], STDOUT_FILENO) != STDOUT_FILENO)  
  err_sys("dup2 error to stdout");  
 close(pipe[1]);  
 /* Parent returns, but with stdin and stdout connected  
    to the driver. */  
}  
_______________________________________________________________________  
________  
³ÌÐò19.6  pty³ÌÐòµÄdo_driverº¯Êý  
ͨ¹ýд×Ô¼ºµÄÇý¶¯³ÌÐòµÄ·½·¨£¬ÎÒÃÇ¿ÉÒÔËæÒâµØÇý¶¯½»»¥Ê½³ÌÐò¡£¼´Ê¹Çý¶¯³ÌÐòÓР 
ºÍptyÁ¬½ÓÔÚÒ»ÆðµÄ±ê×¼ÊäÈëºÍ±ê×¼Êä³ö£¬ËüÈÔÈ»¿ÉÒÔͨ¹ý/dev/ttyͬÓû§½»»¥¡£  
Õâ¸ö½â¾ö·½·¨ÈÔ²»Èçexpect³ÌÐòͨÓ㬵«ÊÇËüÌṩÁËÒ»ÖÖ²»µ½50ÐдúÂëµÄÑ¡Ôñ·½°¸  
¡£  
19.7  ÆäËûÌØÐÔ  
αÖÕ¶Ë»¹ÓÐÆäËûÌØÐÔ£¬ÎÒÃÇÔÚÕâÀï¼òÂÔÌáһϡ£AT&T[1990d]ºÍ4.3+BSDϵͳµÄ²Ù×÷  
ÊÖ²áÓиüÏêϸµÄÄÚÈÝ¡£  
´ò°üģʽ  
´ò°üģʽÄܹ»Ê¹Î±ÖÕ¶ËÖ÷É豸Á˽⵽αÖÕ¶Ë´ÓÉ豸µÄ״̬±ä»¯¡£ÔÚSVR4ϵͳÖпÉÒÔ  
½«Á÷Ä£¿épckt·Åµ½Ö÷É豸¶ËÀ´ÉèÖÃÕâÖÖģʽ¡£Í¼19.2ÏÔʾÁËÕâÖÖ¿Éѡģʽ¡£ÔÚ4.3  
+BSDϵͳÖпÉÒÔͨ¹ýTIOCPKTµÄioctlÀ´ÉèÖÃÕâÖÖģʽ¡£  
SVR4ºÍ4.3+BSDϵͳÖоßÌåµÄ´ò°üģʽÓÐËù²»Í¬¡£ÔÚSVR4ϵͳÖУ¬¶ÁȡαÖÕ¶ËÖ÷Éè  
±¸µÄ½ø³Ì±ØÐëµ÷ÓÃgetmsg´ÓÁ÷ÖÐÈ¡µÃÊý¾Ý£¬ÕâÊÇÒòΪpcktÄ£¿é½«Ò»Ð©Ê¼þת»¯ÎªÎÞ  
Êý¾ÝµÄÁ÷ÏûÏ¢¡£ÔÚ4.3+BSDϵͳÖÐÿһ´Î´ÓαÖÕ¶ËÖ÷É豸µÄ¶Á²Ù×÷¶¼»áÔÚ¿ÉÑ¡Êý¾Ý  
Ö®ºó·µ»Ø×´Ì¬×Ö½Ú¡£  
ÎÞÂÛʵÏֵķ½·¨ÊÇʲôÑùµÄ£¬´ò°üģʽµÄÄ¿µÄÊÇ£¬µ±Î±ÖÕ¶Ë´ÓÉ豸֮ÉϵÄÐйæ³ÌÄ£  
¿é³öÏÖÒÔÏÂʼþʱ£¬Í¨Öª½ø³Ì´ÓαÖÕ¶ËÖ÷É豸¶ÁÈ¡Êý¾Ý£ºµ±¶ÁÈë¶ÓÁб»Ë¢Ð£»µ±Ð´  
³ö¶ÓÁб»Ë¢Ð£»µ±Êä³ö±»Í£Ö¹£¨È磺Control-S£©£»µ±Êä³öÖØÐ¿ªÊ¼£»µ±XON/XOFF  
Á÷¿ª¹Ø±»¹Ø±ÕºóÖØÐ´ò¿ª£»µ±XON/XOFFÁ÷¿ª¹Ø±»´ò¿ªºóÖØÐ¹رա£ÕâЩʼþ±»rlo  
gin serverºÍrlogin clientµÈʹÓᣠ 
Ô¶³Ìģʽ  
 Î±ÖÕ¶ËÖ÷É豸¿ÉÒÔÓÃTIOCREMOTEµÄioctl½«Î±ÖÕ¶Ë´ÓÉ豸ÉèÖóÉÔ¶³Ìģʽ¡£ËäÈ»S  
VR4ºÍ4.3+BSDϵͳʹÓÃͬÑùµÄÃüÁîÀ´´ò¿ª»ò¹Ø±ÕÕâ¸öÌØÐÔ£¬µ«ÊÇÔÚSVR4ϵͳÖÐioc  
tlµÄµÚÈý¸ö²ÎÊýÊÇÕûÊý¶ø4.3+BSDÖÐÊÇÕûÊýµÄÖ¸Õë¡£  
µ±Î±ÖÕ¶ËÖ÷É豸½«Î±ÖÕ¶Ë´ÓÉ豸ÉèÖóÉÕâÖÖģʽʱ£¬ËüÊÇ֪ͨαÖÕ¶Ë´ÓÉ豸֮ÉϵĠ 
Ðйæ³ÌÄ£¿é¶Ô´ÓÖ÷É豸ÊÕµ½µÄÈκÎÊý¾Ý¶¼²»Òª½øÐд¦Àí£¬ÎÞÂÛËüÊDz»ÊÇ´ÓÉ豸µÄt  
ermios½á¹¹µÄ¹æ·¶»ò·Ç¹æ·¶±êÖ¾¡£Ô¶³ÌģʽÊÊÓÃÓÚ´°¿Ú¹ÜÀíÆ÷ÕâÖÖ½øÐÐ×Ô¼ºµÄÐбࠠ
¼­µÄÓ¦ÓÃģʽ¡£  
´°¿Ú´óС±ä»¯  
 Î±ÖÕ¶ËÖ÷É豸ÉϵĽø³Ì¿ÉÒÔÓÃTIOCSWINSZµÄioctlÀ´ÉèÖôÓÉ豸µÄ´°¿ÚµÄ´óС¡£Èç  
¹ûеĴóСºÍÀϵIJ»Í¬£¬Ò»¸öSIGWINCHÐźŽ«±»·¢Ë͵½Î±ÖÕ¶Ë´ÓÉ豸µÄǰ̨½ø³Ì×é  
¡£  
Ðźŷ¢Éú  
 ¶ÁдαÖÕ¶ËÖ÷É豸µÄ½ø³Ì¿ÉÒÔÏòαÖÕ¶Ë´ÓÉ豸µÄ½ø³Ì×é·¢ËÍÐźš£ÔÚSVR4ϵͳ£¬  
¿ÉÒÔͨ¹ýTIOCSIGNALµÄioctlÍê³ÉÕâ¸ö¹¦ÄÜ£¬µÚÈý¸ö²ÎÊý¾ÍÊÇÐźŵÄÊýÖµ¡£ÔÚ4.3+  
BSDÖÐͨ¹ýTIOCSIGµÄioctlÀ´Íê³É£¬µÚÈý¸ö²ÎÊý¾ÍÊÇÐźűàºÅÖµµÄÖ¸Õë¡£  
19.8  ÕªÒª  
 ±¾ÕÂÊ×ÏÈ˵Ã÷ÁËÔÚSVR4ºÍ4.3+BSDϵͳÖдò¿ªÎ±Öն˵ĴúÂ롣ȻºóÓô˴úÂëÌṩÁË  
ÓÃÓÚ¶àÖÖ²»Í¬Ó¦ÓõÄͨÓõÄpty_forkº¯Êý¡£Õâ¸öº¯ÊýÊÇС³ÌÐò£¨pty£©µÄ»ù´¡¡£²¢  
ÇÒÌÖÂÛÁËÐí¶àαÖն˵ÄÊôÐÔ¡£  
 Î±ÖÕ¶ËÔÚ´ó¶àÊýUNIXϵͳÖÐÿÌì¶¼±»ÓÃÀ´½øÐÐÍøÂçµÇ¼¡£ÎÒÃǼì²éÁËαÖն˵ÄÐí  
¶àÆäËûÓÃ;£¬´Óscript³ÌÐòµ½ÓÃÅú´¦ÀíscriptÀ´Çý¶¯½»»¥Ê½³ÌÐò¡£  
ϰÌâ  
19.1 µ±ÎÒÃÇÓÃtelnet»òrloginÔ¶³ÌµÇ¼µ½Ò»¸öBSDϵͳÉÏʱ£¬ÏóÎÒÃÇÔÚ19.3.2С½á  
ÌÖÂÛ¹ýµÄÄÇÑù£¬Î±ÖÕ¶Ë´ÓÉ豸µÄËùÓÐÕߺÍȨÏÞ±»ÉèÖ᣸ùý³ÌÊÇÈçºÎ·¢ÉúµÄ£¿  
19.2 ÐÞ¸Ä4.3+BSDϵͳÖеÄptys_openº¯Êý£¬Ê¹Ö®µ÷ÓÃÒ»¸öset-user-ID³ÌÐòÀ´¸Ä±ä  
αÖÕ¶Ë´ÓÉ豸µÄËùÓÐÕߺÍȨÏÞ£¨ÏóSVR4ϵͳÖеÄgrantptº¯ÊýËù×öµÄ£©¡£  
19.3 Ê¹ÓÃpty³ÌÐòÀ´¾ö¶¨ÄãµÄϵͳ³õʼ»¯termios½á¹¹ºÍwinsize½á¹¹µÄÖµ¡£  
19.4 ÖØÐ´loopº¯Êý£¨³ÌÐò19.5£©£¬Ê¹Ö®³ÉΪһ¸öʹÓÃselect»òpollµÄµ¥¸ö½ø³Ì¡£  
   
19.5 ÔÚ×Ó½ø³ÌÖУ¬pty_fork·µ»Øºó£¬±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼³ö´í¶¼ÒÔ¶Áд·½  
ʽ´ò¿ª¡£ÄãÄܹ»½«±ê×¼ÊäÈë±ä³ÉÖ»¶ÁµÄ£¬ÁíÁ½¸ö±ä³ÉֻдµÄÂ𣿠 
19.6 ÔÚͼ19.7ÖУ¬Ö¸³öÄĸö½ø³Ì×éÊÇǰ̨µÄ£¬Äĸö½ø³Ì×éÊǺǫ́µÄ£¬²¢Ö¸³ö»á»°  
¹ÜÀíÕß¡£  
19.7 ÔÚͼ19.7ÖУ¬µ±ÎÒÃǼüÈëÎļþÖÕ½á·ûʱ£¬½ø³ÌÖÕÖ¹µÄ˳ÐòÊÇʲô£¿Èç¹û¿ÉÄÜ  
µÄ»°£¬Óýø³Ì¼ÆÊýÀ´ÐÞ¸ÄÖ®¡£  
19.8 script£¨1£©³ÌÐòͨ³£ÔÚ¿ªÊ¼Ê±ÔÚÊä³öÎļþÍ·Ôö¼ÓÒ»ÐУ¬ÔÚ½áÊøÊ±ÔÚÊä³öÎļþ  
ĩβÔö¼ÓÒ»ÐС£½«Õâ¸öÌØÐÔ¼Óµ½ÎÒÃÇչʾµÄ¼òµ¥shell½Å±¾ÖС£  
19.9 ½âÊÍΪʲôÔÚÏÂÃæµÄÀý×ÓÖУ¬ÎļþdataµÄÄÚÈݱ»Êä³öµ½ÖÕ¶ËÉÏ£¬¶ø³ÌÐòttyn  
ameÖ»²úÉúÊä³ö¶ø´Ó²»¶ÁÈ¡ÊäÈë¡£  
$ cat data    Ò»¸öÓÐÁ½ÐеÄÎļþ  
hello,  
world  
$ pty -I < data ttyname  -i Ö¸ºöÂÔstdinµÄÎļþ½áÊø±êÖ¾  
 
hello,  
world  
fd 0: /dev/ttyp5   ÎÒÃÇÆÚÍûttynameÊä³öÕâÈýÐР 
fd 1: /dev/ttyp5  
fd 2: /dev/ttyp5  
19.10 Ð´Ò»¸öµ÷ÓÃpty_forkµÄ³ÌÐò£¬¸Ã³ÌÐòÓÐÒ»¸ö×Ó½ø³Ì£¬¸Ã×Ó½ø³ÌexecÁíÒ»¸öÄã  
дµÄ³Ì  Ðò¡£×Ó½ø³Ìµ÷ÓõÄеijÌÐòÄܹ»²¶»ñSIGTERMºÍSIGWINCH¡£µ±²¶»ñµ½ÏûÏ¢  
ʱ£¬¸Ã³ÌÐòÒª´òÓ¡³öÀ´£¬²¢ÇÒ¶ÔÓÚºóÒ»ÖÖÏûÏ¢£¬»¹Òª´òÓ¡ÖÕ¶Ë´°¿Ú´óС¡£È»ºóÈø¸  
½ø³ÌÏòÎÒÃÇÔÚ19.7½ÚÃèÊö¹ýµÄ£¬ÓÐioctlµÄαÖÕ¶Ë´ÓÉ豸µÄ½ø³Ì×é·¢ËÍSIGTERMÏûÏ¢  
¡£´ÓαÖÕ¶Ë´ÓÉ豸¶Á»ØÏûÏ¢ÑéÖ¤ÎÒÃDz¶»ñµÄÏûÏ¢¡£½ÓÏÂÀ´Óø¸½ø³ÌÉèÖÃαÖÕ¶Ë´ÓÉè  
±¸´°¿ÚµÄ´óС£¬²¢¶Á»ØÎ±ÖÕ¶Ë´ÓÉ豸µÄÊä³ö¡£Èø¸½ø³ÌÍ˳ö²¢È·¶¨ÊÇ·ñҪαÖÕ¶Ë´Ó  
É豸½ø³ÌÒ²ÖÕÖ¹£¬Èç¹ûÒªÖÕÖ¹£¬Ó¦ÈçºÎÖÕÖ¹£¿  
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

BBSˮľÇ廪վ¡Ã¾«»ªÇø