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

·¢ÐÅÈË: wshu (Ê÷ÉϵÄÀÏ»¢), ÐÅÇø: Unix 
±ê  Ìâ: UNIX FAQ ÖÐÎİæ(ËÄ) 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Mon May 19 10:12:11 1997) 
 
±¾ÆªÎÄÕ»شðÒÔÏÂÎÊÌâ: 
  
       4.1)  ÒªÈçºÎÔÚʹÓÃÕß²»±Ø°´ RETURN µÄÇé¿öÏ´Ӡterminal ¶Á½ø¶«Î÷£¿ 
       4.2)  ÎÒÒªÈçºÎÔÚÎ´ÔøÕæµÄ¶Á½ø¶«Î÷µÄÇé¿öϼì²éÊÇ·ñÓÐ×ÖÔªµÈ´ý¶ÁÈ¡£¿ 
       4.3)  ÒªÔõÑù²ÅÄܵÃÖªÒ»¸öÒÑopen µµ°¸Ö®µµÃû£¿ 
       4.4)  Ò»¸öÖ´ÐÐÖеijÌʽÈçºÎÖªµÀ×Ô¼ºµÄ pathname? 
       4.5)  ÈçºÎÓàpopen() ¶ÔÒ»¸ö process ×ö¶ÁдµÄ¶¯×÷£¿ 
       4.6)  ÔÚ C ³ÌʽÖÐÒªÔõôÓàsleep() ²ÅÄܹ» sleep Ð¡ÓÚÒ»Ã룿 
       4.7)  ÈçºÎÈàsetuid µÄ shell script ¿ÉÒÔʹÓã¿ 
       4.8)  ÎÒÒªÈçºÎµÃÖªÓÐÄÄЩ process ¿ªÁËijһµµ°¸£¬»òijһ process ÕýÔÚʹÓÃÄÄ 
             Ò»¸ö fileystem(ÒÔÖÁÓÚÎÒÎÞ·¨ unmount Õâ¸ö filesystem)? 
       4.9)  ÎÒÒªÔõô֪µÀÊÇË­ÔÚ finger ÎÒ°¡£¿ 
       4.10) Äܲ»ÄÜÔÚÒ»¸ö process ºÍ terminal µÄÁ¬½ÓÒѾ­¶ÏµôÖ®ºóÔÙ½Ó»ØÀ´£¬ÀýÈç 
             ÔÚ background ÅÜÒ»¸ö³ÌʽȻºó¾Í logout ¶ø¶ÏµôµÄ³Ìʽ£¿ 
       4.11) ÓÐûÓа취¿ÉÒÔ͵ÌýÒ»¸ö terminal£¬¾ÍÊÇ˵½«ÆäÊä³ö¸´ÖÆÒ»·ÝÖÁÆäËûµÄ 
             terminal¡£ 
  
 4.1)  ÒªÈçºÎÔÚʹÓÃÕß²»±Ø°´ RETURN µÄÇé¿öÏ´Ӡterminal ¶Á½ø¶«Î÷£¿ 
  
         ÔÚ BSD ÖÐÓàcbreak Ä£Ê½£¬ÔÚ SysV ÖÐÔòÓà~ICANON Ä£Ê½¡£ 
  
         Èç¹ûÄãÀÁµÃÓà"ioctl(2)" À´É趨 terminal µÄ²ÎÊý£¬Ò²¿ÉÒÔÓàstty À´×ö£¬ 
         ²»¹ýÓеãÂýÓÖûÓÐЧÂʾÍÊÇÁË¡£µ×ϵijÌʽ×Ô¼º¿´Öø°ì°É£º 
  
               #include <stdio.h> 
               main() 
               { 
                     int c; 
  
                     printf("Hit any character to continue\n"); 
                     /* 
                      * ioctl() would be better here; only lazy 
                      * programmers do it this way: 
                      */ 
                     system("/bin/stty cbreak");        /* or "stty raw" */ 
                     c = getchar(); 
                     system("/bin/stty -cbreak"); 
                     printf("Thank you for typing %c.\n", c); 
  
                     exit(0); 
               } 
  
         Óкü¸¸öÈËË͸øÎÒ¸üÕýÈ·µÄ½â·¨¡£²»¹ýºÜ±§Ç¸ÎÒ²»Ïë°ÑËüÃǼӽøÈ¥£¬ÒòΪÕâÒѾ­ 
         ³¬³öÕâ·ÝÎļþµÄ·¶Î§ÁË¡£ 
  
         Í¨³£¶ÔÕâ¸öÎÊÌâÓÐÐËȤµÄÈË£¬¶¼ÊÇÏëÒª×öһЩ¿ØÖÆÓ©Ä»ÏÔʾ֮ÀàµÄÊÂÇé¡£Èç¹ûÄã 
         Ò²Êǵϰ£¬ÄÇÇë²Î¿¼ "curses" µÄÏà¹ØÎļþ¡£ "curses" ÊÇÒ»¸ö portable µÄÓ© 
         Ä»¿ØÖƺ¯Êý¿â¡£ 
  
  
 4.2)  ÎÒÒªÈçºÎÔÚÎ´ÔøÕæµÄ¶Á½ø¶«Î÷µÄÇé¿öϼì²éÊÇ·ñÓÐ×ÖÔªµÈ´ý¶ÁÈ¡£¿ 
  
         Ò»Ð©°æ±¾µÄ UNIX ÌṩÁ˼ì²éij¸ö file descriptor Ä¿Ç°ÊÇ·ñÓж«Î÷´ý¶ÁÈ¡µÄ 
         ·½·¨¡£ÔÚ BSD ÖУ¬¿ÉÒÔÓà"select(2)£¬Ò²¿ÉÒÔÓàFIONREAD ioctl£¬¼ì²éÓм¸ 
         ¸ö×ÖÔªµÈ´ý¶ÁÈ¡£¬²»¹ýÕâÖ»¶Ô terminal, pipe, Óë socket ÓÐÓá£ÔÚ System 
         V Release 3 ÖпÉÒÔÓàpoll(2)£¬²»¹ýÖ»¶Ô stream ÓÐÓá£ÔÚ Xenix Óë Sys V 
         r3.2 ¼°ÆäÒÔºóµÄ°æ±¾ÀÓÐÒ»¸öÃû½Ð rdchk() µÄ system call ¿ÉÒÔÓÃÀ´¼ì²é 
         ¶ÔÒ»¸ö file descriptor ×ö read() »á²»»á¿¨×¡¡£ 
  
         Ã»Óз½·¨¿ÉÒÔÓÃÀ´ÅжÏÊÇ·ñÓÐ×ÖÔªÔÚ FILE pointer Öдý¶ÁÈ¡¡£(Äã¿ÉÒÔÖ±½Ó²é 
         ¿´ stdio µÄ×ÊÁϽṹ£¬¿´¿´ÊÇ·ñ input buffer Êǿյ쬵«ÊÇÕâ·½·¨ÓÐʱ»áʧ 
         Ð§£¬ÒòΪÄãûÓа취֪µÀµ±ÄãÏÂÒ»´ÎÒªÌîÂúÕâ¸ö buffer Ê±»á·¢ÉúʲôÊ¡£) 
  
         ÓÐʱÈËÃÇÎÊÕâ¸öÎÊÌâÊÇÒòΪÏëд 
                 if (characters available from fd) 
                     read(fd, buf, sizeof buf); 
         ÒÔ´ï³É nonblocking read¡£Õâ²»ÊÇÒ»ÖֺõÄ×ö·¨£¬ÒòΪ¿ÉÄܲâµÄʱºòÓж«Î÷£¬ 
         Òª¶ÁµÄʱºò£¬ÒѾ­Ã»Óж«Î÷¿É¶ÁÁË¡£ÕýÈ·µÄ×ö·¨Ó¦¸ÃÊÇÓàfcntl(2) ÀïµÄ 
         F_SETFL É趨 O_NDELAY¡£±È½Ï¾ÉµÄϵͳ(Version 7, 4.1 BSD) Ã»ÓР
         O_NDELAY£¬ÄǾ͵ÃÓàalarm(2) À´É趨 read µÄ timeout£¬ÒÔ´ï³É½üËÆ 
         nonblocking read µÄ¹¦ÄÜ¡£ 
  
  
 4.3)  ÒªÔõÑù²ÅÄܵÃÖªÒ»¸öÒÑ open µµ°¸Ö®µµÃû£¿ 
  
         Õâ¸öÊǷdz£À§Äѵġ£ÈôÊÇÕâ¸ö file descriptor ÊǶÔÓ¦µ½ pipe »ò pty ¾Íû 
         ÓÐÃû×ÖÁË¡£Õâ¸ö file descriptor ¶ÔÓ¦µÄµµ°¸Ò²ÓпÉÄÜÒѱ»É¾³ý¡£ÈôÊÇÓР
         symbolic link »ò hard link£¬Ôò¿ÉÄÜÓÐÐí¶à¸öÃû×Ö¡£ 
  
         Èç¹ûÄã¾­¹ýÒ»ÔÙ¿¼ÂǺó±ðÎÞÑ¡ÔñÒ»¶¨ÒªÕâô×öµÄ»°£¬¿ÉÒÔÓàfind µÄ -inum Óë 
         -xdev Ñ¡Ï»òÓàncheck£¬»òÓÃ×Ô¼ºÐ´ÀàËÆµÄ³ÌʽÀ´×ö¡£ÔÚÕâô×öʱҪÄÍÐĵĠ
         µÈ£¬ÒòΪÔÚÒ»¸ö¼¸°Ù megabyte ÉõÖÁ¼¸ gigabyte µÄ file systemÖÐÕÒÒ»¸öµµ 
         °¸£¬Ò»¶¨µÃ»¨²»ÉÙʱ¼ä¡£ 
  
  
 4.4)  Ò»¸öÖ´ÐÐÖеijÌʽÈçºÎÖªµÀ×Ô¼ºµÄ pathname? 
  
         Èô¹û argv[0] ÊÇÒÔ "/" ¿ªÊ¼µÄ×Ö£¬Ëü¿ÉÄܾÍÊÇÄãµÄ³ÌʽËùÔڵصľø¶Ô·¾¶¡£ 
         Èç¹û²»ÊÇÄǾ͵ÃÕÕ˳Ðò¼ì²é PATH ÀïµÄÿһ¸öĿ¼¿´¿´ÀïÃæÊÇ·ñÓÐÓë argv[0] 
         Ò»ÑùµÄ³Ìʽ¡£Èç¹ûÕҵõ½µÄ»°½«ÄǸöĿ¼Óë³ÌʽÃû³Æ¶µÆðÀ´¿ÉÄܾÍÊÇÄãÒªµÄ 
         pathname ÁË¡£ 
  
         ²»¹ýÉÏÊö·½·¨ÕÒµ½µÄ²¢²»Ò»¶¨ÊÇÕýÈ·µÄ£¬ÒòΪÔÚ³ÌʽÖÐÓõ½ exec() Ê±£¬ 
         argv[0] ÊÇ¿ÉÒÔËæ±ã¸øµÄ¡£½« argv[0] ÉèΪÓëÒªÖ´ÐеijÌʽÃû³ÆÏàֻͬÊÇÒ» 
         ÖÖ¹ßÓ÷¨°ÕÁË£¡ 
  
         ÒÔϵÄÀý×Ó¿ÉÄÜ»áʹÄã¸üÇå³þЩ£º 
  
                 #include <stdio.h> 
                 main() 
                 { 
                     execl("/usr/games/rogue", "vi Thesis", (char *)NULL); 
                 } 
  
         Õâ¸ö±»Ö´ÐеijÌʽ¾Í»áÈÏΪËüµÄÃû×Ö(argv[0] Ö®Öµ)ÊÇ "vi Thesis"£©¡£ 
  
  
 4.5)  ÈçºÎÓàpopen() ¶ÔÒ»¸ö process ×ö¶ÁдµÄ¶¯×÷£¿ 
  
         Óàpipe ½«Ò»¸ö process µÄÊä³ö¡¢ÊäÈëת¸øÈÎÒâµÄ process Ëù¿ÉÄܻᷢÉúµÄ 
         ÎÊÌâ¾ÍÊÇ deadlock£¬Æ©ÈçÕâÁ½¸ö processes ¸ÕºÃͬʱ¶¼Ôڵȴý¡¸ÉÐδ²úÉú¡¹ 
         µÄÊäÈëʱ¡£Î¨Ò»ÄܱÜÃâ deadlock µÄ·½·¨¾ÍÊÇÔÚ pipe µÄÁ½¶Ë¶¼Òª×ñÑ­ÑϸñµÄ 
         deadlock-free Ð­¶¨£¬µ«ÊÇÐèÒªÕâЩ processes Ö®¼äµÄ»¥ÏàºÏ×÷²ÅÄÜ´ï³É£¬ 
         ¶ø¶ÔÓÚÏñ popen() ÕâÀàµÄº¯ÊýÀ´Ëµ²¢²»Ì«Êʺϡ£ 
  
         ÔÚ 'expect' Õâ¸öÈíÌåÖи½ÓÐÒ»¸öÄܹ»ÈàC ³Ìʽֱ½ÓÒýÓõĺ¯Ê½¿â¡£ÆäÖÐÓР
         Ò»¸öº¯Ê½²»¹ÜÊÇÔÚ¶Á»òд¶¼ÄÜ´ïµ½ºÍ popen ÏàͬµÄ¹¦ÄÜ¡£µ«ÊÇÕâ¸öº¯Ê½Ê¹ 
¹ 
         Óàptys ¶ø²»ÊÇ pipes£¬Ò²Ã»ÓРdeadlock µÄÎÊÌ⣬²¢ÇÒÔÚ BSD »ò SV Öж¼ 
         ÄÜʹÓá£ÈôÏë¶Ô 'expect' ÓнøÒ»²½µÄÁ˽⣬¿É²Î¿¼ÏÂÒ»¸öÎÊÌâµÄ½â´ð¡£ 
  
  
 4.6)  ÔÚ C ³ÌʽÖÐÒªÔõôÓàsleep() ²ÅÄܹ» sleep Ð¡ÓÚÒ»Ã룿 
  
         Ê×ÏÈҪעÒâµÄÊÇ£¬ÄãÖ»ÄÜÖ¸¶¨ delay µÄ¡¸×î¶Ì¡¹Ê±¼ä£»Êµ¼ÊÉÏ»á delay ¶à¾ÃºÍ 
         ÏµÍ³µÄ scheduling ·½Ê½Óйأ¬ÀýÈçϵͳµ±Ê±ÓиºÔØ¡£Èç¹ûÄ㵹鹵ϰ£¬Ëü»¹¿É 
         ÄÜ»á delay Âù³¤µÄʱ¼ä¡£ 
  
         ²¢Ã»ÓÐÒ»¸ö±ê×¼º¯Ê½Äܹ»ÔÚ¡¸Ð¡Ë¯¡¹£¨ºÜ¶ÌµÄ sleep£©ÆÚ¼äÌṩÄã¼ÆÊýµÄ¹¦ÄÜ¡£ 
         Ä³Ð©ÏµÍ³ÓÐÌṩ usleep(n) µÄº¯Ê½£¬ËüÄܹ»ÔÝÍ£Ö´ÐРn Î¢Ã루microsecond£© 
         µÄʱ¼ä¡£Èç¹ûÄãËùʹÓõÄϵͳûÓÐÌṩ usleep() º¯Ê½£¬ÄÇôÒÔÏÂÓпÉÔÚ BSD£¬ 
         System V Ê¹ÓÃÖеÄ×÷·¨¡£ 
  
         ½ÓÏÂÀ´µÄÕâ¶Î³ÌʽÂëÊÇ Doug Gwyn ÔÚ System V ÖÐÄ£Äâ 4BSD ²¢ÀûÓà4BSD 
         ÖеĠselect() ÏµÍ³ºô½Ð¡£Doung ×Ô¼º¶¼½ÐËüΪ 'nap()' £»ÄãÒ²¿ÉÒÔ°ÑËü½Ð×ö 
         "usleep()"£» 
  
         /* 
             usleep -- support routine for 4.2BSD system call emulations 
             last edit:  29-Oct-1984     D A Gwyn 
         */ 
  
       extern int        select(); 
  
       int 
       usleep( usec )                            /* returns 0 if ok, else -1 */ 
             long                usec;           /* delay in microseconds */ 
             { 
             static struct                       /* `timeval' */ 
                     { 
                     long        tv_sec;         /* seconds */ 
                     long        tv_usec;        /* microsecs */ 
                     }   delay;          /* _select() timeout */ 
  
             delay.tv_sec = usec / 1000000L; 
             delay.tv_usec = usec % 1000000L; 
  
             return select( 0, (long *)0, (long *)0, (long *)0, &delay ); 
             } 
  
       On System V you might do it this way: 
  
       /* 
       subseconds sleeps for System V - or anything that has poll() 
       Don Libes, 4/1/1991 
  
       The BSD analog to this function is defined in terms of 
       microseconds while poll() is defined in terms of milliseconds. 
       For compatibility, this function provides accuracy "over the long 
       run" by truncating actual requests to milliseconds and 
       accumulating microseconds across calls with the idea that you are 
       probably calling it in a tight loop, and that over the long run, 
       the error will even out. 
  
       If you aren't calling it in a tight loop, then you almost 
       certainly aren't making microsecond-resolution requests anyway, 
       in which case you don't care about microseconds.  And if you did, 
       you wouldn't be using UNIX anyway because random system 
       indigestion (i.e., scheduling) can make mincemeat out of any 
       timing code. 
  
       Returns 0 if successful timeout, -1 if unsuccessful. 
  
       */ 
  
       #include <poll.h> 
  
       int 
       usleep(usec) 
       unsigned int usec;                /* microseconds */ 
       { 
             static subtotal = 0;        /* microseconds */ 
             int msec;                   /* milliseconds */ 
  
             /* 'foo' is only here because some versions of 5.3 have 
              * a bug where the first argument to poll() is checked 
              * for a valid memory address even if the second argument is 0. 
              */ 
             struct pollfd foo; 
  
             subtotal += usec; 
             /* if less then 1 msec request, do nothing but remember it */ 
             if (subtotal < 1000) return(0); 
             msec = subtotal/1000; 
             subtotal = subtotal%1000; 
             return poll(&foo,(unsigned long)0,msec); 
       } 
  
         ÔÚ System V »òÆäËû ·Ç-BSD µÄ Unix ÖÐҪʹÓÃÕâÀàµÄ¡¸Ð¡Ë¯¡¹³Ìʽ£¬¿ÉÒÔÓà
         Jon Zeeff µÄ s5nap£¬ËüÔø±»·¢±íÔÚ comp.sources.misc, volume 4 ÖС£Ëü 
         ÐèÒª°²×°Ò»¸öÇý¶¯³Ìʽ£¬µ«ÊÇ×°ºÃºó¾Í¿ÉÒÔÅܵúܺᣣ¨ËüµÄ¾«È·¶È»áÊܵ½ 
         kernel ÖРHZ Õâ¸ö±äÊýµÄÓ°Ï죬ÒòΪËüÊÇÓõ½ÁË kernel ÖеĠdelay() º¯ 
         Ê½¡££© 
  
         ÏÖÔںܶà½Ïа汾µÄ Unix ¶¼ÓÐÌṩÕâÀàµÄ¡¸Ð¡Ë¯¡¹¹¦ÄÜÁË¡£ 
  
  
 4.7)  ÈçºÎÈàsetuid µÄ shell script ¿ÉÒÔʹÓã¿ 
  
         [ Õâ¸öÎÊÌâµÄ»Ø´ðºÜ³¤£¬µ«ÊÇÕâÊÇÒ»¸ö¸´ÔÓÓÖ³£ÎʵÄÎÊÌâ¡£ÔÚ´ËҪлл Maarten 
         Litmaath ËùÌṩµÄ´ð°¸ºÍÒÔÏÂËùÌáµ½µÄ "indir" ³Ìʽ¡£] 
  
         ÏȼÙÉèÄãËùÓõĠUNIX ÊÇÄÜÈϵḿÉÖ´ÐеĠshell script¡¹µÄ±äÒì¹ýµÄ UNIX 
        £¨Èç 4.3BSD »ò SunOS£©¡£ÕâÀà script µÄµÚÒ»ÐÐÒ»¶¨ÊÇÈçÒÔÏÂÒ»°ã£º 
  
                 #!/bin/sh 
  
         ÕâÑùµÄ script ¾ÍÊÇËùν¿ÉÖ´ÐеĠscript£¬ÒòΪËüºÍÒ»°ã¿ÉÖ´ÐеÄbinary µµ 
         Ò»ÑùÓРmagic number ×ö¿ªÍ·¡£ÔÚÎÒÃÇËùÓõÄÀý×ÓÖУ¬magic number Îª 
         '#!'£¬OS »á°ÑÕâÐнÓÏÂÀ´µÄ²¿·Ýµ±×÷ÕâÕû¸ö script µÄ½âÒë³Ìʽ£¬Æäºó¿ÉÄÜ»¹ 
         »áÓÐһЩ option È磺 
  
                 #!/bin/sed -f 
  
         ¼ÙÉèÕâ¸ö script µÄÃû×Ö½Ð×ö 'foo'£¬²¢ÇÒ·ÅÔÚ /bin Ï£¬ÄÇôÈç¹ûÄãÓ㺠
  
                 foo arg1 arg2 arg3 
  
         ÄÇô OS Êµ¼ÊÔÚÖ´ÐÐʱ»á°ÑËü¿´³ÉÊÇ£º 
  
                 /bin/sed -f foo arg1 arg2 arg3 
  
         ÓÐÒ»µã²»Í¬µÄÊÇ£ºÈç¹û 'foo' ±»É趨³É setuid£¬ÄÇô OS »á°ÑËüÒÔµÚÒ»ÖÖ¸ñ 
         Ê½À´½âÊÍ£»Èç¹ûÄãÓ²ÊÇÒÔµÚ¶þÖÖ¸ñʽÊäÈ룬ÄÇô OS »áÒÔ /bin/sed µÄ 
         permission Îª×¼£¬¶øËüµ±È»²»»áÊÇ setuid¡£ 
  
  
         ºÃ°É£¬ÄÇÈç¹ûÎҵĠshell script ²¢²»ÊÇÒÔ '#!' ×ö¿ªÍ·£¬»òÊÇÎҵĠOS ¸ù±¾¾Í 
         ²»ÈϵÃËüÄØ£¿ 
  
         àÅ£¬Èç¹ûÕâ¸ö shell£¨»òÊÇÆäËûµÄ½âÒë³Ìʽ£©ÊÔÖøÒªÈ¥Ö´ÐÐËü£¬ÄÇô OS »á´«»Ø 
         Ò»¸ö´íÎóѶϢ£¬±íʾÕâ¸öµµ°¸²»ÊÇÒԺϷ¨µÄ magic number ×ö¿ªÍ·¡£ÊÕµ½Õâ¸ö´í 
         ÎóѶϢºó£¬shell »á°ÑÕâ¸öµµ°¸È϶¨³ÉÊÇ shell script£¬²¢ÒÔÁíÒ»ÖÖ·½Ê½À´Ö´ÐУº 
  
                 /bin/sh shell_script arguments 
  
         µ«ÊÇÎÒÃÇÔÚÇ°ÃæÒѾ­¿´µ½ÁË£¬ÔÚÕâÑùµÄÇéÐÎÏ£¬±»Éè³ÉΪ setuid µÄ 
         shell_script ²¢²»»á·¢Éú×÷Óᣠ
  
  
         ÄÇô£¬Éè³É setuid µÄ shell script µ½µ×ÓÐʲô°²È«ÉϵÄÎÊÌâÄØ£¿ 
  
         àÅ£¬¼ÙÉèÕâ¸ö script ½Ð×ö '/etc/shell_script'£¬ËüµÄ¿ªÍ·ÊÇ£º 
  
                 #!/bin/sh 
  
         ÏÖÔÚÎÒÃÇÀ´¿´¿´ÒÔϵÄÃüÁî»á·¢ÉúʲôÊ£º 
  
                 $ cd /tmp 
                 $ ln /etc/setuid_script -i 
                 $ PATH=. 
                 $ -i 
  
         ÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬ÒÔÉϵÄ×îºóÒ»¸öÃüÁî»á±»½âÊͳɣº 
  
                 #!/bin/sh -i 
  
         ¶øÕâÑùµÄÃüÁî»áÈÃÎÒÃǵõ½Ò»¸ö¿ÉÒÔÊäÈëÃüÁîµÄ shell£¬²¢Çһᱻ setuid ³É 
         Õâ¸ö  script µÄÓµÓÐÕß¡£ 
         ÐҺã¬ÕâÑùµÄ°²È«Â©¶´¿ÉÒÔºÜÇáÒ׵طÀÖ¹£¬Ö»ÐèÒª°ÑµÚÒ»Ðиijɣº 
  
                 #!/bin/sh - 
  
         '-' Õâ¸ö·ûºÅ´ú±íÖøËüÊÇÕû¸ö option list µÄ½áβ£ºËùÒÔÈç¹ûÔÙÓÃǰÊöµÄ·½·¨ 
         µÄ»°£¬'-i' ¾Í»áÈç±¾À´ËùÆÚÍûµÄ±»½âÊͳɠscript µµ°¸µÄÃû×Ö¡£ 
  
  
         È»¶ø£¬»¹ÓиüÑÏÖØµÄÎÊÌ⣺ 
  
                 $ cd /tmp 
                 $ ln /etc/setuid_script temp 
                 $ nice -20 temp & 
                 $ mv my_script temp 
  
         µÚÈý¸öÃüÁî»á±»½âÊͳɣº 
  
                 nice -20 /bin/sh - temp 
  
         ¶øÒòΪÕâ¸öÃüÁîµÄÓÅÏÈȨ±»ÉèµÃºÜµÍ£¬ÄÇôµÚËĸöÃüÁî¿ÉÄܾÍÓлú»áÇÀÏÈÔÚ 
         shell ¿ªÆô 'temp' Ö®Ç°¾ÍÓà'my_script' °Ñ 'temp' ¸ø¸Çµô£¡ÓÐËÄÖÖ·½·¨ 
         ¿ÉÒÔÐÞ²¹Õâ¸ö°²È«ÉϵÄ©¶´£º 
  
         1)  ÈàOS ÓÃÁíÒ»¸ö±È½Ï°²È«µÄ·½Ê½Ö´ÐРsetuid script¡£Èç System V R4 ºÍ 
             4.4BSD ÀûÓà/dev/fd À´°Ñ¸Ã script µÄ file descriptor ´«¸ø½âÒë³Ìʽ¡£ 
  
         2)  Í¸¹ýÒ»¸öǰ¶Ë³ÌʽÀ´¼ä½Ó½âÒëÒªÖ´ÐеĠscript£¬ÒÔÈ·¶¨ÔÚÕæÕýµÄ½âÒë³Ìʽ 
             Æô¶¯Ç°Ò»ÇÐÕý³£¡£ÀýÈ磬Äã¿ÉÒÔÓàcomp.sources.unix ÖеĠ'indir' ³Ì 
             Ê½£¬ÄÇôÄãµÄ script ¿ªÍ·¾Í»áÏñÕâÑù£º 
  
                         #!/bin/indir -u 
                         #?/bin/sh /etc/setuid_script 
  
         3)  ÔìÒ»¸ö 'binary wrapper'£ºÒ»¸öÕæÕýµÄ setuid ¿ÉÖ´ÐгÌʽ£¬Õâ¸ö³ÌʽµÄ 
             Î¨Ò»¹¦ÄܾÍÊÇÓÃÀ´Ö´ÐРscript ÖÐËùÖ¸¶¨µÄ½âÒë³Ìʽ£¬²¢ÒԸàscript µÄµµ 
             ÃûΪ²ÎÊý´«¸ø½âÒë³Ìʽ¡£ 
  
         4)  ÔìÒ»¸ö 'setuid script server' £¬²¢°ÑһЩҪÓõ½¡¢¼ì²é¹ýµÄ setuid 
             script ´æ·ÅÔÚ database ÖС£µ±³É¹¦µØ±»ºô½Ðºó£¬»áÈ¥Ö´ÐÐÕýÈ·µÄ½âÒë³Ì 
             Ê½¼°ÕýÈ·µÄ script¡£ 
  
  
         ÏÖÔÚÎÒÃÇÒѾ­ÄÜÈ·¶¨Ëù½âÒëµ½µÄ script ÊÇÕýÈ·µÄ£¬ÄÇô»¹ÓÐÆäËûµÄΣÏÕÂ𣿠
  
         ºÜ±§Ç¸£¬µ±È»»¹ÓУ¡ÔÚʹÓàshell scipt µÄʱºò£¬ÄãÒ»¶¨²»ÄÜÍü¼ÇÒª°Ñ PATH 
         Õâ¸ö±äÊýºÜÃ÷È·µØÉèµ½ÕýÈ·µÄ·¾¶È¥¡£ÄãÄܹ»Ö¸³öÕâÊÇΪʲôÂ𣿳ý´ËÖ®Í⣬ 
         »¹ÓРIFS Õâ¸ö±äÊýÈç¹ûûÉèºÃÒ²¿ÉÄÜ»áÔì³ÉÎÊÌâ¡£ÆäËûµÄ»·¾³±äÊýÒ²¿ÉÄÜ»áÐΠ
         ³É°²È«ÉϵÄÎÊÌ⣬Èç SHELL... ¸üÖØÒªµÄ£¬Äã±ØÐëҪȷ¶¨ÔÚ script ÖÐûÓÐÃü 
         Áî»áÈÃËü²úÉú³ö¿ÉÏÂÃüÁîµÄ shell£¨interactive shell escape£©£¡»¹ÓоÍÊÇ£¬ 
         umask ¿ÉÄܱ»Éè³ÉÆæ¹ÖµÄÖµµÈµÈ... 
  
         ³ý´ËÖ®Í⣬ÄãÓ¦¸ÃÒªÖªµÀ setuid script »á¡¸¼Ì³Ð¡¹ËùÓÐËüËùÓõ½µÄÃüÁîµÄ 
         bug ¼°°²È«ÎÊÌâ¡£ 
  
         ×ܶøÑÔÖ®£¬ÄãÓ¦¸ÃÖªµÀ setuid shell script ÕæµÄÊǼþ·Ç³£Î£ÏÕµÄʰɣ¡ 
         ×îºÃ»¹ÊÇд C ³ÌʽÀ²¡£ 
  
  
 4.8)  ÎÒÒªÈçºÎµÃÖªÓÐÄÄЩ process ¿ªÁËijһµµ°¸£¬»òijһ process ÕýÔÚʹÓÃÄÄ 
       Ò»¸ö fileystem(ÒÔÖÁÓÚÎÒÎÞ·¨ unmount Õâ¸ö filesystem)? 
  
         Äã¿ÉÒÔÓàfuser(system V)£¬fstat(BSD)£¬ofiles(public domain) »òÊÇ pff 
         (public domain)¡£ÕâЩ³Ìʽ¿ÉÒÔ¸æËßÄãÄÄЩ processes ÕýÔÚʹÓÃÄÄЩµµ°¸¡£ 
  
         4.3BSD µÄ fstat£¬ÓÐÒ»·Ý Dynix£¬SunOS Óë Ultrix ¶¼¿ÉÒÔÓõĠport¡£Äã¿ÉÒÔ 
         ÕÒÕÒ·Å comp.sources.unix, volume 18µÄµØ·½¡£ 
  
         Pff ÊÇ kstuff ÕâÌ×ÈíÌåµÄÒ»²¿·Ö£¬ºÜ¶àϵͳÉ϶¼¿ÉÒÔÓá£ÓûÈ¡µÃ kstuff Çë²Î 
         ¿¼ÎÊÌâ 3.10¡£ 
  
  
 4.9)  ÎÒÒªÔõô֪µÀÊÇË­ÔÚ finger ÎÒ°¡£¿ 
  
         Ò»°ãÀ´Ëµ£¬ÄãÊÇÎÞ·¨ÕÒ³öÔÚÔ¶¶Ë»úÆ÷ finger ÄãµÄÄǸöÈ˵Ġuserid µÄ¡£Äã´ó¸Å 
         Ö»ÄÜÕÒ³öÔÚ´ÓÄĄ̈»úÆ÷ finger µÄ¡£ÁíÍâÓÐÒ»ÖÖ¿ÉÐеķ½·¨£¬Èç¹ûÄãµÄϵͳ֧Ԯ 
         ²¢ÇÒ¼ÙÉè finger daemon ²»·´¶ÔµÄ»°£¬ÄÇô¿ÉÒÔ°ÑÄãµÄ .plan µµÓà"named 
         pipe" ¶ø²»ÓÃÒ»°ãµÄÎÄ×Öµµ¡££¨Óà'mknod' À´Ô죩 
  
         ½ÓÏÂÀ´£¬ÄãÖ´ÐÐÒ»¸ö³Ìʽȥд£¨open for writing£©ÄãµÄ .plan µµ£»µ«ÊÇÓÉÓÚ 
         ÄãµÄ .plan ÊÇÒ»¸ö "named pipe"£¬ËùÒÔÕâ¸ö¿ªµµµÄ¶¯×÷ÒªÒ»Ö±µÈµ½ÓÐÆäËûµÄ 
         process È¥¶Á£¨open for reading£©ÄãµÄ .plan µµÊ±²Å»á³É¹¦¡£ÏÖÔÚÄã¾Í¿ÉÒÔ 
         ÈÎÒâµØ°ÑÄãËùÏëÈÃÈË finger µ½µÄ .plan ÄÚÈÝдÈëÕâ¸ö pipe¡£ÔÚ 
         comp.sources.misc, volumn 41 ÖÐÓиö "planner" µÄ³Ìʽ¿ÉÒÔ×öÕâ¼þÊ¡£ 
  
         µ±È»£¬Èç¹ûÄãµÄϵͳ²»Ö§Ô® "named pipe"£¬»òÊÇÄãËùÓõĠfinger ³Ìʽֻ½ÓÊÜ 
         ´¿ÎÄ×ֵĠ.plan µµ£¬ÄÇôÒÔÉϵķ½·¨¾ÍÐв»Í¨ÁË¡£ 
  
         ÄãµÄ³ÌʽҲ¿ÉÒÔ½åÓɲ鿴 "netstat" µÄÊä³ö£¬À´ÕÒ³öÕâ´ÎµÄ finger ÊÇ´ÓÄÇÀï 
         Á¬¹ýÀ´µÄ£¬µ«ÊÇÕâ²¢ÎÞ·¨¿´³öÔ¶¶ËÖ´ÐРfinger µÄÈËÊÇË­¡£ 
  
         ÏëÒªÖªµÀÔ¶¶ËµÄÈËÊÇË­£¬±ØÐëÒªÔ¶¶ËµÄ»úÆ÷ÓÐÅÜÖ§Ô®Èç RFC 931 µÄʶ±ð³Ìʽ²Å 
         ÐС£ 
  
         ÏÖÔÚ£¬ÔÚ³£¼ûµÄ BSD ÏµÍ³ÉϾÍÓÐÈýÖÖ RFC 931 µÄʵ×ö³Ìʽ£¬Í¬Ê±Ò²ÓÐÐí¶àµÄ 
         Ó¦ÓóÌʽ£¨Èç wuarchive ftpd£©Ö§Ô®¡£Èç¹ûÄãÏëµÃµ½¸ü¶àÓйؠRFC 931 µÄ×Ê 
         Ñ¶£¬¿ÉÒÔ¼ÓÈë rfc931-user µÄ mailing list£¬ 
         rfc931-users-request@kramden.acf.nyu.edu¡£ 
  
         ÁíÍ⻹ÓÐÈý¸ö×¢ÒâÊÂÏî¡£µÚÒ»£¬ÓÐÐí¶àµÄ NFS ÏµÍ³ÎÞ·¨ÕýÈ·µØ´¦Àí "named 
         pipe"¡£Õâ¸öÒâ˼ÊÇ£¬µ±ÄãҪȥ¶Á·ÅÔÚÁíÒ»²¿»úÆ÷ÉϵĠpipe Ê±£¬¿ÉÄܻᱻϵͳ 
         block ×¡Ö±µ½time out£¬»òÊÇÒòΪ pipe µÄµµ°¸³¤¶ÈÊÇ 0 ËùÒÔϵͳ¾Í²»°ÑËüµÄ 
         ÄÚÈÝÁгöÀ´¡£ 
  
         µÚ¶þ£¬ÔÚÐí¶àµÄϵͳÖУ¬fingerd »áÔÚ¶Á .plan µµÖ®Ç°ÏÈÈ¥¼ì²éËüÀïÃæÊÇ·ñÕæ 
         µÄÓÐ×ÊÁϲ¢ÇÒÊÇ¿ÉÒÔ¶ÁµÄ¡£ÕâÑù¾Í»áÔì³ÉÔ¶¶Ë finger ÄãµÄÈ˸ù±¾¾Í¿´²»µ½Äã 
         µÄ .plan µµ£¬ÒòΪÄãµÄ .plan ³¤¶ÈÊÇ 0¡£ 
  
         µÚÈý£¬Ö§Ô® "named pipe" µÄϵͳͨ³£ÔÚͬһ¸öʱ¼äÀïÖ»ÔÊÐíϵͳÖдæÔÚij¸ö¹Ì 
         ¶¨ÊýÄ¿µÄ pipes£¬¼ì²é kernel µÄ config µµºÍ FIFOCNT Ñ¡Ïî¼´¿ÉµÃÖª¡£Èç¹û 
         ÏµÍ³ÖеĠpipe ÊýÄ¿³¬¹ýÁË FIFOCNT£¬ÄÇôϵͳ¾Í»áÔÝÍ£ËùÓÐеĠpipe Ö±µ½ÓР
         È˹صôËûÏÈǰù¿ªµÄ pipe¡£ÕâÊÇÒòΪ pipe ËùÓõ½µÄ buffer ÊÇ·ÅÔÚ 
         non-paged µÄ¼ÇÒäÌåÖС£ 
  
  
 4.10)  Äܲ»ÄÜÔÚÒ»¸ö process ºÍ terminal µÄÁ¬½ÓÒѾ­¶ÏµôÖ®ºóÔÙ½Ó»ØÀ´£¬ÀýÈç 
        ÔÚ background ÅÜÒ»¸ö³ÌʽȻºó¾Í logout ¶ø¶ÏµôµÄ³Ìʽ£¿ 
  
         ´ó²¿·Ý°æ±¾µÄ Unix ¶¼²»Ïñ VMS ºÍ Multics µÈ×÷ҵϵͳ֧Ԯ "detaching" ºÍ 
         "attaching" process¡£²»¹ý£¬ÓÐÁ½¸öÃâ·ÑµÄÈíÌåÄܹ»°ïÄã´ï³ÉÕâ¸öÄ¿µÄ¡ 
£ 
  
         µÚÒ»¸öÊÇ "screen"£¬ÔÚ comp.sources.unix ÖеıêÌâÊÇ "Screen, multiple 
         windows on a CRT"¡££¨Äã¿ÉÒÔÔÚ comp.sources.misc, volumn 28 Öз¢±íµÄ 
         "screen-3.2" ÖÐÕÒµ½£©Õâ¸öÈíÌåÔÚ BSD£¬System V r3.2 ¼° SCO UNIX ½Ô¿ÉÖ´ 
         ÐС£ 
  
         µÚ¶þ¸öÊÇ "pty"£¬ÔÚ comp.sources.unix ÖеıêÌâÊÇ "Run a program under 
         a pty session"¡££¨¿ÉÒÔÔÚ volumn 23 ·¢±íµÄ "pty" ÖÐÕÒµ½£©"pty" Ö»ÄÜÔÚ 
         BSD µÄϵͳÖÐÖ´ÐС£ 
  
         ÒÔÉÏÕâÁ½¸öÈíÌå¶¼ÓÐËݼ°¼ÈÍùµÄÄÜÁ¦£¬Ò²¾ÍÊÇ˵£¬ÄãÈç¹ûÏë¶Ôij¸ö process 
         ×ö detach »ò attach µÄ¶¯×÷£¬ÄÇô¾Í±ØÐëÒªÏÈÔÚ screen »ò pty ÏÂÆô¶¯Ëü²Å 
         ÐС£ 
  
  
 4.11) ÓÐûÓа취¿ÉÒÔ͵ÌýÒ»¸ö terminal£¬¾ÍÊÇ˵½«ÆäÊä³ö¸´ÖÆÒ»·ÝÖÁÆäËûµÄ 
       terminal¡£ 
  
         Óм¸ÖÖ·½·¨¿ÉÒÔ´ï³ÉÕâ¸öÄ¿µÄ£¬²»¹ýûÓÐÒ»¸öÊÇÍêÃÀµÄ£º 
  
         *  kibitz ÔÊÐíÁ½¸ö£¨»ò¸ü¶à£©µÄÈË͸¹ý shell£¨»òÆäËûµÄ³Ìʽ£©±Ë´Ë¹µÍ¨¡£ 
            ËüµÄÓÃ;ÓУº 
  
                 -  ¼àÊÓ»òÔ®ÖúÁîÒ»È˵Äterminal session£» 
                 -  ¼Ç¼ËùÓеÄÊä³öÈëÒÔÓÃÀ´ÄܾíÒ³»ØÈ¥£¬´¢´æÕû¸öÊä³öÈ룬ÉõÖÁÊǿɠ
                    ÒÔÖ±½Ó±à¼­Ëü¡£ 
                 -  µ±ÍŶӺÏ×÷ʱ£¬ÈçÖÆ×÷ game¡¢×«Ð´ÎļþµÈ¹¤×÷£¬Ã¿¸öÈ˶¼¸÷ÓÐËù³¤ 
                    ¸÷ÓÐËù¶Ì£¬¾Í¿ÉÓôËÖÖ·½Ê½±Ë´Ë»¥²¹¡£ 
  
         kibitz ÊÇ 'expect' ÈíÌåµÄÒ»²¿·Ý£¬Çë²é¿´ÎÊÌâ 3.9¡£ 
  
         kibitz ÐèÒªÓб»¼àÊÓÈ˵ÄͬÒâ²ÅÄܽøÐС£Èç¹ûÏ벻ȡµÃͬÒâ¾Í½øÐмàÊÓ,ÄÇô¾Í 
         µÃÓÃһЩ±È½ÏÁîÈËÌÖÑáµÄ·½·¨ÁË£º 
  
         *  Äã¿ÉÒÔ×Ô¼ºÐ´Ò»¸ö³ÌʽȥËѲéÕû¸ö kernel µÄ½á¹¹£¬¼àÊÓ terminal ËùÓõĠ
            output buffer£¬È»ºó°ÑËüËùÊä³öµÄ×ÖȫץÏÂÀ´¡£ºÜÃ÷ÏԵģ¬ÕâÊÇÊìϤ Unix 
            kernel µÄÈ˲ſÉÄÜ×öµÃµ½µÄ¡£µ«ÊÇ£¬²»ÂÛÄãÊÇÓÃʲô·½·¨´ó¸Å¶¼ÎÞ·¨ 
            Äõ½ÆäËûµÄ Unix È¥Óᣠ
  
         *  Èç¹ûÄãÊÇÏëÒªËæÊ±¼àÊÓÒ»¸öÌØ¶¨¡¢Êµ¼ÊÀ­ÏßÁ¬ÉϵĠterminal£¨ÀýÈ磬ÄãÏëÈà
            ¹ÜÀíÕßÄܹ»´ÓÆäËû»úÆ÷µÄÖÕ¶Ë»ú²é¿´Ä³²¿»úÆ÷µÄ console£©£¬ÄÇÄã¿ÉÒÔǬ´à 
            ½Óһ̨¼àÊÓÆ÷ÔÚͨÍùÄÇ̨ terminal µÄÏßÉÏ¡£¾ÙÀýÀ´Ëµ£¬°ÑÄãµÄ¼àÊÓÆ÷µÄÊä 
            ³ö½Óµ½Áíһ̨»úÆ÷µÄ serial port£¬È»ºóÖ´ÐÐÒ»¸ö³ÌʽȥÊÕ¼¯ÄǸö port µÄ 
            ÊäÈë²¢°ÑËüתµ½ÁíÒ»¸ö port È¥£¬¶øÕâ¸ö port ¾ÍÕæµÄÁ¬µ½ÄãËùÒª¼àÊӵĠ
            terminal È¥¡£ÕâÑù×öµÄ»°£¬Äã±ØÐëÈ·¶¨´Ó¸Ã terminal À´µÄÊä³ö»áËæÖøÏß´« 
            »ØÈ¥£¬¼´Ê¹ÄãÖ»ÊDzå½ÓÔÚµçÄԺ͠terminal µÄÖм䣬Õâ²¢²»»áÌ«ÄÑ×öµ½¡£ Óà
            Õâ¸ö·½·¨£¬¶Ô terminal ²¼Ïß²»Ì«ÊìϤµÄÈËÊÇÎÞ·¨·¢¾õµÄ¡£ 
  
         *  ÔÚ×î½üÒ»°æµÄ screen ÖÐÓÐÒ»ÖÖ multi-user Ä£Ê½¿ÉÒÔÓá£ÈôÏë¶àÁ˽âÒ» 
            µã screen£¬Çë¿´ÎÊÌâ 4.10¡£ 
  
         *  Èç¹ûÄãËùʹÓõÄϵͳÓÐÌṩ stream£¨Èç SunOS£¬SVR4£©ÄÇôÄã¿ÉÒÔʹÓà
            ·¢±íÔÚ comp.sources.misc, volumn 28 ÖеĠadvise ³Ìʽ¡£Ëü²¢²»ÐèÒªÏÈ 
            Ö´ÐС££¨µ«ÊÇ£¬Äã±ØÐëÒªÊÂÏȰÑÄãµÄϵͳÉ趨³ÉÔÚ¿ªÆô tty »ò pty Ê±»á×Ô 
            ¶¯°Ñ advise Ä£×é·ÅÈë stream ÖС££© 
 
 
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ bbs.net.tsinghua.edu.cn¡¤[FROM: 166.111.18.11] 

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