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

·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-8 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Wed Mar 15 14:29:19 2000) 
 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--µÚ8Õ ½ø³Ì¿ØÖÆ  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Fri Mar 10 13:30:30 2000), ×ªÐÅ  
   
µÚ°ËÕ¡þ½ø³Ì¿ØÖƪ¥  
8ª±1¡þÒýÑÔª¥  
±¾Õ½éÉÜUnixµÄ½ø³Ì¿ØÖÆ£¬°üÀ¨´´½¨Ð½ø³Ì¡¢Ö´ÐгÌÐòºÍ½ø³ÌÖÕÖ¹¡£ÎÒÃÇҲ˵Ã÷½ø  
³ÌµÄ¸÷ÖÖ  
ID¡¼CD2¡½Êµ¼Ê¡¢ÓÐЧºÍ±£´æµÄÓû§ºÍ×éID£¬ÒÔ¼°ËüÃÇÈçºÎÊܵ½½ø³Ì¿ØÖÆÔ­ÓïµÄÓ°  
Ïì¡£±¾Õ  
Ò²°üÀ¨Á˽âÊÍÆ÷ÎļþºÍsystemº¯Êý¡£±¾ÕÂÒÔ´ó¶àÊýUnixϵͳËùÌṩµÄ½ø³Ì»á¼Æ»úÖÆ  
½áÊø¡£Õâ  
ʹÎÒÃÇ´ÓÒ»¸ö²»Í¬½Ç¶ÈÁË½â½ø³Ì¿ØÖƹ¦ÄÜ¡£ª¥  
8ª±2¡þ½ø³Ì±êʶª¥  
ÿ¸ö½ø³Ì¶¼ÓÐÒ»¸ö·Ç¸ºÕûÐ͵ÄΨһ½ø³ÌID¡£ÒòΪ½ø³ÌID±êʶ·û×ÜÊÇΨһµÄ£¬³£½«Æä  
ÓÃ×÷ΪÆä  
Ëü±êʶ·ûµÄÒ»²¿·ÖÒÔ±£Ö¤ÆäΨһÐÔ¡£ÔÚ5ª±13½ÚÖеÄtmpnamº¯Êý½«½ø³ÌID×÷ΪÃû×Ö  
µÄÒ»²¿·Ö  
´´½¨Ò»¸öΨһµÄ·¾¶Ãû¡£ª¥  
ÓÐijЩרÓõĽø³Ì£º½ø³ÌID0Êǵ÷¶È½ø³Ì£¬³£³£±»³ÆÎª½»»»½ø³Ì(swapper)¡£¸Ã½ø³Ì  
²¢²»Ö´ÐР 
ÈκδÅÅÌÉϵijÌÐò¡£¡¼CD2¡½ËüÊÇϵͳºËµÄÒ»²¿·Ö£¬Òò´ËÒ²±»³ÆÎªÏµÍ³½ø³Ì¡£½ø³Ì  
ID1ͨ³£ÊÇ  
init½ø³Ì£¬ÔÚ×Ô¾Ù¹ý³Ì½áÊøÊ±ÓÉϵͳºËµ÷Ó᣸ýø³ÌµÄ³ÌÐòÎļþÔÚUnixµÄ½ÏÔç°æ±¾  
ÖÐÊÇ/etc  
/init£¬ÔÚ°æÐ°汾ÖÐÊÇ/sbin/init¡£´Ë½ø³Ì¸ºÔðÔÚϵͳºË×Ô¾ÙºóÆð¶¯Ò»¸öUnixϵ  
ͳ¡£init  
ͨ³£¶ÁÓëϵͳÓйصijõʼ»¯Îļþ(/etc/rc*Îļþ)£¬²¢½«ÏµÍ³Òýµ¼µ½Ò»¸ö״̬(ÀýÈç  
¶àÓû§)¡£  
init½ø³Ì¾ö²»»áÖÕÖ¹¡£ËüÊÇÒ»¸öÆÕͨµÄÓû§½ø³Ì(Óë½»»»½ø³Ì²»Í¬£¬Ëü²»ÊÇÒ»¸öÔÚ  
ϵͳºËÄÚ  
µÄϵͳ½ø³Ì)£¬µ«ÊÇËüÒÔ³¬¼¶Óû§ÌØÈ¨ÔËÐС£ÔÚ±¾ÕÂÉԺ󲿷ֻá˵Ã÷initÈçºÎ³ÉΪ  
ËùÓй¶ù  
½ø³ÌµÄ¸¸½ø³Ì¡£ª¥  
ÔÚijЩUnixµÄÐé´æÊµÏÖÖУ¬½ø³ÌID2ÊÇÒ³¾«Áé½ø³Ì(pagedaemon)¡£´Ë½ø³Ì¸ºÔðÖ§³Ö  
Ðé´æÏµÍ³  
µÄÇëÒ³²Ù×÷¡£ª¥  
³ýÁ˽ø³ÌID£¬Ã¿¸ö½ø³Ì»¹ÓÐһЩÆäËü±êʶ·û¡£ÏÂÁк¯Êý·µ»ØÕâЩ±êʶ·û¡£ª¥  
#include <sys/typesª±h>ª¥  
#include <unistdª±h>ª¥  
pid ¼£Ã£Ä££ª³£²¡½t getpid(voide;¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄ½ø³ÌIDª¥  
pid ¼£Ã£Ä££ª³£²¡½t getppid(void);¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄ¸¸½ø³ÌIDª¥  
uid ¼£Ã£Ä££ª³£²¡½t getuid(void);¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄʵ¼ÊÓû§IDª¥  
uid ¼£Ã£Ä££ª³£²¡½t geteuid(void);¡þ·µ»Ø£º¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄÓÐЧÓû§I  
Dª¥  
gid ¼£Ã£Ä££ª³£²¡½t getgid(void);¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄʵ¼Ê×éIDª¥  
gid ¼£Ã£Ä££ª³£²¡½t getegid(void);¡þ¡þ¡¼CD2¡½µ÷Óýø³ÌµÄÓÐЧ×éIDª¥  
×¢Ò⣬ÕâЩº¯Êý¶¼Ã»Óгö´í·µ»Ø£¬ÔÚÏÂÒ»ÕÂÖÐÌÖÂÛforkº¯Êýʱ£¬½«½øÒ»²½ÌÖÂÛ¸¸½ø  
³ÌID¡£ÔÚ  
4ª±4½ÚÖÐÒÑÌÖÂÛÁËʵ¼ÊºÍÓÐЧÓû§¼°×éID¡£ª¥  
8ª±3¡þforkº¯Êýª¥  
Ò»¸öÏÖ´æ½ø³Ìµ÷ÓÃforkº¯ÊýÊÇUnixºË´´½¨Ò»¸öнø³ÌµÄΨһ·½·¨¡£(Õâ²¢²»ÊÊÓÃÓÚ  
ǰ½ÚÌá¼°  
µÄ½»»»½ø³Ì¡¢init½ø³ÌºÍÒ³¾«Áé½ø³Ì¡£ÕâЩ½ø³ÌÊÇÓÉϵͳºË×÷Ϊ×Ô¾Ù¹ý³ÌµÄÒ»²¿·Ö  
ÒÔÌØÊâ·½  
ʽ´´½¨µÄ¡£)ª¥  
#include <sys/typesª±h>ª¥  
#include <unistdª±h>ª¥  
pid ¼£Ã£Ä££ª³£²¡½t fork(void);ª¥  
Returns:0 in child,process ID of child in parent,-1 on error¡þ·µ»Ø£º×Ó½ø  
³ÌÖÐΪ0  
£¬¸¸½ø³ÌÖÐΪ×Ó½ø³ÌID£¬³ö´íΪ0ª¥  
ÓÉfork´´½¨µÄнø³Ì±»³ÆÎª×Ó½ø³Ì¡£¸Ãº¯Êý±»µ÷ÓÃÒ»´Î£¬µ«·µ»Ø¶þ´Î¡£Á½´Î·µ»ØµÄ  
Çø±ðÊÇ×Ó  
½ø³ÌµÄ·µ»ØÖµÊÇ0£¬¶ø¸¸½ø³ÌµÄ·µ»ØÖµÔòÊÇÐÂ×Ó½ø³ÌµÄ½ø³ÌID¡£½«×Ó½ø³ÌID·µ»Ø¸ø  
¸¸½ø³ÌµÄ  
ÀíÓÉÊÇ£ºÒòΪһ¸ö½ø³ÌµÄ×Ó½ø³Ì¿ÉÒÔ¶àÓÚÒ»¸ö£¬ËùÒÔûÓÐÒ»¸öº¯Êýʹһ¸ö½ø³Ì¿ÉÒÔ  
»ñµÃÆäËù  
´æ×Ó½ø³ÌµÄ½ø³ÌID¡£forkʹ×Ó½ø³ÌµÃµ½·µ»ØÖµ0µÄÀíÓÉÊÇ£ºÒ»¸ö½ø³ÌÖ»»áÓÐÒ»¸ö¸¸  
½ø³Ì£¬Ëù  
ÒÔ×Ó½ø³Ì×ÜÊÇ¿ÉÒÔµ÷ÓÃgetppidÒÔ»ñµÃÆä¸¸½ø³ÌµÄ½ø³ÌID¡£(½ø³ÌID0×ÜÊÇÓɽ»»»½ø  
³ÌʹÓ㬠 
ËùÒÔÒ»¸ö×Ó½ø³ÌµÄ½ø³ÌID²»¿ÉÄÜΪ0¡£)ª¥  
×Ó½ø³ÌºÍ¸¸½ø³Ì¼ÌÐøÖ´ÐÐforkÖ®ºóµÄÖ¸Áî¡£×Ó½ø³ÌÊǸ¸½ø³ÌµÄ¸´ÖÆÆ÷¡£ÀýÈ磬×Ó½ø  
³Ì¾ÍµÃ¸¸  
½ø³ÌÊý¾Ý¿Õ¼ä¡¢¶ÑºÍÕ»µÄ¸´ÖÆÆ÷¡£×¢Ò⣬ÕâÊÇ×Ó½ø³ÌËùÓµÓõĿ½±´¡£¸¸¡¢×Ó½ø³Ì²¢  
²»¹²ÏíÕâ  
Щ´æ´¢¿Õ¼ä²¿·Ö¡£Èç¹ûÕýÎĶÎÊÇÖ»¶ÁµÄ£¬Ôò¸¸¡¢×Ó½ø³Ì¹²ÏíÕýÎĶÎ(7ª±6½Ú)¡£ª¥  
ºÜ¶àÏÖÔÚµÄʵÏÖ²¢²»×öÒ»¸ö¸¸½ø³ÌÊý¾ÝµÄÕ»ºÍ¶ÑµÄÍêÈ«¿½±´£¬ÒòΪÔÚforkÖ®ºó¾­³£  
¸úËæ×Åex  
ec¡£×÷ÎªÌæ´ú£¬Ê¹ÓÃÁËÔÚдʱ¸´ÖÆ(COW)µÄ¼¼Êõ¡£ÕâÐ©ÇøÓòÓɸ¸¡¢×Ó½ø³Ì¹²Ïí£¬¶ø  
ÇÒϵͳºË  
½«ËüÃǵĴæÈ¡È¨¸Ä±äΪֻ¶ÁµÄ¡£Èç¹ûÓнø³ÌÊÔͼÐÞ¸ÄÕâÐ©ÇøÓò£¬ÔòϵͳºËΪÓйز¿  
·Ö£¬µäÐÍ  
µÄÊÇÐé´æÏµÍ³ÖеÄ"Ò³"£¬×÷Ò»¸ö¿½±´¡£Bach£Û£±£¹£¸£¶£ÝµÄ9ª±2½ÚºÍLefflenµÈ£Û  
£±£¹£¸  
£¹£ÝµÄ5ª±7½Ú¶ÔÕâÖÖÌØÕ÷×÷Á˸üÏêϸµÄ˵Ã÷¡£ª¥  
ʵÀýª¥  
³ÌÐò8ª±1ÀýʾÁËForkº¯Êý¡£Èç¹ûÖ´Ðд˳ÌÐòÔòµÃµ½£ºª¥  
$ aª±outª¥  
a write to stdoutª¥  
before forkª¥  
pid=430,glob=7,var=89¡þ¡þ×Ó½ø³ÌµÄ±äÁ¿Öµ¸Ä±äÁ˪¥  
pid=429,glob=6,var=88¡þ¡þ¸¸½ø³ÌµÄ±äÁ¿ÖµÃ»Óиı䪥  
$ aª±out>tempª±outª¥  
$ cat tempª±outª¥  
a write to stdoutª¥  
before forkª¥  
pid=432,glob=7,var=89ª¥  
before forkª¥  
pid=431,glob=6,var=88ª¥  
Ò»°ã£¬ÔÚforkÖ®ºóÀïÏȽø³ÌÏÈÖ´ÐУ¬»¹ÊÇ×Ó½ø³ÌÏÈÖ´ÐÐÊDz»È·¶¨µÄ¡£ÕâÈ¡¾öÓÚϵͳ  
ºËËùʹÓà 
µÄµ÷¶ÈËã·¨¡£Èç¹ûÒªÇóÎÄ¡¢×Ö½ø³ÌÖ®¼äÏ໥ͬ²½£¬ÔòÒªÇóijÖÖÐÎʽµÄ½ø³Ì¼äͨÐÅ¡£  
ÔÚ³ÌÐò8  
ª±1ÖУ¬¸¸½ø³ÌÌå×Ô¼ºÇ»Ãß2ÃëÖÓ£¬ÒԴ˸Ã×Ó½ø³ÌÏÈÖ´ÐС£µ«²¢²»±£Ö¤2ÃëÖÓÒѾ­×ã  
¹»£¬ÔÚ8ª±  
8ÊÐ˵Ã÷¾¹Ñ§Ìõ¼þʱ£¬ÎÒÃÇ»¹¹»Éî¼°ÕâÒ»ÎÊÌâ¼°ÆäËüÀàÐ͵Äͬ²½·½·¨¡£ÔÚ10ª±6½Ú¿Ú  
£¬ÔÚforkÖ®ºóÎÒÃǽ«ÓÃÐźÅÌå¡¢¸¸¡¢×Ó½ø³Ìͬ²½¡£ª¥  
×¢Ò⣬³ÌÐò8ª±1ÖÐforkÓëI/Oº¯ÊýÖ®¼äµÄ¹ØÏµ¡£»ØÒäµÚÈýÕÂÖÐËùÊö£¬Wrikº¯ÊýÊDz»  
´ø»º´æµÄ¡£¹ú»ÒÔÚforkÖ®¼äµ÷ÓÃWrirºó£¬ËùÒÔ¾ßÊý¾Ýдµ½±ê×¼Êä³öÉÏÒ»´Î¡£µ«ÊÇ£¬  
±ê×¼I/O¿âÊÇ´ø»º´æµÄ¡£»ØÒäһϵÚ5ª±12½Ú£¬Èç¹û±ê×¼Êä³öÁ¬µ½ÖÕÉ豸£¬ÔòËüÊÇ  
Ðлº³åµÄ£¬·ñÔòËüÊÇÀ仺³åµÄ¡£µ±ÒÔ½»»¥·½Ê½ÔËÐиóÌÐòʱ£¬ÎÒÃÇÖ»¿Îµ½printf  
Êä³öµÄÐÐÒ»´Î£¬¾ßÔ­ÒòÊDZê×¼Êä³ö»º´æÊÕÐÂÐзûˢС£µ«Êǵ±ÊÕ±ê×¼Êä³öÖØÐ¶¨  
Ïòµ½Ò»¸öÎļþʱ£¬ÎÒÃÇÈ´µÃµ½printfÊä³öÐÐÁ½´Îʱ£¬¸ÃÐÐÊý¾ÝÈÔÔÚ»º³åÖУ¬È»ºó  
ÔÚ¸¸½ø³ÌÊý¾Ý¿Õ¼ä¸´ÖƵ½×Ó½ø³ÌÖÐʱ¸Ã»º´æÊý¾ÝÒ²±»¸´ÖƵ½×Ó½ø³ÌÖС£  
ÓÚÊÇÄÇʱ¸¸¡¢×Ó½ø³Ì¸÷×ÔÓÐÁË´ø¸ÃÐÐÄÚÈݵĻº³å¡£ÔÚexit֮ǰµÄµÚ¶þ¸öprintf½«  
   
ÆäÊý¾ÝÌí¼Óµ½ÏÖ´æµÄ»º´æÖС£µ±Ã¿¸ö½ø³ÌÖÕֹʱ£¬Æä»º´æÖеÄÄÚÈݱ»Ð´µ½ÏàÓ¦Îļþ  
ÖС£ª¥ª¥  
P190ª¥ª¥  
³ÌÐò8ª±1¡þforkº¯ÊýµÄʵÀýª¥  
Îļþ¹²Ïíª¥  
¶Ô³ÌÐò8ª±1Ðè×¢ÒâµÄÁíÒ»µãÊÇ£ºÔÚÖØÐ¶¨Ïò¸¸½ø³ÌµÄ±ê×¼Êä³öʱ£¬×Ó½ø³ÌµÄ±ê×¼Êä  
³öÒ²±»ÖØ  
ж¨Ïò¡£È·¶¨,forkµÄÒ»¸öÌØÐÔÊÇËùÓÐÓɸ¸½ø³Ì´ò¿ªµÄÃèÊö·û¶¼¸´ÖƵ½×Ó½ø³ÌÖС£  
¸¸¡¢×Ó½ø  
³Ìÿ¸öÏàͬµÄ´ò¿ªÃèÊö·û¹²ÏíÒ»¸öÎļþ±íÏî¡£(»ØÒäͼ3ª±4)¡£ª¥  
¿¼ÂÇÏÂÊöÇé¿ö£¬Ò»¸ö½ø³Ì´ò¿ªÁËÈý¸ö²»Í¬Îļþ£¬ËüÃÇÊÇ£º±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê  
×¼³ö´í¡£  
ÔÚ´Ófork·µ»ØÊ±£¬ÎÒÃÇÓÐÁËÈçͼ8ª±1ÖÐËùʾµÄ°²ÅÅ¡£ª¥ª¥  
P191ª¥ª¥  
ͼ8ª±1¡þforkÖ®ºó¸¸×Ó¡¢½ø³ÌÖ®¼ä¶Ô´ò¿ªÎļþµÄ¹²Ïíª¥  
ÕâÖÖ¹²ÏíÎļþµÄ·½Ê½Ê¹¸¸¡¢×Ó½ø³Ì¶ÔͬһÎļþʹÓÃÁËÒ»¸öÎļþÎ»ÒÆÁ¿¡£¿¼ÂÇÏÂÊöÇé  
¿ö£ºÒ»¸ö  
½ø³ÌforkÁËÒ»¸ö×Ó½ø³Ì£¬È»ºóµÈ´ý×Ó½ø³ÌÖÕÖ¹¡£¼Ù¶¨£¬×÷ΪÆÕͨ´¦ÀíµÄÒ»²¿·Ö£¬¸¸  
¡¢×Ó½ø³Ì  
¶¼Ïò±ê×¼Êä³öÖ´ÐÐд²Ù×÷¡£Èç¹û¸¸½ø³ÌʹÆä±ê×¼Êä³öÖØÐ¶¨Ïò(ºÜ¿ÉÄÜÊÇÓÉshellʵ  
ÏÖµÄ)£¬  
ÄÇô×Ó½ø³Ìдµ½¸Ã±ê×¼Êä³öʱ£¬Ëü½«¸üÐÂÓ븸½ø³Ì¹²ÏíµÄ¸ÃÎļþµÄÎ»ÒÆÁ¿¡£ÔÚÎÒÃÇ  
Ëù¿¼ÂǵĠ 
Àý×ÓÖУ¬µ±¸¸½ø³ÌµÈ´ý×Ó½ø³Ìʱ£¬×Ó½ø³Ìдµ½±ê×¼Êä³ö£»¶øÔÚ×Ó½ø³ÌÖÕÖ¹ºó£¬¸¸½ø  
³ÌҲдµ½  
±ê×¼Êä³öÉÏ£¬²¢ÇÒÖªµÀÆäÊä³ö»áÌí¼ÓÔÚ×Ó½ø³ÌËùдÊý¾ÝÖ®ºó¡£Èç¹û¸¸¡¢×Ó½ø³Ì²»¹²  
ÏíͬһÎÄ  
¼þÎ»ÒÆÁ¿£¬ÕâÖÖÐÎʽµÄ½»»¥×÷ÓþͺÜÄÑʵÏÖ¡£ª¥  
Èç¹û¸¸¡¢×Ó½ø³Ìдµ½Í¬Ò»ÃèÊö·ûÎļþ£¬µ«ÓÖûÓÐÈκÎÐÎʽµÄͬ²½(ÀýÈçʹ¸¸½ø³ÌµÈ  
´ý×Ó½ø³Ì)  
£¬ÄÇôËüÃǵÄÊä³ö¾Í»áÏ໥»ìºÏ(¼Ù¶¨ËùÓõÄÃèÊö·ûÊÇÔÚfork֮ǰ´ò¿ªµÄ)¡£ËäÈ»Õâ  
ÖÖÇé¿öÊÇ  
¿ÉÄÜ·¢ÉúµÄ(¼û³ÌÐò8ª±1)£¬µ«Õâ²¢²»Êdz£ÓõIJÙ×÷·½Ê½¡£ª¥  
ÓÐÁ½ÖÖ³£¼ûµÄÔÚforkÖ®ºó´¦ÀíÎļþÃèÊö·ûµÄÇé¿ö£ºª¥  
1ª±¸¸½ø³ÌµÈ´ý×Ó½ø³ÌÍê³É¡£ÔÚÕâÖÖÇé¿öÏ£¬¸¸½ø³ÌÎÞÐè¶ÔÆäÃèÊö·û×÷Èκδ¦Àí¡£  
µ±×Ó½ø³ÌÖÕÖ¹ºó£¬ËüÔø½øÐйý¶Á¡¢Ð´²Ù×÷µÄÈÎÒ»¹²ÏíÃèÊö·ûµÄÎļþÎ»ÒÆÁ¿Ò²×÷ÁË  
ÏàÓ¦¸üС£ª¥  
2ª±¸¸¡¢×Ó½ø³Ì¸÷×ÔÖ´Ðв»Í¬µÄ³ÌÐò¶Î¡£ÔÚÕâÖÖÇé¿öÏ£¬ÔÚforkÖ®ºó£¬¸¸¡¢×Ó½ø³Ì  
¸÷×Թرՠ 
ËüÃDz»ÐèʹÓõÄÎļþÃèÊö·û£¬²¢ÇÒ²»¸ÉÈŶԷ½Ê¹ÓõÄÎļþÃèÊö·û¡£ÕâÖÖ·½·¨ÊÇÍøÂç  
·þÎñ½ø³Ì  
³£³£Ê¹Óõġ£ª¥  
³ýÁË´ò¿ªÎļþÖ®Í⣬ºÜ¶à¸¸½ø³ÌµÄÆäËüÐÔÖÊÒ²ÓÉ×Ó½ø³Ì¼Ì³Ð£ºª¥  
¡¤Êµ¼ÊÓû§ID¡¢Êµ¼Ê×éID¡¢ÓÐЧÓû§ID¡¢ÓÐЧ×éIDª¥  
¡¤Ìí¼Ó×éIDª¥  
¡¤½ø³Ì×éIDª¥  
¡¤¶Ô»°ÆÚIDª¥  
¡¤¿ØÖÆÖն˪¥  
¡¤ÉèÖÃ-Óû§-ID±êÖ¾ºÍÉèÖÃ-×é-ID±êÖ¾ª¥  
¡¤µ±Ç°¹¤×÷Ŀ¼ª¥  
¡¤¸ùĿ¼ª¥  
¡¤Îļþ·½Ê½´´½¨ÆÁ±Î×Öª¥  
¡¤ÐÅºÅÆÁ±ÎºÍÅÅÁЪ¥  
¡¤¶ÔÈÎÒ»´ò¿ªÎļþÃèÊö·ûµÄÔÚÖ´ÐÐʱ¹Ø±Õ±êÖ¾ª¥  
¡¤»·¾³ª¥  
¡¤Á¬½ÓµÄ¹²Ïí´æ´¢¶Îª¥  
¡¤×ÊÔ´ÏÞÖÆª¥  
¸¸¡¢×Ó½ø³ÌÖ®¼äµÄÇø±ðÊÇ£ºª¥  
¡¤ forkµÄ·µ»ØÖµª¥  
¡¤½ø³ÌIDª¥  
¡¤²»Í¬µÄ¸¸½ø³ÌIDª¥  
¡¤×Ó½ø³ÌµÄtms ¼£Ã£Ä££ª³£²¡½utime,tms ¼£Ã£Ä££ª³£²¡½stime,tms ¼£Ã£Ä££ª³£²  
¡½cutime  
ÒÔ¼°tms ¼£Ã£Ä££ª³£²¡½ustimeÉèÖÃΪ0¡£ª¥  
¡¤¸¸½ø³ÌÉèÖõÄËø£¬×Ó½ø³Ì²»¼Ì³Ðª¥  
¡¤×Ó½ø³ÌµÄÄ©¾ö¸æ¾¯±»Çå³ýª¥  
¡¤×Ó½ø³ÌµÄÄ©¾öÐźż¯ÉèÖÃΪ¿Õ¼¯ª¥  
ÆäÖкܶàÌØÐÔÖÁ½ñÉÐÄ©ÌÖÂÛ¹ý£¬ÎÒÃǽ«ÔÚÒÔºó¼¸ÕÂÖжÔËüÃǽøÐÐ˵Ã÷¡£ª¥  
ʹforkʧ°ÜµÄÁ½¸öÖ÷ÒªÔ­ÒòÊÇ£º(a)ϵͳÖÐÒѾ­ÓÐÁËÌ«¶àµÄ½ø³Ì(ͨ³£Òâζ×Åij¸ö·½  
Ãæ³öÁË  
ÎÊÌâ)£¬»òÕß(b)¸Ãʵ¼ÊÓû§IDµÄ½ø³Ì×ÜÊý³¬¹ýÁËϵͳÏÞÖÆ¡£»ØÒäͼ2ª±7£¬ÆäÖÐCHI  
LD  £Ã£Ä  
 £ª³£²¡½MAX¹æ¶¨ÁËÿ¸öʵ¼ÊÓû§IDÔÚÈÎһʱ¿Ì¿É¾ßÓеÄ×î´ó½ø³ÌÊý¡£ª¥  
forkÓÐÁ½ÖÖÓ÷¨£ºª¥  
1ª±Ò»¸ö¸¸½ø³ÌÏ£Íû¸´ÖÆ×Ô¼º£¬Ê¹¸¸¡¢×Ó½ø³ÌͬʱִÐв»Í¬µÄ´úÂë¶Î¡£Õâ¶ÔÍøÂç·þ  
Îñ½ø³ÌÊÇ  
³£¼ûµÄ¡¼CD2¡½¸¸½ø³ÌµÈ´ýίÍÐÕߵķþÎñÇëÇó¡£µ±ÕâÖÖÇëÇóµ½´ïʱ£¬¸¸½ø³Ìµ÷ÓÃfo  
rk£¬Ê¹×Ó  
½ø³Ì´¦Àí´ËÇëÇ󡣸¸½ø³ÌÔò¼ÌÐøµÈ´ýÏÂÒ»¸ö·þÎñÇëÇ󡣪¥  
2ª±Ò»¸ö½ø³ÌÒªÖ´ÐÐÒ»µÀ²»Í¬µÄ³ÌÐò¡£Õâ¶ÔshellÊdz£¼ûµÄÇé¿ö¡£ÔÚÕâÖÖÇé¿öÏ£¬×Ó  
½ø³ÌÔÚ´Ó  
fork·µ»ØºóÁ¢¼´µ÷ÓÃexec(ÎÒÃǽ«ÔÚ8ª±9½Ú˵Ã÷exec)¡£ª¥  
ijЩ²Ù×÷ϵͳ½«2ÖеÄÁ½¸ö²Ù×÷(forkÖ®ºóÖ´ÐÐexec)×éºÏ³ÉÒ»¸ö£¬²¢³ÆÆäΪspawn¡£  
Unix½«Õâ  
Á½¸ö²Ù×÷·Ö¿ª£¬ÒòΪÔںܶೡºÏÐèÒªµ¥¶ÀʹÓÃfork£¬ËüºóÃæ²¢²»¸úËæexec¡£ÁíÍ⣬  
½«ÕâÁ½¸ö  
²Ù×÷·Ö¿ª£¬Ê¹µÃ×Ó½ø³ÌÔÚforkºÍexecÖ®¼ä¿ÉÒÔ¸ü¸Ä×Ô¼ºµÄÊôÐÔ¡£ÀýÈçI/OÖØÐ¶¨Ïò  
¡¢Óû§ID  
¡¢ÐźÅÅÅÁеȡ£ÔÚµÚÊ®ËÄÕÂÖÐÓкܶàÕâ·½ÃæµÄÀý×Ó¡£ª¥  
8ª±4¡þvforkº¯Êýª¥  
vforkº¯ÊýµÄµ÷ÓÃÐòÁкͷµ»ØÖµÓëforkÏàͬ£¬µ«Á½ÕßµÄÓïÒ岻ͬ¡£ª¥  
vforkÆðÔ´ÓÚ½ÏÔçµÄ4BSDÐé´æ°æ±¾¡£ÔÚLeffler et al £Û1989£ÝµÄ5ª±7½ÚÖÐÖ¸³ö"Ëä  
È»ËüÊÇ  
ÌØ  
±ðÓÐЧÂʵ쬵«ÊÇvforkµÄÓïÒåºÜÆæÌØ£¬Í¨³£ÈÏΪËü¾ßÓнṹÉϵÄȱÏÝ"¡£¾¡¹ÜÈç´Ë  
SVR4ºÍ4  
ª±3+BSDÈÔÖ§³Övfork¡£ª¥  
ijЩϵͳ¾ßÓÐÍ·Îļþ<vforkª±h>£¬µ±µ÷ÓÃvforkʱ£¬Ó¦µ±°üÀ¨¸ÃÍ·Îļþ¡£ª¥  
vforkÓÃÓÚ´´½¨Ò»¸öнø³Ì£¬¶ø¸Ãнø³ÌµÄÄ¿µÄÊÇexecÒ»µÀгÌÐò(ΪÉϽÚ2ÖÐÒ»Ñù  
)¡£³ÌÐò1  
ª±5ÖеÄshell»ù±¾²¿·Ö¾ÍÊÇÕâÖÖÀàÐͳÌÐòµÄÒ»¸öÀý×Ó¡£vforkÓëforkÒ»Ñù¶¼´´½¨Ò»  
¸ö×Ó½ø³Ì  
£¬µ«ÊÇËü²¢²»½«¸¸½ø³ÌµÄµØÖ·¿Õ¼äÍêÈ«¸´ÖƵ½×Ó½ø³ÌÖУ¬ÆäÉèÏëÊÇ×Ó½ø³Ì»áÁ¢¼´µ÷  
ÓÃexec(  
»òexit)£¬ÓÚÊÇÒ²¾Í²»»á´æ·Ã¸ÃµØÖ·¿Õ¼ä¡£²»¹ýÔÚ×Ó½ø³Ìµ÷ÓÃexec»òexit֮ǰ£¬Ëü  
ÔÚ¸¸½ø³Ì  
µÄ¿Õ¼äÖÐÔËÐС£ÕâÖÖ¹¤×÷·½Ê½ÔÚijЩUnixµÄҳʽÐé´æÊµÏÖÖÐÌá¸ßÁËЧÂÊ(ÓëÎÒÃÇÉÏ  
½ÚÖÐÌá¼°  
µÄ£¬ÔÚforkÖ®ºó¸úËæexec£¬²¢²ÉÓÃÔÚдʱ¸´ÖƼ¼ÊõÏàÀàËÆ)¡£ª¥  
vforkºÍforkÖ®¼äµÄÁíÒ»¸öÇø±ðÊÇ£ºvfork±£Ö¤×Ó½ø³ÌÏÈÔËÐУ¬ÔÚËüµ÷ÓÃexec»òexi  
tÖ®ºó¸¸½ø  
³ÌÔÙ¿ÉÄܱ»µ÷¶ÈÔËÐС£(Èç¹ûÔÚµ÷ÓÃÕâÁ½¸öº¯Êý֮ǰ×Ó½ø³ÌÒÀÀµÓÚ¸¸½ø³ÌµÄ½øÒ»²½  
¶¯×÷£¬Ôò  
»áµ¼ÖÂËÀËø¡£)ª¥  
ʵ¼Êª¥  
ÔÚ³ÌÐò8ª±1ÖÐʹÓÃvfork´úÌæfork£¬²¢×÷ÆäËüÏàÓ¦Ð޸ĵõ½³ÌÐò8ª±2¡£ª¥  
ª¥  
P194ª¥ª¥  
³ÌÐò8ª±2¡þvforkº¯ÊýµÄʵÀýª¥  
ÔËÐиóÌÐòµÃµ½£ºª¥  
$ aª±outª¥  
befork vforkª¥  
pid=607,glob=7,var=89ª¥  
×Ó½ø³Ì¶Ô±äÁ¿globºÍvar×÷Ôö1²Ù×÷£¬½á¹û¸Ä±äÁ˸¸½ø³ÌÖеıäÁ¿Öµ¡£ÒòΪ×Ó½ø³ÌÔÚ  
¸¸½ø³ÌµÄ  
µØÖ·¿Õ¼äÖÐÔËÐУ¬ËùÒÔÕâ²¢²»ÁîÈËðÍÑÈ¡£µ«ÊÇÆä×÷ÓõÄÈ·Óëfork²»Í¬¡£ª¥  
×¢Ò⣬ÔÚ³ÌÐò8ª±2ÖУ¬µ÷ÓÃÁË ¼£Ã£Ä££ª³£²¡½exit¶ø²»ÊÇexit¡£ÕýÈç8ª±5½ÚËùÊö£¬  
 ¼£Ã£Ä££  
ª³£²¡½exit²¢²»Ö´Ðбê×¼I/O»º´æµÄˢвÙ×÷¡£Èç¹ûÓÃexit¶ø²»ÊÇ ¼£Ã£Ä££ª³£²¡½  
exit£¬Ôò  
¸Ã³ÌÐòµÄÊä³öÊÇ£ºª¥  
$ aª±outª¥  
before vforkª¥  
´ÓÖпɼû£¬¸¸½ø³ÌprintfµÄÊä³öÏûʧÁË¡£ÆäÔ­ÒòÊÇ×Ó½ø³Ìµ÷ÓÃÁËexit£¬Ëüˢпª¹Ø  
±ÕÁËËùÓР 
±ê×¼I/OÁ÷¡£Õâ°üÀ¨±ê×¼Êä³ö¡£ËäÈ»ÕâÊÇÓÉ×Ó½ø³ÌÖ´Ðе쬵«È´ÊÇÔÚ¸¸½ø³ÌµÄµØÖ·  
¿Õ¼äÖнø  
Ðеģ¬ËùÒÔËùÓÐÊܵ½Ó°ÏìµÄ±ê×¼I/O FILE¶ÔÏó¶¼ÊÇÔÚ¸¸½ø³ÌÖС£µ±¸¸½ø³Ìµ÷ÓÃpri  
ntfʱ£¬±ê  
×¼Êä³öÒѱ»¹Ø±ÕÁË£¬ÓÚÊÇprintf·µ»Ø-1¡£ª¥  
Leffler et alª±£Û£±£¹£¸£¹£ÝµÄ5ª±7½ÚÖаüº¬ÁËforkºÍvforkʵÏÖ·½ÃæµÄ¸ü¶àÐÅÏ¢  
¡£Á·Ï°8  
ª±1ºÍ8ª±2Ôò¼ÌÐøÁ˶ÔvforkµÄÌÖÂÛ¡£ª¥  
8ª±5¡þexitº¯Êýª¥  
ÈçͬÔÚ7ª±3½ÚÖÐËùÊö£¬½ø³ÌÓÐÈýÖÖÕý³£ÖÕÖ¹·¨£¬ÓÐÁ½ÖÖÒì³£ÖÕÖ¹·¨¡£ª¥  
1ª±Õý³£ÖÕÖ¹ª¥  
(a)ÔÚmainº¯ÊýÄÚÖ´ÐÐreturnÓï¾ä¡£ÈçÔÚ73½ÚÖÐËùÊö£¬ÕâµÈЧÓÚµ÷ÓÃexit¡£ª¥  
(b)µ÷ÓÃexitº¯Êý¡£´Ëº¯ÊýÓÉANSIC¶¨Ò壬Æä²Ù×÷°üÀ¨Á˵÷Óø÷ÖÕÖ¹´¦Àí³ÌÐò(ÖÕÖ¹  
´¦Àí³ÌÐò  
ÊÇÔÚµ÷ÓÃatexitº¯ÊýʱµÇ¼µÄ)£¬È»ºó¹Ø±ÕËùÓбê×¼I/OÁ÷µÈ¡£ÒòΪANSIC²¢²»´¦Àí  
ÎļþÃèÊö  
·û¡¢¶à½ø³Ì(¸¸¡¢×Ó½ø³Ì)ÒÔ¼°×÷Òµ¿ØÖÆ£¬ËùÒÔÕâÒ»¶¨Òå¶ÔUnixϵͳ¶øÑÔÊDz»ÍêÕûµÄ  
¡£ª¥  
(c)µ÷ÓÃ-exitϵͳµ÷Óú¯Êý¡£´Ëº¯ÊýÓÉexitµ÷Óã¬Ëü´¦ÀíUnixÌØ¶¨µÄϸ½Ú¡£-exit  
ÊÇÓÉPOSIX  
ª±1˵Ã÷µÄ¡£ª¥  
2ª±Òì³£ÖÕÖ¹£ºª¥  
(a)µ÷ÓÃabort¡£Ëü²úÒµSIGABRTÐźţ¬ËùÒÔÊÇÏÂÒ»ÖÖÒì³£ÖÕÖ¹µÄÒ»ÖÖÌØÀý¡£ª¥  
(b)µ±½ø³Ì½ÓÊÕµ½Ä³¸öÐźÅʱ¡£(µÚʮս«½ÏÏêϸµØËµÃ÷ÐźÅ)¡£½ø³Ì±¾Éí(ÀýÈçµ÷Óà 
abortº¯  
Êý)¡¢ÆäËü½ø³ÌºÍϵͳºË¶¼ÄܲúÉú´«Ë͵½Ä³Ò»½ø³ÌµÄÐźš£ÀýÈ磬½ø³ÌÔ½³öÆäµØÖ·  
¿Õ¼ä·ÃÎÊ  
´æ´¢µ¥Ôª£¬»òÕß³ýÒÔ0£¬ÏµÍ³ºË¾Í»áΪ¸Ã½ø³Ì²úÉúÏàÓ¦µÄÐźš£ª¥  
²»¹Ü½ø³ÌÊÇÈçºÎÖÕÖ¹µÄ£¬×îºó¶¼»áÖ´ÐÐϵͳºËÖеÄͬһ¶Î´úÂë¡£Õâ¶Î´úÂëΪÏàÓ¦½ø  
³Ì¹Ø±ÕËù  
Óдò¿ªÃèÊö·û£¬ÊÍ·ÅËüËùʹÓõĴ洢Æ÷µÈµÈ¡£ª¥  
¶ÔÉÏÊöÈκÎÒ»ÖÖÖÕÖ¹ÇéÐΣ¬ÎÒÃǶ¼Ï£ÍûÖÕÖ¹½ø³ÌÄܹ»Í¨ÖªÆä¸¸½ø³ÌËüÊÇÈçºÎÖÕÖ¹µÄ  
¡£¶ÔÓÚex  
itºÍ-exit£¬ÕâÊÇÒÀ¿¿´«µÝ¸ø¿ÕÃǵÄÍ˳ö״̬²ÎÊýÀ´ÊµÏֵġ£ÔÚÒì³£ÖÕÖ¹Çé¿ö£¬Ïµ  
ͳºË(²»ÊÇ  
½ø³Ì±¾Éí)²úÉúÒ»¸öָʾÆäÒì³£ÖÕÖ¹Ô­ÒòµÄÖÕֹ״̬¡£ÔÚÈÎÒ»ÖÖÇé¿öÏ£¬¸ÃÖÕÖ¹½ø  
³ÌµÄ¸¸½ø  
³Ì¶¼ÄÜÓÃwait»òwaitpidº¯Êý(ÔÚÏÂÒ»½Ú˵Ã÷)È¡µÃÆäÖÕֹ״̬¡£ª¥  
×¢Ò⣬ÎÒÃÇÔÚÕâÀïʹÓÃÁË"Í˳ö״̬"(ËüÊÇ´«Ïòexit»ò-exitµÄ²ÎÊý£¬»òmainµÄ·µ»Ø  
Öµ)ºÍ  
"ÖÕֹ״̬"Á½¸öÊõÓÒÔ±íʾÓÐËùÇø±ð¡£ÔÚ×îºóµ÷ÓÃ-exitʱ£¬ÏµÍ³ºË½«ÆäÍ˳ö×´  
̬ת»»  
³ÉÖÕֹ״̬(Çë»ØÒäͼ7ª±1)¡£Í¼8ª±2˵Ã÷Á˸¸½ø³Ì¼ì²é×Ó½ø³ÌµÄÖÕֹ״̬µÄ²»Í¬·½  
·¨¡£Èç¹û  
×Ó½ø³ÌÕý³£ÖÕÖ¹£¬Ôò¸¸½ø³Ì¿ÉÒÔ»ñµÃ×Ó½ø³ÌµÄÍ˳ö״̬¡£ª¥  
ÔÚ˵Ã÷fcrkº¯Êýʱ£¬Ò»¶¨ÊÇÒ»¸ö¸¸½ø³ÌÉú³ÉÒ»¸ö×Ó½ø³Ì¡£ÉÏÃæÓÖ˵Ã÷ÁË×Ó½ø³Ì½«Æä  
ÖÕֹ״̬  
·µ»Ø¸ø¸¸½ø³Ì¡£µ«ÊÇÈçºÎ¸¸½ø³ÌÔÚ×Ó½ø³Ì֮ǰÖÕÖ¹£¬Ôò½«ÈçºÎÄØ?Æä»Ø´ðÊǶÔÓÚÆä  
¸¸½ø³ÌÒÑ  
¾­ÖÕÖ¹µÄËùÓнø³Ì£¬ËüÃǵĸ¸½ø³Ì¶¼¸Ä±äΪinit½ø³Ì¡£ÎÒÃdzÆÕâЩ½ø³ÌÓÉinit½ø³Ì  
ÁìÑø¡£Æä  
²Ù×÷¹ý³Ì´óÖÂÊÇ£ºÔÚÒ»¸ö½ø³ÌÖÕֹʱ£¬ÏµÍ³ºËÖð¸ö¼ì²éËùÓл½ø³Ì£¬ÒÔÅжÏËüÊÇ  
·ñÊÇÕýÒª  
ÖÕÖ¹µÄ½ø³ÌµÄ×Ó½ø³Ì£¬Èç¹ûÊÇ£¬Ôò¸Ã½ø³ÌµÄ¸¸½ø³ÌID¾Í¸ü¸ÄΪ1(init½ø³ÌµÄID)¡£  
ÕâÖÖ´¦Àí  
·½·¨±£Ö¤ÁËÿ¸ö½ø³ÌÓÐÒ»¸ö¸¸½ø³Ì¡£ª¥  
ÁíÒ»¸öÎÒÃǹØÐĵÄÇé¿öÊÇÈç¹û×Ó½ø³ÌÔÚ¸¸½ø³Ì֮ǰÖÕÖ¹£¬ÄÇô¸¸½ø³ÌÓÖÈçºÎÄÜÔÚ×÷  
ÏàÓ¦¼ì²é  
ʱµÃµ½×Ó½ø³ÌµÄÖÕÖ¹×´Ì¬ÄØ?¶Ô´ËÎÊÌâµÄ»Ø´ðÊÇϵͳºËΪÿ¸öÖÕÖ¹×Ó½ø³Ì±£´æÁËÒ»  
¶¨Á¿µÄÐÅ  
Ï¢£¬ËùÒÔµ±ÖÕÖ¹½ø³ÌµÄ¸¸½ø³Ìµ÷ÓÃwait»òwaitpidʱ£¬¿ÉÒԵõ½ÓйØÐÅÏ¢¡£ÕâÖÖÐÅ  
Ï¢ÖÁÉÙ°ü  
À¨½ø³ÌID¡¢¸Ã½ø³ÌµÄÖÕֹ״̬¡¢ÒÔ·´¸Ã½ø³ÌʹÓõÄCPUʱ¼ä×ÜÁ¿¡£ÏµÍ³ºË¿ÉÒÔÊÍ·Å  
ÖÕÖ¹½ø³Ì  
ËùʹÓõÄËùÓд洢Æ÷£¬¹Ø±ÕÆäËùÓдò¿ªÎļþ¡£ÔÚUnixÊõÓïÖУ¬Ò»¸öÒѾ­ÖÕÖ¹£¬µ«ÊÇ  
Æä¸¸½ø³Ì  
ÉÐÄ©¶ÔÆä½øÐÐÉÆºó´¦Àí(»ñÈ¡ÖÕÖ¹×Ó½ø³ÌµÄÓйØÐÅÏ¢¡¢ÊÍ·ÅËüÈÔÕ¼ÓõÄ×ÊÔ´)µÄ½ø³Ì  
±»³ÆÎª½©  
ËÀ½ø³Ì¡£PS(1)ÃüÁ½©ËÀ½ø³ÌµÄ״̬´òӡΪZ¡£Èç¹û±àдһ¸ö³¤ÆÚÔËÐеijÌÐò£¬Ëü  
forkÁ˺ܠ 
¶à×Ó½ø³Ì£¬ÄÇô³ý·Ç¸¸½ø³ÌµÈ´ýÈ¡µÃ×Ó½ø³ÌµÄÖÕֹ״̬£¬·ñÔòÕâЩ×Ó½ø³Ì¾Í»á±ä³É  
½©ËÀ½ø³Ì  
¡£ª¥  
ϵͳVÌṩÁËÒ»ÖÖ±ÜÃ⽩ËÀ½ø³ÌµÄ·Ç±ê×¼»¯·½·¨£¬Õ⽫ÔÚ10ª±7ÖнéÉÜ¡£ª¥  
×îºóÒ»¸öÒª¿¼ÂǵÄÎÊÌâÊÇ£ºÒ»¸öÓÉinit½ø³ÌÁìÑøµÄ½ø³ÌÖÕֹʱ»á·¢Éúʲô?Ëü»á²»  
»á±ä³ÉÒ»  
¸ö½©ËÀ½ø³Ì?¶Ô´ËÎÊÌâµÄ»Ø´ðÊÇ"·ñ"£¬ÒòΪinit±»±àд³ÉÖ»ÒªÓÐÒ»¸ö×Ó½ø³ÌÖÕÖ¹£¬  
init¾Í  
»áµ÷ÓÃÒ»¸öwaitº¯ÊýÈ¡µÃÆäÖÕֹ״̬¡£ÕâÑùÒ²¾Í·ÀÖ¹ÁËÔÚϵͳÖÐÓкܶཀྵËÀ½ø³Ì¡£  
µ±Ìá¼°"  
Ò»¸öinitµÄ×Ó½ø³Ì"ʱ£¬ÕâÖ¸µÄÊÇinitÖ±½Ó²úÉúµÄ½ø³Ì(ÀýÈ磬½«ÔÚ9ª±2½Ú˵Ã÷µÄg  
etty½ø³Ì  
)£¬»òÕßÊÇÆä¸¸½ø³ÌÒÑÖÕÖ¹£¬ÓÉinitÊÕÑøµÄ½ø³Ì¡£ª¥  
8ª±6¡þwaitºÍwaitpidº¯Êýª¥  
µ±Ò»¸ö½ø³ÌÕý³£»òÒì³£ÖÕֹʱ£¬ÏµÍ³ºË¾ÍÏòÆä¸¸½ø³Ì·¢ËÍSIGCHLDÐźš£ÒòΪ×Ó½ø  
³ÌÖÕÖ¹ÊÇ  
¸öÒì²½Îļþ(Õâ¿ÉÒÔÔÚ¸¸½ø³ÌÔËÐеÄÈκÎʱºò·¢Éú)£¬ËùÒÔÕâÖÖÐźÅÒ²ÊÇϵͳºËÏò¸¸  
½ø³Ì·¢µÄ  
Ò첽֪ͨ¡£¸¸½ø³Ì¿ÉÒÔºöÂÔ¸ÃÐźţ¬»òÕßÌṩһ¸ö¸ÃÐźŷ¢Éúʱ¼´±»µ÷ÓÃÖ´Ðеĺ¯  
Êý(ÐźŠ 
´¦Àí³ÌÐò)¡£¶ÔÓÚÕâÖÖÐźŵÄϵͳĬÈ϶¯×÷ÊǺöÂÔËü¡£ÔÚµÚʮս«ËµÃ÷ÕâЩѡÔñÏî  
¡£ÏÖÔÚÐè  
ÒªÖªµÀµÄÊǵ÷ÓÃwait»òwaitpidµÄ½ø³Ì¿ÉÄܻ᣺ª¥  
¡¤×èÈû(Èç¹ûÆäËùÓÐ×Ó½ø³Ì¶¼»¹ÔÚÔËÐÐ)£¬»òÕߪ¥  
¡¤´ø×Ó½ø³ÌµÄÖÕֹ״̬Á¢¼´·µ»Ø(Èç¹ûÒ»¸ö×Ó½ø³ÌÒÑÖÕÖ¹£¬ÕýµÈ´ý¸¸½ø³Ì´æÈ¡ÆäÖÕ  
ֹ״̬)£¬  
»òÕߪ¥  
¡¤³ö´íÁ¢¼´·µ»Ø(Èç¹ûËüûÓÐÈκÎ×Ó½ø³Ì)¡£ª¥  
Èç¹û½ø³ÌÓÉÓÚ½ÓÊÕµ½SIGCHLDÐźŶøµ÷ÓÃwait£¬Ôò¿ÉÆÚÍûwait»áÁ¢¼´·µ»Ø¡£µ«ÊÇÈç  
¹ûÔÚÒ»¸ö  
ÈÎÒâʱ¿Ìµ÷ÓÃwait£¬Ôò½ø³Ì¿ÉÄÜ»á×èÈû¡£ª¥  
#include <sys/typesª±h>ª¥  
#include <sys/waitª±h>ª¥  
pid ¼£Ã£Ä££ª³£²¡½t wait(int *ª«statloc);ª«ª¥  
pid ¼£Ã£Ä££ª³£²¡½t waitpid(pid ¼£Ã£Ä££ª³£²¡½t ª«pid,ª«int ª«ª³statloc,ª«  
int ª«op  
tions);ª«ª¥  
Both return:process ID if OK,0(see later),or -1 on error¡þÁ½¸öº¯Êý·µ»Ø£º  
Èô³É¹¦Îª  
½ø³ÌID£¬³ö´íΪ-1ª¥  
ÕâÁ½¸öº¯ÊýµÄÇø±ðÊÇ£ºª¥  
¡¤ÔÚÒ»¸ö×Ó½ø³ÌÖÕֹǰ£¬waitʹÆäµ÷ÓÃÕß×èÈû£¬¶øwaitpidÓÐһѡÔñÏËü¿ÉʹÓà 
µ÷ÓÃÕß²»  
×èÈû¡£ª¥  
¡¤waitpid²¢²»µÈ´ýµÚÒ»¸öÖÕÖ¹µÄ×Ó½ø³Ì¡¼CD2¡½ËüÓÐÈô¸É¸öÑ¡ÔñÏ¿ÉÒÔ¿ØÖÆËüËù  
µÈ´ýµÄ½ø  
³Ì¡£ª¥  
Èç¹ûÒ»¸ö×Ó½ø³ÌÒѾ­ÖÕÖ¹£¬ÊÇÒ»¸ö½©ËÀ½ø³Ì£¬ÔòwaitÁ¢¼´·µ»Ø²¢È¡µÃ¸Ã×Ó½ø³ÌµÄ×´  
̬£¬·ñÔò  
waitʹÆäµ÷ÓÃÕß×èÈûÖ±µ½Ò»¸ö×Ó½ø³ÌÖÕÖ¹¡£Èçµ÷ÓÃÕß×èÈû¶øÇÒËüÓжà¸ö×Ó½ø³Ì£¬Ôò  
ÔÚÆäÒ»¸ö  
×Ó½ø³ÌÖÕֹʱ£¬wait¾ÍÁ¢¼´·µ»Ø¡£ÒòΪwait·µ»ØÖÕÖ¹×Ó½ø³ÌµÄ½ø³ÌID£¬ËùÒÔËü×ÜÄÜ  
Á˽âÊÇÄÇ  
Ò»¸ö×Ó½ø³ÌÖÕÖ¹ÁË¡£ª¥  
ÕâÁ½¸öº¯ÊýµÄ²ÎÊýstalocÊÇÒ»¸öÕûÐÍÖ¸Õë¡£Èç¹ûstaloc×ÓÊÇÒ»¸ö¿ÕÖ¸Õ룬ÔòÖÕÖ¹½ø  
³ÌµÄÖÕÖ¹  
״̬¾Í´æ·ÅÔÚËüËùÖ¸ÏòµÄµ¥ÔªÄÚ¡£Èç¹û²»¹ØÐÄÖÕֹ״̬£¬Ôò¿É½«¸Ã²ÎÊýÖ¸¶¨Îª¿ÕÖ¸  
Õë¡£ª¥  
ÒÀ¾Ý´«Í³£¬ÕâÁ½¸öº¯Êý·µ»ØµÄÕûÐÍ״̬×ÖÊÇÓÉʵÏÖ¶¨ÒåµÄ¡£ÆäÖÐijЩλ±íʾÍ˳ö×´  
̬(Õý³£  
·µ»Ø)£¬ÆäËüλÔòָʾÐźűàºÅ(Òì³£·µ»Ø)£¬ÓÐһλָʾÊÇ·ñ²úÉúÁËÒ»¸öcoreÎļþ  
µÈµÈ¡£POS  
IXª±1¹æ¶¨ÖÕֹ״̬Óö¨ÒåÔÚ<sys/waitª±h>Öеĸ÷¸öºêÀ´²é¿´¡£ÓÐÈý¸ö»¥³âµÄºê¿É  
ÓÃÀ´È¡µÃ  
½ø³ÌÖÕÖ¹µÄÔ­Òò£¬ËüÃǵÄÃû×Ö¶¼ÒÔWIF¿ªÊ¼¡£»ùÓÚÕâÈý¸öºêÖÐÄÄÒ»¸öÖµÊÇÕæ£¬¾Í¿É  
Ñ¡ÓÃÆäËü  
ºêÀ´È¡µÃÖÕֹ״̬£¬ÐźűàºÅµÈ¡£ÕâЩ¶¼Ê¾ÓÚͼ8ª±2¡£ÔÚ8ª±9½ÚÖÐÌÖÂÛ×÷Òµ¿ØÖÆÊ±  
£¬½«ËµÃ÷  
ÈçºÎÍ£Ö¹Ò»¸ö½ø³Ì¡£ª¥ª¥  
P198ª¥ª¥  
ͼ8ª±2¡þ¼ì²éwaitºÍwaitpidËù·µ»ØµÄÖÕֹ״̬µÄºêª¥  
ʵÀýª¥  
³ÌÐò8ª±3Öеĺ¯Êýpr-exitʹÓÃͼ8ª±2ÖеĺêÒÔ´òÓ¡½ø³ÌµÄÖÕֹ״̬¡£ÔÚ±¾Õµĺܠ 
¶à³ÌÐòÖР 
¶¼½«µ÷Óô˺¯Êý¡£×¢Ò⣬Èç¹û¶¨ÒåÁËWCOREDUMP£¬Ôò´Ëº¯ÊýÒ²´¦Àí¸Ãºê¡£ª¥  
³ÌÐò8ª±4µ÷ÓÃpr-exitº¯Êý£¬ÀýʾÖÕֹ״̬µÄ²»Í¬Öµ¡£ÔËÐгÌÐò8ª±4¿ÉµÃ£ºª¥  
$ aª±outª¥  
normal termination,exit status=7ª¥  
abnormal termination,signal number=6(core file generated)ª¥  
abnormal termination,signal number=8(core file generated)ª¥ª¥  
P199ª¥  
³ÌÐò8ª±3¡þ´òÓ¡exit״̬µÄ˵Ã÷ª¥ª¥  
P200ª¥  
³ÌÐò8ª±4¡þÀýʾ²»Í¬µÄexitÖµª¥  
²»ÐÒµÄÊÇ£¬Ã»ÓÐÒ»ÖÖ¿ÉÒÆÖ²µÄ·½·¨½«WTERMSIGµÃµ½µÄÐźűàºÅÓ³ÕÕΪ˵Ã÷ÐÔµÄÃû×Ö  
¡£(10ª±2  
1½ÚÖÐ˵Ã÷ÁËÒ»ÖÖ·½·¨¡£)ÎÒÃDZØÐë²é¿´<signalª±h>Í·Îļþ²ÅÄÜÖªµÀSIGABRTµÄÖµÊÇ  
6£¬SIGFP  
EµÄÖµÊÇ8¡£ª¥  
ÕýÈçÇ°ÃæÒÑÌáµ½µÄ£¬Èç¹ûÒ»¸ö½ø³ÌÓм¸¸ö×Ó½ø³Ì£¬ÄÇôֻҪÓÐÒ»¸ö×Ó½ø³ÌÖÕÖ¹£¬w  
ait¾Í·µ»Ø  
¡£Èç¹ûÒªµÈ´ýÒ»¸öÖ¸¶¨µÄ½ø³ÌÖÕÖ¹(Èç¹ûÖªµÀÒªµÈ´ý½ø³ÌµÄID)£¬ÄÇô¸ÃÈçºÎ×öÄØ?  
ÔÚ½ÏÔçµÄU  
nix°æ±¾ÖУ¬±ØÐëµ÷ÓÃwait£¬È»ºó½«Æä·µ»ØµÄ½ø³ÌIDºÍËùÆÚÍûµÄ½ø³ÌIDÏà±È½Ï¡£Èç  
¹ûÖÕÖ¹½ø  
³Ì²»ÊÇËùÆÚÍûµÄ£¬Ôò½«¸Ã½ø³ÌIDºÍÖÕֹ״̬±£´æÆðÀ´£¬È»ºóÔٴε÷ÓÃwait¡£·´¸´Õâ  
Ñù×öÖ±µ½  
ËùÆÚÍûµÄ½ø³ÌÖÕÖ¹¡£ÏÂÒ»´ÎÓÖÏëµÈ´ýÒ»¸öÌØ¶¨½ø³Ìʱ£¬ÏȲ鿴ÒÑÖÕÖ¹µÄ½ø³Ì±í£¬Èô  
ÆäÖÐÒÑÓР 
ÒªµÈ´ýµÄ½ø³Ì£¬ÔòÈ¡ÓйØÐÅÏ¢£¬·ñÔòµ÷ÓÃwait¡£Æäʵ£¬ÎÒÃÇÐèÒªµÄÊǵȴýÒ»¸öÌØ¶¨  
½ø³ÌµÄº¯  
Êý¡£POSIXª±1¶¨ÒåÁËwaitpidº¯ÊýÒÔÌṩÕâÖÖ¹¦ÄÜ(ÒÔ¼°ÆäËüһЩ¹¦ÄÜ)¡£ª¥  
waitpidº¯ÊýÊÇÐÂÓÉPOSIXª±1¶¨ÒåµÄ¡£SVR4ºÍ4ª±3+BSD¶¼Ìṩ´Ëº¯Êý£¬µ«ÔçÆÚµÄϵ  
ͳVºÍ4ª±3  
BSD²¢²»Ìṩ´Ëº¯Êý¡£ª¥ª¥  
P200ª¥ª¥  
ͼ8ª±3¡þwaitpidµÄÑ¡ÔñÏî³£Êýª¥  
¶ÔÓÚwaitpidµÄpid²ÎÊýµÄ½âÊÍÓëÆäÖµÓйأºª¥  
pid==-1¡þµÈ´ýÈÎÒ»×Ó½ø³Ì¡£ÓÚÊÇÔÚÕâÒ»¹¦ÄÜ·½ÃæwaitpidÓëwaitµÈЧ¡£ª¥  
pid>0¡þµÈ´ýÆä½ø³ÌIDÓëpidÏàµÈµÄ×Ó½ø³Ì¡£ª¥  
pid==0¡þµÈ´ýÆä×éIDµÈÓÚµ÷Óýø³ÌµÄ×éIDµÄÈÎÒ»×Ó½ø³Ì¡£ª¥  
pid<-1¡þµÈ´ýÆä×éIDµÈÓÚpidµÄ¾ø¶ÔÖµµÄÈÎÒ»×Ó½ø³Ì¡£ª¥  
(ÔÚ9ª±4½Ú˵Ã÷½ø³Ì×é)¡£waitpid·µ»Ø¸ÃÖÕÖ¹×Ó½ø³ÌµÄ½ø³ÌID£¬¶ø¸Ã×Ó½ø³ÌµÄÖÕÖ¹  
״̬Ôòͨ  
¹ýstatloc·µ»Ø¡£¶ÔÓÚwait£¬ÆäΨһµÄ³ö´íÊǵ÷Óýø³ÌûÓÐ×Ó½ø³Ì¡£(Ôڴ˺¯Êýµ÷Óà 
ÓÉÒ»¸öÐÅ  
ºÅÖжÏʱ£¬Ò²¿ÉÄÜ·µ»ØÁíÒ»ÖÖ³ö´í¡£µÚʮս«¶Ô´Ë½ø³ÌÌÖÂÛ¡£)µ«ÊǶÔÓÚwaitpid£¬  
Èç¹ûÖ¸¶¨  
µÄ½ø³Ì»ò½ø³Ì×é²»´æÔÚ£¬»òÕßµ÷Óýø³ÌûÓÐ×Ó½ø³Ì¶¼Äܳö´í¡£ª¥  
options²ÎÊýʹÎÒÃÇÄܽøÒ»²½¿ØÖÆwaitpidµÄ²Ù×÷¡£´Ë²ÎÊý»òÕßÊÇ0£¬»òÕßÊÇͼ8ª±3  
Öг£ÊýµÄ  
°´Î»»ò¡£ª¥  
SVR4Ö§³ÖÁ½¸ö¸½¼ÓµÄ·Ç±ê×¼µÄoptions³£Êý¡£WNOWAITʹϵͳ½«ÆäÖÕֹ״̬ÒÑÓÉwai  
tpid·µ»Ø  
µÄ½ø³Ì±£³ÖÔڵȴý״̬£¬ÓÚÊǸýø³Ì¾Í¿É±»Ôٴεȴý¡£¶ÔÓÚWCONTINUED£¬·µ»ØÓÉp  
idÖ¸¶¨µÄ  
ijһ×Ó½ø³ÌµÄ״̬£¬¸Ã×Ó½ø³ÌÒѱ»¼ÌÐø£¬Æä״̬ÉÐÄ©±¨¸æ¹ý¡£ª¥  
waitpidº¯ÊýÌṩÁËwaitº¯ÊýûÓÐÌṩµÄÈý¸ö¹¦ÄÜ£ºª¥  
1ª± waitpidµÈ´ýÒ»¸öÌØ¶¨µÄ½ø³Ì(¶øwaitÔò·µ»ØÈÎÒ»ÖÕÖ¹×Ó½ø³ÌµÄ״̬)¡£ÔÚÌÖÂÛ  
popenº¯Êý  
ʱ»áÔÙ˵Ã÷ÕâÒ»¹¦ÄÜ¡£ª¥  
2ª± waitpidÌṩÁËÒ»¸öwaitµÄ·Ç×èÈû°æ±¾¡£ÓÐʱϣÍûÈ¡µÃÒ»¸ö×Ó½ø³ÌµÄ״̬£¬µ«  
²»Ïë×èÈû  
¡£ª¥  
3ª± waitpiolÖ§³Ö×÷Òµ¿ØÖÆ(ÒÔWUNTRACEDÑ¡ÔñÏî)¡£ª¥  
ʵÀýª¥  
»ØÒäÒ»ÏÂ8ª±5½ÚÖÐÓйؽ©ËÀ½ø³ÌµÄÌÖÂÛ¡£Èç¹ûÒ»¸ö½ø³ÌÒªforkÒ»¸ö×Ó½ø³Ì£¬µ«²»Òª  
ÇóËüµÈ´ý  
×Ó½ø³ÌÖÕÖ¹£¬Ò²²»Ï£Íû×Ó½ø³Ì´¦ÓÚ½©ËÀ״ֱ̬µ½¸¸½ø³ÌÖÕÖ¹£¬ÊµÏÖÕâÒ»ÒªÇóµÄ¾öÇÉ  
Êǵ÷ÓÃfo  
rkÁ½´Î¡£³ÌÐò8ª±5ʵÏÖÁËÕâÒ»µã¡£ª¥  
ÔÚµÚ¶þ¸ö×Ó½ø³ÌÖе÷ÓÃsleepÒÔ±£Ö¤ÔÚ´òÓ¡¸¸½ø³ÌIDʱµÚÒ»¸ö×Ó½ø³ÌÒÑÖÕÖ¹¡£ÔÚfo  
rkÖ®ºó£¬  
¸¸¡¢×Ó½ø³Ì¶¼¿É¼ÌÐøÖ´ÐС¼CD2¡½ÎÒÃÇÎÞ·¨ÓèÖªÄÇÒ»¸ö»áÏÈÖ´ÐС£Èç¹û²»Ê¹µÚ¶þ¸ö  
×Ó½ø³Ì˯  
Ãߣ¬ÔòÔÚforkÖ®ºó£¬Ëü¿ÉÄÜ±ÈÆä¸¸½ø³ÌÏÈÖ´ÐУ¬ÓÚÊÇËü´òÓ¡µÄ¸¸½ø³ÌID»áÊÇËüµÄ¸¸  
½ø³Ì£¬¶ø  
²»ÊÇinit½ø³Ì(½ø³ÌID1)¡£ª¥  
ª¥  
P202ª¥ª¥  
³ÌÐò8ª±5¡þforkÁ½´ÎÒÔ±ÜÃ⽩ËÀ½ø³Ìª¥  
Ö´ÐгÌÐò8ª±5µÃµ½£ºª¥  
$ aª±outª¥  
$ second child,parent pid=1ª¥  
×¢Ò⣬µ±Ô­ÏȵĽø³Ì(Ò²¾ÍÊÇexec±¾³ÌÐòµÄ½ø³Ì)ÖÕֹʱ£¬shell´òÓ¡Æäָʾ·û£¬Õâ  
ÔÚµÚ¶þ¸ö  
×Ó½ø³Ì´òÓ¡Æä¸¸½ø³ÌID֮ǰ¡£ª¥  
8ª±7¡þwait3ºÍwait4º¯Êýª¥  
4ª±3+BSDÌṩÁËÁ½¸ö¸½¼Óº¯Êýwait3ºÍwait4¡£ÕâÁ½¸öº¯ÊýÌṩµÄ¹¦ÄܱÈPOSIXª±1º¯  
ÊýwaitºÍ  
waitpidËùÌṩµÄ·Ö±ðÒª¶àÒ»¸ö£¬ËüÓ븽¼Ó²ÎÊýrusageÓйء£¸Ã²ÎÊýÒªÇóϵͳºË·µ  
»ØÓÉÖÕÖ¹  
½ø³Ì¼°ÆäËùÓÐ×Ó½ø³ÌʹÓõÄ×ÊÔ´ÕªÒª¡£ª¥  
#include <sys/typesª±h>ª¥  
#include <sys/waitª±h>ª¥  
#include <sys/timeª±h>ª¥  
#include <sys/resourceª±h>ª¥  
pid ¼£Ã£Ä££ª³£²¡½t wait3(int ª«statlocª«,int ª«optionsª«,struct rusage  
*ª«rusae)  
;ª«ª¥  
pid ¼£Ã£Ä££ª³£²¡½t wait4(pid ¼£Ã£Ä££ª³£²¡½t ª«pid,ª«int *ª«statloc,ª«in  
t ª«optio  
ns,ª«struct rusage *ª«rusage)ª«;ª¥  
Both return:process ID if OK,0,or -1 on error¡þÁ½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª½ø  
³ÌID£¬³ö  
´íΪ-1ª¥  
SVR4ÔÚÆäBSD¼æÈÝ¿âÖÐÒ²ÌṩÁËwait3º¯Êý¡£ª¥  
×ÊÔ´ÐÅÏ¢°üÀ¨Óû§CPUʱ¼ä×ÜÁ¿£¬ÏµÍ³CPUʱ¼ä×ÜÁ¿£¬È±Ò³´ÎÊý£¬½ÓÊÕµ½ÐźŵĴÎÊý  
µÈ¡£Óйؠ 
ϸ½ÚÇë²ÎÔÄgetrusage(2)ÊÖ²áÒ³¡£ÕâЩ×ÊÔ´ÐÅÏ¢Ö»°üÀ¨ÖÕÖ¹×Ó½ø³Ì£¬²¢²»°üÀ¨´¦ÓÚ  
ֹͣ״̬  
µÄ×Ó½ø³Ì¡£(ÕâÖÖ×ÊÔ´ÐÅÏ¢Óë7ª±11½ÚÖÐËùÊöµÄ×ÊÔ´ÏÞÖÆ²»Í¬¡£)ͼ8ª±4ÖÐÁгöÁ˸÷  
¸öwaitº¯  
ÊýËùÖ§³ÖµÄ²»Í¬µÄ²ÎÊý¡£ª¥ª¥  
P203ª¥ª¥  
ͼ8ª±4¡þÔÚ²»Í¬ÏµÍ³Éϸ÷¸öwaitº¯ÊýËùÖ§³ÖµÄ²ÎÊýª¥  
8ª±8¡þ¾¹Ì¬Ìõ¼þª¥  
´Ó±¾ÊéµÄÄ¿µÄ³ö·¢£¬µ±¶à¸ö½ø³Ì¶¼Æóͼ¶Ô¹²ÏíÊý¾Ý½øÐÐijÖÖ´¦Àí£¬¶ø×îºóµÄ½á¹ûÓÖ  
È¡¾öÓÚ½ø  
³ÌÔËÐеÄ˳Ðòʱ£¬ÔòÎÒÃÇÈÏΪÕâ·¢ÉúÁ˾¹Ì¬Ìõ¼þ¡£Èç¹ûÔÚforkÖ®ºóµÄijÖÖÂß¼­ÏÔʽ  
»òÒþʽµØ  
ÒÀÀµÓÚÔÚforkÖ®ºóÊǸ¸½ø³ÌÏÈÔËÐл¹ÊÇ×Ó½ø³ÌÏÈÔËÐУ¬ÄÇôforkº¯Êý¾Í»áÊǾ¹Ì¬Ìõ  
¼þ»îÔ¾µÄ  
æÜÉúµØ¡£Í¨³££¬ÎÒÃDz»ÄÜÓèÁÏÄÄÒ»¸ö½ø³ÌÏÈÔËÐС£¼´Ê¹ÖªµÀÄÇÒ»¸ö½ø³ÌÏÈÔËÐУ¬ÄÇ  
ôÔڸýø  
³Ì¿ªÊ¼ÔËÐкó£¬Ëù·¢ÉúµÄÊÂÇéÒ²ÒÀÀµÓÚϵͳ¸ºÔØÒÔ¼°ÏµÍ³ºËµÄµ÷¶ÈËã·¨¡£ª¥  
ÔÚ³ÌÐò8ª±5ÖУ¬µ±µÚ¶þ¸ö×Ó½ø³Ì´òÓ¡Æä¸¸½ø³ÌIDʱ£¬ÎÒÃÇ¿´µ½ÁËÒ»¸öDZÔڵľ¹Ì¬Ìõ  
¼þ¡£Èç¹û  
µÚ¶þ¸ö×Ó½ø³ÌÔÚµÚÒ»¸ö×Ó½ø³Ì֮ǰÔËÐУ¬ÔòÆä¸¸½ø³Ì½«»áÊǵÚÒ»¸ö×Ó½ø³Ì¡£µ«ÊÇ£¬  
Èç¹ûµÚÒ»  
¸ö×Ó½ø³ÌÏÈÔËÐУ¬²¢ÓÐ×ã¹»µÄʱ¼äµ½´ï²¢Ö´ÐÐexit£¬ÔòµÚ¶þ¸ö×Ó½ø³ÌµÄ¸¸½ø³Ì¾ÍÊÇ  
init¡£¼´  
ʹÔÚ³ÌÐòÖе÷ÓÃsleep£¬ÕâÒ²²»±£Ö¤Ê²Ã´¡£Èç¹ûϵͳ¸ºµ£ºÜÖØ£¬ÄÇôÔÚµÚ¶þ¸ö×Ó½ø  
³Ì´Ósleep  
·µ»ØÊ±£¬¿ÉÄܵÚÒ»¸ö×Ó½ø³Ì»¹Ã»Óеõ½»ú»áÔËÐС£ÕâÖÖÐÎʽµÄÎÊÌâºÜÄÑÅųý£¬ÒòΪ  
Ôڴ󲿷֠ 
ʱ¼ä£¬ÕâÖÖÎÊÌâ²¢²»³öÏÖ¡£ª¥  
Èç¹ûÒ»¸ö½ø³ÌÏ£ÍûµÈ´ýÒ»¸ö×Ó½ø³ÌÖÕÖ¹£¬ÔòËü±ØÐëµ÷ÓÃwaitº¯Êý¡£Èç¹ûÒ»¸ö½ø³ÌÒª  
µÈ´ýÆä¸¸  
½ø³ÌÖÕÖ¹(Èç³ÌÐò8ª±5ÖÐÒ»Ñù)£¬Ôò¿ÉʹÓÃÏÂÁÐÐÎʽµÄÑ­»·£ºª¥  
while(getppid() !=1)ª¥  
sleep(1);ª¥  
ÕâÖÖÐÎʽѭ»·(³ÆÎª¶¨ÆÚѯÎÊ)µÄÎÊÌâÊÇËüÀË·ÑÁËCPUʱ¼ä£¬ÒòΪµ÷ÓÃÕßÿ¸ô1Ãë¶¼±»  
»½ÐÑ£¬È»  
ºó½øÐÐÌõ¼þ²âÊÔ¡£ª¥  
ΪÁ˱ÜÃ⾹̬Ìõ¼þºÍ¶¨ÆÚѯÎÊ£¬ÔÚ¶à¸ö½ø³ÌÖ®¼äÐèÒªÓÐijÖÖÐÎʽµÄÐźŻúÖÆ¡£ÔÚU  
nixÖпÉÒÔ  
ʹÓÃÐźŻúÖÆ£¬ÔÚ10ª±16½Ú½«ËµÃ÷ËüµÄÒ»ÖÖÓ÷¨¡£¸÷ÖÖÐÎʽµÄ½ø³Ì¼äͨÐÅ(IPC)Ò²  
¿ÉʹÓ㬠 
ÔÚµÚÊ®ËÄ¡¢Ê®ÎåÕ½«¶Ô´Ë½øÐÐÌÖÂÛ¡£ª¥  
ÔÚ¸¸¡¢×Ó½ø³Ì¹ØÏµÖУ¬³£³£ÓÐÏÂÊö¾°¿ö¡£ÔÚforkÖ®ºó£¬¸¸¡¢×Ó½ø³Ì¶¼ÓÐһЩ×ÓÇéÒª  
×ö¡£ÀýÈç  
£¬¸¸½ø³Ì¿ÉÄÜÒÔ×Ó½ø³ÌID¸üÐÂÈÕÖ¾ÎļþÖеÄÒ»¸ö¼Ç¼£¬¶ø×Ó½ø³ÌÔò¿ÉÄÜҪΪ¸¸½ø³Ì  
´´½¨Ò»¸ö  
Îļþ¡£ÔÚÕâÒ»Àý×ÓÖУ¬ÎÒÃÇÒªÇóÿ¸ö½ø³ÌÔÚÖ´ÐÐÍêËüµÄÒ»Ì׳õʼ»¯²Ù×÷ºóҪ֪ͨ¶Ô  
·½£¬²¢ÇÒ  
ÔÚ¼ÌÐøÔËÐÐ֮ǰ£¬ÒªµÈ´ýÁíÒ»·½Íê³ÉÆä³õʼ»¯²Ù×÷¡£ÕâÖÖ¾°¿ö¿ÉÒÔÃèÊöÈçÏ£ºª¥  
#include "ourhdrª±h"ª¥  
TELL ¼£Ã£Ä££ª³£²¡½WAIT();    /* set things up for TELL ¼£Ã£Ä££ª³£²¡½xxx  
 & WAIT¡¼  
 Ã£Ä££ª³£²¡½xxx */ª¥  
if((pid=fork())<0)ª¥  
err ¼£Ã£Ä££ª³£²¡½sys("fork error");ª¥  
else if (pid==0){¡þ¡þ/* ×Ó½ø³Ìª¥  
£¯ª³ ×Ó½ø³ÌÖ´ÐÐËùÐèµÄ¸÷²Ù×÷ */ª¥  
TELL ¼£Ã£Ä££ª³£²¡½PARENT(getppid());¡þ£¯ª³ tell parent we're done */֪ͨ  
¸¸½ø³ÌÒÑ  
Ö´ÐÐÍê±Ïª¥  
WAIT ¼£Ã£Ä££ª³£²¡½PARENT();¡þ/* and wait for parent */µÈ´ý¸¸½ø³Ìª¥  
/* and the child continues on its way ¡¤¡¤¡¤ */ ¡þ×Ó½ø³Ì¼ÌÐøÔËÐЪ¥  
}ª¥  
/* ¡þ¸¸½ø³ÌÖ´ÐÐËùÐèµÄ¸÷²Ù×÷ */ª¥  
TELL ¼£Ã£Ä££ª³£²¡½CHILD(pid);¡þ/* tell child we're done */ Í¨Öª×Ó½ø³ÌÒÑ  
Ö´ÐÐÍê±Ï  
ª¥  
WAIT ¼£Ã£Ä££ª³£²¡½CHILD();¡þ/* and wait for child */ µÈ´ý×Ó½ø³Ìª¥  
/* and the parent continues on its way ¡¤¡¤¡¤ */ ¸¸½ø³Ì¼ÌÐøÔËÐЪ¥  
exit(0);ª¥  
¼Ù¶¨ÔÚÍ·Îļþourbdrª±hÖж¨ÒåÁ˸÷¸öÐèҪʹÓõıäÁ¿¡£Îå¸öÀý³ÌTELL ¼£Ã£Ä££ª³  
£²¡½WAIT  
¡¢TELL ¼£Ã£Ä££ª³£²¡½PARENT¡¢TELL ¼£Ã£Ä££ª³£²¡½CHILD¡¢WAIT ¼£Ã£Ä££ª³£²¡½  
PARENÒÔ¼°  
wAIT ¼£Ã£Ä££ª³£²¡½CHILD¿ÉÒÔÊǺ꣬Ҳ¿ÉÒÔÊǺ¯Êý¡£ª¥  
ÔÚºóÃæµÄһЩÕÂÖлá˵Ã÷ÒÔ²»Í¬µÄ·½·¨ÊµÏÖÕâЩTELLºÍWAITÀý³Ì£º10ª±16½ÚÖÐ˵Ã÷  
ÓÃÐźŵĠ 
Ò»ÖÖʵÏÖ£¬³ÌÐò14ª±3ÖÐ˵Ã÷ÓÃÁ÷¹ÜµÀµÄÒ»ÖÖʵÏÖ¡£ÏÂÃæÏÈ¿´Ò»¸öʹÓÃÕâÎå¸öÀý³Ì  
µÄʵÀý¡£  
ª¥  
ʵÀýª¥  
³ÌÐò8ª±6Êä³öÁ½¸ö×Ö·û´®£ºÒ»¸öÓÉ×Ó½ø³ÌÊä³ö£¬Ò»¸öÓɸ¸½ø³ÌÊä³ö¡£ÒòΪÊä³öÒÀÀµ  
ÓÚϵͳºË  
ʹ½ø³ÌÔËÐеÄ˳Ðò¼°Ã¿¸ö½ø³ÌÔËÐеÄʱ¼ä³¤¶È£¬ËùÒԸóÌÐò°üº¬ÁËÒ»¸ö¾¹Ì¬Ìõ¼þ¡£  
ª¥ª¥  
P205ª¥ª¥  
³ÌÐò8ª±6¡þ¾ßÓо¹Ì¬Ìõ¼þµÄ³ÌÐòª¥  
ÔÚ³ÌÐòÖн«±ê×¼Êä³öÉèÖÃΪ²»´ø»º´æµÄ£¬ÓÚÊÇÿ¸ö×Ö·ûÊä³ö¶¼Ðèµ÷ÓÃÒ»´Îwrite¡£  
±¾ÀýµÄÄ¿  
µÄÊÇʹϵͳºËÄܾ¡¿ÉÄܶà´ÎµØÔÚÁ½¸ö½ø³ÌÖ®¼ä½øÐÐÇл»£¬ÒÔÀýʾ¾¹Ì¬Ìõ¼þ¡£(Èç¹û  
²»ÕâÑù×ö  
£¬¿ÉÄÜÒ²¾Í¾ö²»»á¼ûµ½ÏÂÃæËùʾµÄÊä³ö¡£Ã»Óп´µ½¾ßÓдíÎóµÄÊä³ö²¢²»Òâζמ¹Ì¬  
Ìõ¼þ²»´æ  
ÔÚ£¬ÕâÖ»ÊÇÒâζ×ÅÔÚ´ËÌØ¶¨µÄϵͳÉÏδÄܼûµ½Ëü¡£)ÏÂÃæµÄʵ¼ÊÊä³ö˵Ã÷¸Ã³ÌÐòµÄ  
ÔËÐнá¹û  
ÊÇ»á¸Ä±äµÄ¡£ª¥  
$ aª±outª¥  
output from childª¥  
output from parentª¥  
$ aª±outª¥  
oouuttppuutt ffrroomm cphairlednª¥  
tª¥  
$ aª±outª¥  
oouuttppuutt ffrroomm pcahrielndtª¥  
$ aª±outª¥  
ooutput from parentª¥  
utput from childª¥  
Ð޸ijÌÐò8ª±6£¬Ê¹ÆäʹÓÃTELLºÍWAITº¯Êý£¬ÓÚÊÇÐγÉÁ˳ÌÐò8ª±7¡£ÔÚÐÐÊ×±êÒÔ'+ºÅ  
µÄÐÐÊÇ  
ÐÂÔö¼ÓµÄÐС£ª¥ª¥  
P206ª¥ª¥  
³ÌÐò8ª±7¡þÐ޸ijÌÐò8ª±6ÒÔ±ÜÃ⾹̬Ìõ¼þª¥  
ÔËÐд˳ÌÐòÔòÄܵõ½ËùÓèÆÚµÄÊä³ö¡¼CD2¡½Á½¸ö½ø³ÌµÄÊä³ö²»ÔÙ½»²æ»ìºÏ¡£ª¥  
³ÌÐò8ª±7ÊÇʹ¸¸½ø³ÌÏÈÔËÐС£Èç¹û½«forkÖ®ºóµÄÐиıä³É£ºª¥  
else if (pid==0) {ª¥  
charatatime("output from child£Ün");ª¥  
TELL ¼£Ã£Ä££ª³£²¡½PARENT(getppid());ª¥  
} else {ª¥  
WAIT ¼£Ã£Ä££ª³£²¡½CHILD();¡þ¡þ/* child goes first */ ×Ó½ø³ÌÏÈÔËÐЪ¥  
charatatime("output from parent£Ün");ª¥  
}ª¥  
Ôò×Ó½ø³ÌÏÈÔËÐС£Á·Ï°8ª±3¼ÌÐøÕâһʵÀý¡£ª¥  
8ª±9¡þexecº¯Êýª¥  
ÔÚ8ª±3½ÚÔøÌá¼°ÓÃforkº¯Êý´´½¨×Ó½ø³Ìºó£¬×Ó½ø³ÌÍùÍùÒªµ÷ÓÃÒ»ÖÖexecº¯ÊýÒÔÖ´ÐР 
ÁíÒ»µÀ³Ì  
Ðò¡£µ±Ò»¸ö½ø³Ìµ÷ÓÃÒ»ÖÖexecº¯Êýʱ£¬¸Ã½ø³ÌÍêÈ«ÓÉгÌÐò´ú»»£¬¶øÐ³ÌÐòÔò´ÓÆä  
mainº¯Êý  
¿ªÊ¼Ö´ÐС£ÒòΪµ÷ÓÃexec²¢²»´´½¨Ð½ø³Ì£¬ËùÒÔÔÚÆäǰºóµÄ½ø³ÌID²¢Ä©¸Ä±ä¡£exe  
cÖ»ÊÇÓÃÅÌ  
ÉÏÁíÒ»µÀгÌÐò´ú»»Á˵±Ç°½ø³ÌµÄÕýÎÄ¡¢Êý¾Ý¡¢¶ÑºÍÕ»¶Î¡£ª¥  
ÓÐÁùÖÖ²»Í¬µÄexecº¯Êý¿É¹©Ê¹Óã¬ËüÃdz£³£±»Í³³ÆÎªexecº¯Êý¡£ÕâЩexecº¯Êý¶¼ÊÇ  
Unix½ø³Ì  
¿ØÖÆÔ­Óï¡£ÓÃfork¿ÉÒÔ´´½¨Ð½ø³Ì£¬ÓÃexec¿ÉÒÔÖ´ÐÐеijÌÐò¡£exitº¯ÊýºÍÁ½¸öw  
aitº¯Êý´¦  
ÀíÖÕÖ¹ºÍµÈ´ýÖÕÖ¹¡£ÕâЩÊÇÎÒÃÇÐèÒªµÄ»ù±¾µÄ½ø³Ì¿ØÖÆÔ­Óï¡£ÔÚºóÃæ¸÷½ÚÖн«Ê¹Óà 
ÕâЩԭÓï  
¹¹ÔìÁíÍâһЩÈçpopenºÍsystemÖ®ÀàµÄº¯Êý¡£ª¥  
#include <unistdª±h>ª¥  
int execl(const char *ª«pathname,ª«const char *ª«arg0,ª«ª±ª±ª± /* (char  
 *) 0 */)  
;ª¥  
int execv(const char *ª«pathname,ª«char *const ª«argvª«£Û£Ý);ª¥  
int execle(const char *ª«pathname,ª«const char *ª«arg0,ª«ª±ª±ª±ª¥  
/* (char *)0,char *const ª«envpª«£Û£Ý */);ª¥  
int execve(const char *ª«pathname,ª«char *const ª«argvª«£Û£Ý,char *cons  
t ª«envp  
£Û£Ý);ª«ª¥  
int execlp(const char *ª«filename,ª«const char *ª«arg0,ª«ª±ª±ª± /* (cha  
r *) 0 */  
);ª¥  
int execvp(const char *ª«filename,ª«char *const ª«argv£Û£Ý);ª«ª¥  
All six return:-1 on error,no return on successª¥  
Áù¸öº¯Êý¶¼·µ»Ø£º³ö´íΪ-1£¬³É¹¦²»·µ»Øª¥  
ÕâЩº¯ÊýÖ®¼äµÄµÚÒ»¸öÇø±ðÊÇǰËĸöȡ·¾¶Ãû×÷Ϊ²ÎÊý£¬ºóÁ½¸öÔòÈ¡ÎļþÃû×÷Ϊ²Î  
Êý¡£µ±Ö¸  
¶¨ÎļþÃû×÷Ϊ²ÎÊýʱ£ºª¥  
¡¤Èç¹ûÎļþÃûÖаüº¬'/',Ôò¾Í½«ÆäÊÓΪ·¾¶Ãû¡£ª¥  
¡¤·ñÔò¾Í°´PATH»·¾³±äÁ¿£¬ÔÚÓйØÄ¿Â¼ÖÐËÑѰ¿ÉÖ´ÐÐÎļþ¡£ª¥  
PATH±äÁ¿°üº¬ÁËÒ»ÕÅĿ¼±í(³ÆÎªÂ·¾¶Ç°×º)£¬Ä¿Â¼Ö®¼äÓÃðºÅ('£º')·Ö¸ô¡£ÀýÈçÏ  
ÁÐname  
=value»·¾³×Ö·û´®£ºª¥  
PATH=/bin:/usr/bin:/usr/local/bin:¡£ª¥  
Ö¸¶¨ÔÚËĸöĿ¼ÖнøÐÐËÑË÷¡£(Ò»¸öÁ㳤ǰ׺µØ±íʾµ±Ç°Ä¿Â¼¡£ÔÚvalueµÄ¿ªÊ¼´¦¿É  
Ó㺱íʾ  
Ëü£¬ÔÚÐÐÖмäÔòÒªÓ㺣º±íʾ£¬ÔÚÐÐβÒÔ£º±íʾËü¡£)ª¥  
Óкܶà³öÓÚ°²È«ÐÔ·½ÃæµÄ¿¼ÂÇ£¬ÒªÇóÔÚËÑË÷·¾¶Öоö²»Òª°üÀ¨µ±Ç°Ä¿Â¼¡£Çë²Î¼ûG  
arfinkel  
and Spafford£Û1991£Ý¡£ª¥  
Èç¹ûexeclpºÍexecupÕâÁ½¸öº¯ÊýÖеÄÈÎÒ»¸öʹÓ÷¾¶Ç°×ºÖеÄÒ»¸öÕÒµ½ÁËÒ»¸ö¿ÉÖ´  
ÐÐÎļþ£¬  
µ«ÊǸÃÎļþ²»ÊÇÓÉÁ¬½Ó±à¼­³ÌÐò²úÉúµÄ»úÆ÷¿ÉÖ´ÐеĴúÂëÎļþ£¬Ôò¾ÍÈÏΪ¸ÃÎļþÊÇ  
Ò»¸öshel  
l½Å±¾£¬ÓÚÊÇÊÔ×ŵ÷ÓÃ/bin/sh£¬²¢ÒÔ¸ÃÎļþÃû×÷ΪshellµÄÊäÈë¡£ª¥  
µÚ¶þ¸öÇø±ðÓë²ÎÊý±íµÄ´«µÝÓйØ(l±íʾ±í(list)£¬v±íʾʸÁ¿(vector))¡£º¯Êýexe  
cl¡¢execl  
pºÍexecleÒªÇó½«Ð³ÌÐòµÄÿ¸öÃüÁîÐвÎÊý¶¼ËµÃ÷Ϊһ¸öµ¥¶ÀµÄ²ÎÊý¡£ÕâÖÖ²ÎÊý±í  
ÒÔ¿ÕÖ¸Õë  
½áβ¡£¶ÔÓÚÁíÍâÈý¸öº¯Êý(execv,execvpºÍexecve)£¬ÔòÓ¦Ïȹ¹ÔìÒ»¸öÖ¸Ïò¸÷²ÎÊýµÄ  
Ö¸ÕëÊý×é  
£¬È»ºó½«¸ÃÊý×鵨ַ×÷ΪÕâÈý¸öº¯ÊýµÄ²ÎÊý¡£ª¥  
ÔÚʹÓÃANSICÔ­ÐÍ֮ǰ£¬¶Ôexecl,execleºÍexeclpÈý¸öº¯Êý±íʾÃüÁîÐвÎÊýµÄÒ»°ã  
·½·¨ÊÇ£º  
char *arg0,char *arg1,ª±ª±ª±,char *argn,(char *) 0ª¥  
Ó¦µ±ÌرðÖ¸³öµÄÊÇ£ºÔÚ×îºóÒ»¸öÃüÁîÐвÎÊýÖ®ºó¸úÁËÒ»¸ö¿ÕÖ¸Õë¡£Èç¹ûÓó£Êý0À´  
±íʾһ¸ö  
¿ÕÖ¸Õ룬Ôò±ØÐ뽫ËüÇ¿ÖÆ×ª»»ÎªÒ»¸ö×Ö·ûÖ¸Õ룬·ñÔòËü½«±»½âÊÍΪÕûÐͲÎÊý¡£Èç¹û  
Ò»¸öÕûÐÍ  
ÊýµÄ³¤¶ÈÓëchar*µÄ³¤¶È²»Í¬£¬execº¯Êýʵ¼Ê²ÎÊý¾Í½«³ö´í¡£ª¥  
×îºóÒ»¸öÇø±ðÓëÏòгÌÐò´«µÝ»·¾³±íÏà¹Ø¡£Ãû×ÖÒÔe½áβµÄÁ½¸öº¯Êý(execleºÍexe  
cve)ʹÎÒ  
ÃÇ¿ÉÒÔÏòÆä´«µÝÒ»¸öÖ¸Ïò»·¾³×Ö·û´®µÄÖ¸ÕëÊý×éµÄÖ¸Õë¡£ÆäËüËĸöº¯ÊýÔòʹÓõ÷Óà 
½ø³ÌÖеĠ 
environ±äÁ¿ÎªÐ³ÌÐò¸´ÖÆÏÖ´æµÄ»·¾³¡£(Çë»ØÒä7ª±9½Ú¼°Í¼7ª±5ÖжԻ·¾³×Ö·û´®µÄ  
ÌÖÂÛ¡£Æä  
ÖÐÔøÌá¼°Èç¹ûϵͳ֧³ÖsetenvºÍputenvÕâÑùµÄº¯Êý£¬Ôò¿É¸ü¸Äµ±Ç°»·¾³ºÍºóÃæÉú³É  
µÄ×Ó½ø³Ì  
µÄ»·¾³£¬µ«²»ÄÜÓ°Ï츸½ø³ÌµÄ»·¾³¡£)ͨ³££¬Ò»¸ö½ø³ÌÔÊÐí½«Æä»·¾³´«²¥¸øÆä×Ó½ø  
³Ì£¬µ«ÓР 
ʱҲÓÐÕâÖÖÇé¿ö£¬Ò»¸ö½ø³ÌÏëҪΪһ¸ö×Ó½ø³ÌÖ¸¶¨Ò»¸öÈ·¶¨µÄ»·¾³¡£ÀýÈ磬ÔÚ³õʼ  
»¯Ò»¸öР 
µÇ¼µÄshellʱ£¬login³ÌÐò´´½¨Ò»¸öÖ»¶¨ÒåÉÙÊý¼¸¸ö±äÁ¿µÄÌØÊâ»·¾³£¬¶øÔÚÎÒÃǵǠ 
¼ʱ£¬¿É  
ÒÔͨ¹ýshellÆð¶¯Îļþ£¬½«ÆäËü±äÁ¿¼Óµ½»·¾³ÖС£ÔÚʹÓÃANSICÔ­ÐÍ֮ǰ£¬execleµÄ  
²ÎÊýÊÇ£º  
ª¥  
char *pathname,char *arg0,¡­£¬char *argn,(char *)0,char * envpl)ª¥  
´ÓÖпɼû£¬×îºóÒ»¸ö²ÎÊýÊÇÖ¸Ïò»·¾³×Ö·û´®µÄ¸÷×Ö·ûÖ¸Õë¹¹³ÉµÄÊý×éµÄÖ¸Õë¡£¶øÔÚ  
ANSICÔ­  
ÐÍÖУ¬ËùÓÐÃüÁîÐвÎÊý£¬°üÀ¨¿ÕÖ¸Õ룬envpÖ¸Õë¶¼ÓÃÊ¡ÂÔºÅ(¡­)±íʾ¡£ª¥  
ÕâÁù¸öexecº¯ÊýµÄ²ÎÊýºÜÄѼÇÒä¡£º¯ÊýÃûÖеÄ×Ö·û»á¸øÎÒÃÇһЩ°ïÖú¡£×Öĸp±íʾ  
¸Ãº¯ÊýÈ¡  
ÎļþÃû×÷Ϊ²ÎÊý£¬²¢ÇÒÓÃPATH»·¾³±äÁ¿Ñ°ÕÒ¿ÉÖ´ÐÐÎļþ¡£×Öĸl±íʾ¸Ãº¯Êýȡһ¸ö  
²ÎÊý±í£¬  
ËüÓë×Öĸv»¥³â¡£v±íʾ¸Ãº¯Êýȡһ¸öargv£Û£Ý¡£×îºó£¬×Öĸe±íʾ¸Ãº¯ÊýÈ¡envp£Û  
£ÝÊý×飬  
¶ø²»Ê¹Óõ±Ç°»·¾³¡£Í¼8ª±5ÏÔʾÁËÕâÁù¸öº¯ÊýÖ®¼äµÄÇø±ð¡£ª¥ª¥  
P209ª¥ª¥  
ͼ8ª±5¡þÁù¸öexecº¯ÊýÖ®¼äµÄÇø±ðª¥  
ÿ¸öϵͳ¶Ô²ÎÊý±íºÍ»·¾³±íµÄ×ܳ¤¶È¶¼ÓÐÒ»¸öÏÞÖÆ¡£ÔÚͼ2ª±7ÖУ¬ÕâÖÖÏÞÖÆÊÇARG  
-MAX¡£ÔÚP  
OSIXª±1ϵͳÖУ¬´ËÖµÖÁÉÙÊÇ4096×Ö½Ú¡£µ±Ê¹ÓÃshellµÄÎļþÃûÀ©³ä¹¦ÄܲúÉúÒ»¸öÎÄ  
¼þÃû±íʱ  
£¬¿ÉÄÜ»áÊܵ½´ËÖµµÄÏÞÖÆ¡£ÀýÈ磬´ËÃüÁ  
grep -POSIX ¼£Ã£Ä££ª³£²¡½SOURCE¡þ/usr/include/*/*ª±hª¥  
ÔÚijЩϵͳÉÏ¿ÉÄܲúÉúÏÂÁÐÐÎʽµÄshell´í£ºª¥  
arg¡þ¡þlist¡þ¡þtoo¡þ¡þlongª¥  
ÓÉÓÚÀúÊ·Ô­Òò£¬ÏµÍ³VÖдËÏÞÖÆÊÇ5120×Ö½Ú¡£4ª±3BSDºÍ4ª±3+BSDÔÚ·Ö·¢Ê±´ËÏÞÖÆÊÇ  
20£¬480  
×Ö½Ú¡£×÷ÕßËùÓõÄϵͳÔòÔÊÐí¶àÖÁÒ»Õ××Ö½Ú!(¼û³ÌÐò2ª±1µÄÊä³ö)ª¥  
Ç°ÃæÔøÌá¼°ÔÚÖ´ÐÐexecºó£¬½ø³ÌIDûÓиı䡣³ý´ËÖ®Í⣬ִÐÐгÌÐòµÄ½ø³Ì»¹±£³Ö  
ÁËÔ­½ø³Ì  
µÄÏÂÁÐÌØÕ÷£ºª¥  
¡¤½ø³ÌIDºÍ¸¸½ø³ÌIDª¥  
¡¤Êµ¼ÊÓû§IDºÍʵ¼Ê×éIDª¥  
¡¤Ìí¼Ó×éIDª¥  
¡¤½ø³Ì×éIDª¥  
¡¤¶Ô»°ÆÚIDª¥  
¡¤¿ØÖÆÖն˪¥  
¡¤ÄÖÖÓÉÐÓàÁôµÄʱ¼äª¥  
¡¤µ±Ç°¹¤×÷Ŀ¼ª¥  
¡¤¸ùĿ¼ª¥  
¡¤Îļþ·½Ê½´´½¨ÆÁ±Î×Öª¥  
¡¤ÎļþËøª¥  
¡¤½ø³ÌÐźŠÁ±Îª¥  
¡¤Ä©¾öÐźŪ¥  
¡¤×ÊÔ´ÏÞÖÆª¥  
¡¤tms-utime,tms-stime,tms-cutimeÒÔ¼°tms-ustimeÖµª¥  
¶Ô´ò¿ªÎļþµÄ´¦ÀíÓëÿ¸öÃèÊö·ûµÄ½ø³ÌÖÐÿ¸öÔÚexecʱ¹Ø±Õ±êÖ¾ÖµÓйء£»ØÒäͼ3  
ª±2ÒÔ¼°3  
ª±13½ÚÖжÔPD-CLOEXECµÄ˵Ã÷£¬´ò¿ªÃèÊö·û¶¼ÓÐÒ»¸öÔÚexecʱ¹Ø±Õ±êÖ¾¡£Èô´Ë±êÖ¾  
ÉèÖã¬Ôò  
ÔÚÖ´ÐÐexecʱ¹Ø±Õ¸ÃÃèÊö·û£¬·ñÔò¸ÃÃèÊö·ûµÄ´ò¿ª³ý·ÇÌØµØÓÃfcntlÉèÖÃÁ˸ñêÖ¾  
£¬·ñÔòϵ  
ͳµÄĬÈϲÙ×÷ÊÇÔÚexecºóÈÔ±£³ÖÕâÖÖÃèÊö·û´ò¿ª¡£ª¥  
POSIXª±1Ã÷È·ÒªÇóÔÚexecʱ¹Ø±Õ´ò¿ªÄ¿Â¼Á÷¡£(»ØÒä4ª±2)½ÚÖÐËùÊöµÄopendirº¯Êý  
¡£)Õâͨ³£  
ÊÇÓÉopendirº¯ÊýʵÏֵģ¬Ëüµ÷ÓÃfcntlº¯ÊýΪ¶ÔÓ¦ÓÚ´ò¿ªÄ¿Â¼Á÷µÄÃèÊö·ûÉèÖÃÔÚe  
xecʱ¹Ø±Õ  
±êÖ¾¡£ª¥  
×¢Ò⣬ÔÚexecǰºóʵ¼ÊÓû§IDºÍʵ¼Ê×éID±£³Ö²»±ä£¬¶øÓÐЧIDÊÇ·ñ¸Ä±äÔòÈ¡¾öÓÚËù  
Ö´ÐгÌÐò  
µÄÎļþµÄÉèÖÃÓû§IDλºÍÉèÖÃ×éIDλÊÇ·ñÉèÖá£Èç¹ûгÌÐòµÄÉèÖÃÓû§IDλÒÑÉèÖà 
£¬ÔòÓÐЧ  
Óû§ID±ä³É³ÌÐòÎļþÊôÖ÷µÄID£¬·ñÔòÓÐЧÓû§ID²»±ä¡£¶Ô×éIDµÄ´¦Àí·½Ê½Óë´ËÏàͬ  
¡£ª¥  
ÔںܶàUnixʵÏÖÖУ¬ÕâÁù¸öº¯ÊýÖÐÖ»ÓÐÒ»¸öexecveÊÇϵͳºËµÄϵͳµ÷Óá£ÁíÍâÎå¸ö  
Ö»Êǿ⺯  
Êý£¬ËüÃÇ×îÖÕ¶¼Òªµ÷ÓÃϵͳµ÷Óá£ÕâÁù¸öº¯ÊýÖ®¼äµÄ¹ØÏµÊ¾ÓÚͼ8ª±6ÖС£ÔÚÕâÖÖ°²  
ÅÅÖУ¬¿â  
º¯ÊýexeclpºÍexecvpʹÓÃPATH»·¾³±äÁ¿²éÕÒµÚÒ»¸ö°üº¬ÃûΪfilenameµÄ¿ÉÖ´ÐÐÎļþ  
µÄ·¾¶Ãû  
ǰ׺¡£ª¥ª¥  
P211ª¥  
ͼ8ª±6¡þÁù¸öexecº¯ÊýÖ®¼äµÄ¹ØÏµª¥  
ʵ¼Êª¥  
³ÌÐò8ª±8ÀýʾÁËexecº¯Êý¡£ª¥ª¥  
P211ª¥  
³ÌÐò8ª±8¡þexecº¯ÊýµÄʵÀýª¥  
ÔڸóÌÐòÖÐÏȵ÷ÓÃexecle£¬ËüÒªÇóÒ»¸ö·¾¶ÃûºÍÒ»¸öÌØ¶¨µÄ»·¾³¡£ÏÂÒ»¸öµ÷ÓõÄÊÇ  
execlp£¬  
ËüÓÃÒ»¸öÎļþÃû£¬²¢½«µ÷ÓÃÕߵĻ·¾³´«Ë͸øÐ³ÌÐò¡£execlpÔÚÕâÀïÄܹ»¹¤×÷µÄÔ­Òò  
ÊÇÒòΪĿ  
¼/home/stevens/binÊǵ±Ç°Â·¾¶Ç°×ºÖ®Ò»¡£×¢Ò⣬ÎÒÃǽ«µÚÒ»¸ö²ÎÊý(ÔÚгÌÐòÖР 
µÄargv£Û  
0£Ý)ÉèÖÃΪ·¾¶ÃûµÄÎļþÃû·ÖÁ¿¡£Ä³Ð©shell½«´Ë²ÎÊýÉèÖÃΪÍêÈ«µÄ·¾¶Ãû¡£ª¥  
ÔÚ³ÌÐò8ª±8ÖÐÒªÖ´ÐÐÁ½´ÎµÄ³ÌÐòechoallʾÓÚ³ÌÐò8ª±9ÖС£ÕâÊÇÒ»¸öÆÕͨ³ÌÐò£¬Ëü  
»ØËÍÆäËù  
ÓÐÃüÁîÐвÎÊý¼°ÆäÈ«²¿»·¾³±í¡£ª¥  
ª¥  
P212ª¥  
³ÌÐò8ª±9¡þ»ØËÍËùÓÐÃüÁîÐвÎÊýºÍËùÓл·¾³×Ö·û´®ª¥  
Ö´ÐгÌÐò8ª±8ʱµÃµ½£ºª¥  
$ aª±outª¥  
argv£Û0£Ý:echoallª¥  
argv£Û1£Ý:myarg1ª¥  
argv£Û2£Ý:MY ARG2ª¥  
USER=unknownª¥  
PATH=/tmpª¥  
argv£Û0£Ý:echoallª¥  
$ argv£Û1£Ý:only 1 argª¥  
USer=stevensª¥  
HOME=/home/stevensª¥  
LOGNAME=stevensª¥  
31 ª«more lines that aren't shownª«ÆäÖÐ31ÐÐûÓÐÏÔʾª¥  
EDITOR=/usr/ucb/viª¥  
×¢Ò⣬shellÌáʾ³öÏÖÔÚµÚ¶þ¸öexec´òÓ¡argv£Û0£ÝºÍargv£Û1£ÝÖ®¼ä¡£ÕâÊÇÒòΪ¸¸  
½ø³Ì²¢²»  
µÈ´ý¸Ã×Ó½ø³Ì½áÊø¡£ª¥  
8ª±10¡þ¸ü¸ÄÓû§IDºÍ×éIDª¥  
¿ÉÒÔÓÃsetuidº¯ÊýÉèÖÃʵ¼ÊÓû§IDºÍÓÐЧÓû§ID¡£Óë´ËÀàËÆ£¬¿ÉÒÔÓÃsetgidº¯ÊýÉè  
ÖÃʵ¼Ê×é  
IDºÍÓÐЧ×éID¡£ª¥  
#include <sys/typesª±h>ª¥  
#include <unistdª±h>ª¥  
int setuid(uid ¼£Ã£Ä££ª³£²¡½t ª«uid);ª«ª¥  
int setgid(gid ¼£Ã£Ä££ª³£²¡½t ª«gid);ª«ª¥  
Both return:0 if OK,-1 on errorÁ½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1ª¥  
¹ØÓÚË­Äܸü¸ÄIDÓÐÈô¸É¹æÔò¡£ÏÖÔÚÏÈ¿¼ÂÇÓйظıäÓû§IDµÄ¹æÔò(ÔÚÕâÀï¹ØÓÚÓû§  
IDËù˵Ã÷  
µÄÒ»Çж¼ÊÊÓÃÓÚ×éID)¡£ª¥  
1ª±Èô½ø³Ì¾ßÓг¬¼¶Óû§ÌØÈ¨£¬Ôòsetuidº¯Êý½«Êµ¼ÊÓû§ID£¬ÓÐЧÓû§ID£¬ÒÔǰ±£  
´æµÄÉèÖà 
Óû§IDÉèÖÃΪuid¡£ª¥  
2ª±Èô½ø³ÌûÓг¬¼¶Óû§ÌØÈ¨£¬µ«ÊÇuidµÈÓÚʵ¼ÊÓû§ID»ò±£´æµÄÉèÖÃÓû§ID£¬Ôòs  
etuidÖ»½«  
ÓÐЧÓû§IDÉèÖÃΪuid¡£²»¸Ä±äʵ¼ÊÓû§IDºÍ±£´æµÄÉèÖÃÓû§ID¡£ª¥  
3ª±Èç¹ûÉÏÃæÁ½¸öÌõ¼þ¶¼²»Âú×㣬ÔòerrnoÉèÖÃΪEPERM£¬²¢³ö´í·µ»Ø¡£ª¥  
ÔÚÕâÀï¼Ù Ò¡¼£Ã£Ä££ª³£²¡½POSIX ¼£Ã£Ä££ª³£²¡½SAVED ¼£Ã£Ä££ª³£²¡½IDSÎªÕæ¡£  
Èç¹ûûÓР 
ÌṩÕâÖÖ¹¦ÄÜ£¬ÔòÉÏÃæËù˵µÄ¹ØÓÚ±£´æµÄÉèÖÃÓû§IDµÄ²¿·Ö¶¼ÎÞЧ¡£ª¥  
FIPS 151-1ÒªÇó´Ë¹¦ÄÜ¡£ª¥  
SVR4Ö§³Ö ¼£Ã£Ä££ª³£²¡½POSIX ¼£Ã£Ä££ª³£²¡½SAVED ¼£Ã£Ä££ª³£²¡½IDS¹¦ÄÜ¡£ª¥  
   
¹ØÓÚϵͳºËËùά»¤µÄÈý¸öÓû§ID£¬»¹Òª×¢ÒâÏÂÁм¸µã£ºª¥  
1ª±Ö»Óг¬¼¶Óû§½ø³Ì¿ÉÒÔ¸ü¸Äʵ¼ÊÓû§ID¡£Í¨³££¬Êµ¼ÊÓû§IDÊÇÔÚÓû§µÇ¼ʱ£¬  
ÓÉlogin(1  
)³ÌÐòÉèÖõ쬶øÇÒ¾ö²»»á¸Ä±äËü¡£ÒòΪloginÊÇÒ»¸ö³¬¼¶Óû§½ø³Ì£¬µ±Ëüµ÷ÓÃset  
uidʱ£¬Éè  
ÖÃËùÓÐÈý¸öÓû§ID¡£ª¥  
2ª±½öµ±¶Ô³ÌÐòÎļþÉèÖÃÁËÉèÖÃ-Óû§-IDλʱ£¬execº¯ÊýÔÙÉèÖÃÓÐЧÓû§ID¡£Èç¹û  
ÉèÖÃ-Óû§  
-IDλûÓÐÉèÖã¬Ôòexecº¯Êý²»»á¸Ä±äÓÐЧÓû§ID£¬¶ø½«Æäά³ÖΪԭÏÈÖµ¡£ÈκÎʱ  
ºò¶¼¿ÉÒÔ  
µ÷ÓÃsetuid£¬½«ÓÐЧÓû§IDÉèÖÃΪ»òÕßʵ¼ÊÓû§ID£¬»òÕß±£´æµÄÉèÖÃ-Óû§-ID¡£×Ô  
È»£¬²»ÄÜ  
½«ÓÐЧÓû§IDÉèÖÃΪÈÎÒ»Ëæ»úÖµ¡£ª¥  
3ª±±£´æµÄÉèÖÃ-Óû§-IDÊÇÓÉexec´ÓÓÐЧÓû§ID¸´ÖƵġ£ÔÚexec°´ÎļþÓû§IDÉèÖà 
ÁËÓÐЧÓà 
»§IDºó£¬¼´½øÐÐÕâÖÖ¸´ÖÆ£¬²¢½«´Ë¸±±¾±£´æÆðÀ´¡£ª¥  
ͼ8ª±7ÕªÒªÁгöÁ˸ıäÕâÈý¸öÓû§IDµÄ²»Í¬·½·¨¡£ª¥ª¥  
P214ª¥ª¥  
ͼ8ª±7¡þ¸Ä±äÈý¸öÓû§IDµÄ²»Í¬·½·¨ª¥  
×¢Ò⣬ÓÃ8ª±2½ÚÖÐËùÊöµÄgetuidºÍgeteuidº¯ÊýÖ»ÄÜ»ñµÃʵ¼ÊÓû§IDºÍÓÐЧÓû§ID  
µÄµ±Ç°Öµ  
¡£ÎÒÃDz»ÄÜ»ñµÃËù±£´æµÄÉèÖÃ-Óû§-IDµÄµ±Ç°Öµ¡£ª¥  
ʵÀýª¥  
ΪÁË˵Ã÷±£´æµÄÉèÖÃ-Óû§-IDÌØÕ÷µÄÓ÷¨£¬ÈÃÎÒÃÇÏȹ۲ìÒ»¸öʹÓøÃÌØÕ÷µÄ³ÌÐò¡£  
ÎÒÃÇËù¹Û  
²ìµÄÊDZ´¿ËÀ³tip(1)³ÌÐò(ϵͳVµÄcu(1)³ÌÐòÓë´ËÀàËÆ¡£)ÕâÁ½¸ö³ÌÐò¶¼Á¬½Óµ½Ò»¸ö  
Ô¶³Ìϵͳ  
£¬»òÕßÊÇÖ±½ÓÁ¬½Ó£¬»òÕßÊDz¦ºÅÒ»¸öµ÷ÖÆ½âµ÷Æ÷¡£µ±tipʹÓÃÒ»¸öµ÷ÖÆ½âµ÷Æ÷ʱ£¬  
Ëü±ØÐëͨ  
¹ýʹÓÃËøÎļþÀ´¶ÀռʹÓÃËü¡£´ËËøÎļþÊÇÓëUUCP¹²ÏíµÄ£¬ÒòΪÕâÁ½¸ö³ÌÐò¿ÉÄÜÔÚͬ  
ʱҪʹÓà 
ͬһµ÷ÖÆ½âµ÷Æ÷¡£½«·¢ÉúÏÂÁв½Ö裺ª¥  
1ª±tip³ÌÐòÎļþÊÇÓÉÓû§uucpÓµÓе쬲¢ÇÒÆäÉèÖÃ-Óû§-IDλÒÑÉèÖᣵ±exec´Ë³Ì  
Ðòʱ£¬Ôò  
¹ØÓÚÓû§IDµÃµ½ÏÂÁнá¹û£ºª¥  
ʵ¼ÊÓû§ID£½ÎÒÃǵÄÓû§IDª¥  
ÓÐЧÓû§ID£½UUCPª¥  
±£´æÉèÖÃÓû§ID£½UUCPª¥  
2ª±tip´æÈ¡ËùÒªÇóµÄËøÎļþ¡£ÕâÐ©ËøÎļþÊÇÓÉÃûΪUUCPµÄÓû§ËùÓµÓеģ¬ÒòΪÓÐЧ  
Óû§IDÊÇ  
UUCP£¬ËùÒÔtip¿ÉÒÔ´æÈ¡ÕâÐ©ËøÎļþ¡£ª¥  
3ª±tipÖ´ÐÐsetuid(getuid())¡£ÒòΪtip²»Êdz¬¼¶Óû§½ø³Ì£¬ËùÒÔÕâ½ö½ö¸Ä±äÓÐЧ  
Óû§ID¡£  
´ËʱµÃµ½£ºª¥  
ʵ¼ÊÓû§ID£½ÎÒÃǵÄÓû§ID(δ¸Ä±ä)ª¥  
ÓÐЧÓû§ID£½ÎÒÃǵÄÓû§ID(δ¸Ä±ä)ª¥  
±£´æÉèÖÃÓû§ID£½UUCP(δ¸Ä±ä)ª¥  
ÏÖÔÚ£¬tip½ø³ÌÊÇÒÔÎÒÃǵÄÓû§ID×÷ΪÆäÓÐЧÓû§ID¶øÔËÐеġ£Õâ¾ÍÒâζ×ÅÄÜ´æÈ¡  
µÄÖ»ÊÇÎÒ  
ÃÇͨ³£¿ÉÒÔ´æÈ¡µÄ£¬Ã»Óи½¼ÓµÄ´æÈ¡È¨¡£ª¥  
4ª±µ±Ö´ÐÐÍêÎÒÃÇËùÐèµÄ²Ù×÷ºó£¬tipÖ´ÐÐsetuid(uucpuid)£¬ÆäÖÐuucpuidÊÇÓû§u  
ucpµÄÊýÖµ  
Óû§ID(tipºÜ¿ÉÄÜÔÚÆð¶¯Ê±µ÷ÓÃgeteuid£¬µÃµ½uucpµÄÓû§ID£¬È»ºó½«Æä±£´æÆðÀ´  
£¬ÎÒÃDz¢  
²»ÈÏΪtip»áËÑË÷¿ÚÁî×ÖÎļþÒԵõ½ÕâÒ»ÊýÖµÓû§ID¡£)ÒòΪsetuidµÄ²ÎÊýµÈÓÚ±£´æ  
µÄÉèÖÃ-  
Óû§-ID£¬ËùÒÔÕâÖÖµ÷ÓÃÊÇÐí¿ÉµÄ(Õâ¾ÍÊÇΪʲôÐèÒª±£´æµÄÉèÖÃ-Óû§-IDµÄÔ­Òò¡£  
)ÏÖÔڵà 
µ½£ºª¥  
ʵ¼ÊÓû§ID=ÎÒÃǵÄÓû§ID(Ä©¸Ä±ä)ª¥  
ÓÐЧÓû§ID=uucpª¥  
±£´æÉèÖÃÓû§ID=uucp(Ä©¸Ä±ä)ª¥  
5ª±tipÏÖÔÚ¿É¶ÔÆäËøÎļþ½øÐвÙ×÷ÒÔÊÍ·ÅËüÃÇ£¬ÒòΪtipµÄÓÐЧÓû§IDÊÇ¡£ª¥  
ÒÔÕâÖÖ·½·¨Ê¹Óñ£´æµÄÉèÖÃ-Óû§-ID£¬ÔÚ½ø³ÌµÄ¿ªÊ¼ºÍ½áÊø²¿·Ö¾Í¿ÉÒÔʹÓÃÓÉÓڳ̠ 
ÐòÎļþµÄ  
ÉèÖÃÓû§ID¶øµÃµ½µÄ¶îÍâµÄÓÅÏÈȨ¡£µ«ÊÇ£¬½ø³ÌÔÚÆäÔËÐеĴ󲿷Öʱ¼äÖ»¾ßÓÐÆÕͨ  
µÄÐí¿ÉȨ  
¡£Èç¹û½ø³Ì²»ÄÜÔÚÆä½áÊø²¿·ÖÇл»»Ø±£´æµÄÉèÖÃ-Óû§-ID£¬ÄÇô¾Í²»µÃ²»ÔÚÈ«²¿ÔË  
ÐÐʱ¼ä¶¼  
±£³Ö¶îÍâµÄÐí¿ÉȨ(Õâ¿ÉÄÜ»áÔì³ÉÂé·³)¡£ª¥  
ÈÃÎÒÃÇÀ´¿´Ò»¿´Èç¹ûÔÚtipÔËÐÐʱΪÎÒÃÇÉú³ÉÒ»¸öshell½ø³Ì(ÏÈfork£¬È»ºóexec)½«  
·¢Éúʲô  
¡£ÒòΪʵ¼ÊÓû§IDºÍÓÐЧÓû§ID¶¼ÊÇÎÒÃÇµÄÆÕͨÓû§ID(ÉÏÃæµÄµÚÈý²½)£¬ËùÒÔ¸Ãs  
hellûÓР 
¶îÍâµÄÐí¿ÉȨ¡£Ëü²»ÄÜ´æÈ¡tipÔËÐÐʱÉèÖóÉuucpµÄ±£´æµÄÉèÖÃ-Óû§-ID£¬ÒòΪ¸Ã  
shellµÄ±£  
´æµÄÉèÖÃ-Óû§-IDÊÇÓÉexec¸´ÖÆÓÐЧÓû§ID¶øµÃµ½µÄ¡£ËùÒÔÔÚÖ´ÐÐexecµÄ×Ó½ø³ÌÖР 
£¬ËùÓÐÈý  
¸öÓû§ID¶¼ÊÇÎÒÃÇµÄÆÕͨÓû§ID¡£ÈçÈô³ÌÐòÊÇÉèÖÃ-Óû§-IDΪroot,ÄÇôÎÒÃǹØÓÚ  
tipÈçºÎʹ  
ÓÃsetuidËù×÷µÄ˵Ã÷ÊDz»ÕýÈ·µÄ¡£ÒòΪÒÔ³¬¼¶Óû§ÌØÈ¨µ÷ÓÃsetuid¾Í»áÉèÖÃËùÓÐÈý  
¸öÓû§ID  
¡£Ê¹ÉÏÊöʵÀý°´ÎÒÃÇËù˵Ã÷µÄ½øÐй¤×÷£¬Ö»ÐèsetuidÉèÖÃÓÐЧÓû§ID¡£ª¥  
setreuidºÍsetregidº¯Êýª¥  
4ª±3+BSDÖ§³Öº¯Êý£¬Æä¹¦ÄÜÊǽ»»»Êµ¼ÊÓû§IDºÍÓÐЧÓû§IDµÄÖµ¡£ª¥  
#include <sys/sypesª±h>ª¥  
#include <unistdª±h>ª¥  
int setreuid(uid ¼£Ã£Ä££ª³£²¡½t ª«ruid,ª«uid ¼£Ã£Ä££ª³£²¡½t ª«euid);ª«ª¥  
   
int setregid(gid ¼£Ã£Ä££ª³£²¡½t ª«rgid,ª«gid ¼£Ã£Ä££ª³£²¡½t ª«egid);ª«ª¥  
   
Both return:0 if OK,-1 on error¡þÁ½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1ª¥  
Æä×÷Óúܼòµ¥£ºÒ»¸ö·ÇÌØÈ¨Óû§×ÜÄܽ»»»Êµ¼ÊÓû§IDºÍÓÐЧÓû§ID¡£Õâ¾ÍÔÊÐíÒ»¸ö  
ÉèÖÃ-Óà 
»§-ID³ÌÐòת»»³ÉÖ»¾ßÓÐÓû§µÄÆÕͨÐí¿ÉȨ£¬ÒÔºóÓÖ¿ÉÔÙ´Îת»»»ØÉèÖÃ-Óû§-IDËù  
µÃµ½µÄ¶î  
ÍâÐí¿ÉȨ¡£POSIXª±1Òý½øÁ˱£´æµÄÉèÖÃ-Óû§-IDÌØÖ¤ºó£¬Æä×÷ÓÃÒ²ÏàÓ¦¼ÓÇ¿£¬ËüÒ²  
ÔÊÐíÒ»¸ö  
·ÇÌØÈ¨Óû§½«ÆäÓÐЧÓû§IDÉèÖÃΪ±£´æµÄÉèÖÃ-Óû§-ID¡£ª¥  
SVR4ÔÚÆäBSD¼æÈÝ¿âÖÐÒ²ÌṩÕâÁ½¸öº¯Êý¡£ª¥  
4ª±3BSD²¢Ã»ÓÐÉÏÃæËù˵µÄ±£´æµÄÉèÖÃ-Óû§-ID¹¦ÄÜ¡£ËüÓÃsetreuidºÍsetregidÀ´  
´úÌæ¡£Õâ  
¾ÍÔÊÐíÒ»¸ö·ÇÌØÈ¨Óû§Ç°¡¢ºó½»»»Õâ¶þ¸öÓû§IDµÄÖµ£¬¶ø4ª±3BSDÖеÄtip³ÌÐò¾ÍÊÇ  
ÓÃÕâÖÖ¹¦  
ÄܱàдµÄ¡£µ«ÊÇÒªÖªµÀ£¬µ±´Ë°æ±¾Éú³Éshell½ø³Ìʱ£¬Ëü±ØÐëÔÚexec֮ǰ£¬ÏȽ«Êµ  
¼ÊÓû§ID  
ÉèÖÃΪÆÕͨÓû§ID¡£Èç¹û²»ÕâÑù×öµÄ»°£¬ÄÇôʵ¼ÊÓû§ID¾Í¿ÉÄÜÊÇuucp(ÓÉsetreu  
idµÄ½»»»  
²Ù×÷Ôì³É¡£)È»ºóshell½ø³Ì¿ÉÄÜ»áµ÷ÓÃsetreuid½»»»Á½¸öÓû§IDÖµ²¢È¡µÃuucpÐí¿É  
Ȩ¡£×÷Ϊ  
Ò»¸ö±£»¤ÐԵijÌÐòÉè¼Æ´ëÊ©£¬tip½«×Ó½ø³ÌµÄʵ¼ÊÓû§IDºÍÓÐЧÓû§ID¶¼ÉèÖÃ³ÉÆÕ  
ͨÓû§ID  
¡£ª¥  
seteuidºÍsetegidº¯Êýª¥  
ÔÚ¶ÔPOIXª±1µÄ½¨Òé¸ü¸ÄÖаüº¬ÁËÁ½¸öº¯ÊýseteuidºÍsetegid¡£ËüÃÇÖ»¸ü¸ÄÓÐЧÓà 
»§IDºÍÓР 
Ч×éID¡£ª¥  
#include <sys/typesª±h>ª¥  
#include <unistdª±h>ª¥  
int seteuid(uid ¼£Ã£Ä££ª³£²¡½t ª«uid);ª«ª¥  
int setegid(gid ¼£Ã£Ä££ª³£²¡½t ª«gid);ª«ª¥  
Both return:0 if OK,-1 on error¡þÁ½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1ª¥  
Ò»¸ö·ÇÌØÈ¨Óû§¿É½«ÆäÓÐЧÓû§IDÉèÖÃΪÆäʵ¼ÊÓû§ID»òÆä±£´æµÄÉèÖÃ-Óû§-ID¡£  
¶ÔÓÚÒ»¸ö  
ÌØÈ¨Óû§Ôò¿É½«ÓÐЧÓû§IDÉèÖÃΪuid¡£(ÕâÇø±ðÓÚsetuidº¯Êý£¬Ëü¸ü¸ÄÈý¸öÓû§I  
D¡£)ÕâÒ»  
½¨Òé¸ü¸ÄÒ²ÒªÇóÖ§³Ö±£´æµÄÉèÖÃ-Óû§-ID¡£ª¥  
SVR4ºÍ4ª±3+BSD¶¼Ö§³ÖÕâÁ½ÖÖº¯Êý¡£ª¥  
ͼ8ª±8¡þÕªÒªÁгöÁ˱¾½ÚËùÊöµÄÐÞ¸ÄÈý¸ö²»Í¬µÄÓû§IDµÄ¸÷¸öº¯Êý¡£ª¥ª¥  
P217ª¥ª¥  
ͼ8ª±8¡þÉèÖò»Í¬µÄÓû§IDµÄ¸÷º¯ÊýÕªÒªª¥  
×éIDª¥  
ÖÁ´Ë£¬ÔÚ±¾ÕÂÖÐËù˵Ã÷µÄÒ»Çж¼ÒÔÀàËÆ·½Ê½ÊÊÓÃÓÚ¸÷¸ö×éID¡£Ìí¼Ó×éID²»ÊÜsetgi  
dº¯ÊýµÄÓ°  
Ïì¡£ª¥  
8ª±11¡þ½âÊÍÆ÷Îļþª¥  
SVR4ºÍ4ª±3+BSD¶¼Ö§³Ö½âÊÍÆ÷Îļþ¡£ÕâÖÖÎļþÊÇÎı¾Îļþ£¬ÆäÆðʼÐеÄÐÎʽÊÇ£ºª¥  
   
£££¡ pathname£Ûoptional-argument£Ýª¥  
ÔÚæð̾ºÅºÍpathnameÖ®¼äµÄ¿Õ¸ñÊÇ¿ÉÈÎÑ¡µÄ¡£×î³£¼ûµÄÊÇÒÔÏÂÁÐÐпªÊ¼£ºª¥  
#£¡/bin/shª¥  
pathnameͨ³£ÊǸö¾ø¶Ô·¾¶Ãû£¬¶ÔËü²»½øÐÐÊ²Ã´ÌØÊâµÄ´¦Àí(²»Ê¹ÓÃPATH½øÐз¾¶  
ËÑË÷)¡£¶Ô  
ÕâÖÖÎļþµÄʶ±ðÊÇÓÉϵͳºË×÷Ϊexecϵͳµ÷Óô¦ÀíµÄÒ»²¿·ÖÀ´Íê³ÉµÄ¡£ÏµÍ³ºËʹµ÷  
ÓÃexecº¯  
ÊýµÄ½ø³Ìʵ¼ÊÖ´ÐеÄÎļþ²¢²»ÊǸýâÊÍÆ÷Îļþ£¬¶øÊÇÔڸýâÊÍÆ÷ÎļþµÄµÚÒ»ÐÐÖÐp  
athnameËù  
Ö¸¶¨µÄÎļþ¡£Ò»¶¨Òª½«½âÊÍÆ÷Îļþ(Îı¾Îļþ£¬ËüÒÔ#£¡¿ªÍ·)ºÍ½âÊÍÆ÷(ÓɸýâÊÍÆ÷  
ÎļþµÚÒ»  
ÐÐÖеÄpathnameÖ¸¶¨)Çø·Ö¿ªÀ´¡£ª¥  
ÒªÁ˽⣬ºÜ¶àϵͳ¶Ô½âÊÍÆ÷ÎļþµÚÒ»ÐÐÓ㤶ÈÏÞÖ¹(32¸ö×Ö·û)¡£Õâ°üÀ¨#£¡£¬path  
name£¬Ñ¡  
Ôñ²ÎÊýÒÔ¼°¿Õ¸ñÊý¡£ª¥  
ʵÀýª¥  
ÈÃÎÒÃǹ۲ìÒ»¸öʵÀý£¬´ÓÖÐÁ˽⵱±»Ö´ÐеÄÎļþÊǸö½âÊÍÆ÷Îļþʱ£¬ÏµÍ³ºË¶Ôexe  
cº¯ÊýµÄ²Î  
Êý¼°¸Ã½âÊÍÆ÷ÎļþµÚÒ»ÐеĿÉÈÎÑ¡²ÎÊý×÷ºÎÖÖ´¦Àí¡£³ÌÐò8ª±10µ÷ÓÃexeclÖ´ÐÐÒ»¸ö  
½âÊÍÆ÷ÎÄ  
¼þ¡£ª¥ª¥  
P218ª¥ª¥  
³ÌÐò8ª±10¡þÖ´ÐÐÒ»¸ö½âÊÍÆ÷ÎļþµÄ³ÌÐòª¥  
ÏÂÃæÏÈÏÔʾҪ±»Ö´ÐеĸýâÊÍÆ÷Îļþ(Ö»ÓÐÒ»ÐÐ)µÄÄÚÈÝ£¬½Ó×ÅÊÇÔËÐгÌÐò8ª±10µÄ  
½á¹û¡£ª¥  
$ cat /home/stevens/bin/testinterpª¥  
#!/home/stevens/bin/echoarg fooª¥  
$ aª±outª¥  
argv£Û0£Ý: /home/stevens/bin/echoargª¥  
argv£Û1£Ý: fooª¥  
argv£Û2£Ý: /home/stevens/bin/testinterpª¥  
argv£Û3£Ý: myarg1ª¥  
argv£Û4£Ý: MY ARG2ª¥  
³ÌÐòecboarg(½âÊÍÆ÷)»ØËÍÿһ¸öÃüÁîÐвÎÊý¡£(Ëü¾ÍÊdzÌÐò7ª±2¡£)×¢Ò⣬µ±ÏµÍ³  
ºËexec¸Ã  
½âÊÍÆ÷(/home/stevens/bin/ecboarg)ʱ£¬argv£Û0£ÝÊǸýâÊÍÆ÷µÄ·¾¶Ãû£¬argv£Û  
1£ÝÊǽ⠠
ÊÍÆ÷  
ÎļþÖеĿÉÈÎÑ¡Ôñ²ÎÊý£¬ÆäÓà²ÎÊýÊÇ·¾¶Ãû(/bome/stevens/bin/testinterp)£¬ÒÔ  
¼°³ÌÐò8  
ª±10Öе÷ÓÃexeclµÄµÚ¶þºÍµÚÈý¸ö²ÎÊý(myarg1,ºÍMY ARG2)¡£µ÷ÓÃexeclʱµÄargv£Û  
1£ÝºÍarg  
v£Û2£ÝºÍargv£Û3£ÝÒÑÏòÓÒÒÆÁËÁ½¸öλÖᣪ¥  
×¢Ò⣬ϵͳºËÈ¡ÁËexeclÖеÄ·¾¶ÃûÒÔ´úÌæµÚÒ»¸ö²ÎÊý(testinterp)£¬ÒòΪһ°ã·  
¾¶Ãû°üº¬  
Á˽ϵÚÒ»¸ö²ÎÊý¸ü¶àµÄÐÅÏ¢¡£ª¥  
ʵÀýª¥  
ÔÚ½âÊÍÆ÷·¾¶Ãû(pathname)ºó¿É¸úËæÈÎÑ¡²ÎÊý£¬ËüÃdz£ÓÃÓÚΪ֧³Ö-fÈÎÑ¡ÏîµÄ³ÌÐò  
Ö¸¶¨¸ÃÈΠ 
Ñ¡Ïî¡£ÀýÈ磬¿ÉÒÔÒÔÏÂÁз½Ê½Ö´ÐÐawk(1)³ÌÐò£ºª¥  
awk -f myfileª¥  
Ëü¸æËßawk´ÓÎļþmyfileÖжÁawk³ÌÐòª¥  
ÔںܶàϵͳÖУ¬ÓÐawkµÄÁ½¸ö°æ±¾¡£awk³£³£±»³ÆÎª"ÀÏawk"£¬ËüÊÇÓëversion 7Ò»Æð  
·Ö·¢µÄ  
ԭʼ°æ±¾¡£nawk(ÐÂawk)°üº¬Á˺ܶàÔöÇ¿¹¦ÄÜ£¬¶ÔÓ¦ÓÚÔÚAho,KernighanºÍWeinber  
ger£Û1988  
£Ý  
ÖÐ˵Ã÷µÄÓïÑÔ¡£´Ëа汾ÌṩÁ˶ÔÃüÁîÐвÎÊýµÄ´æÈ¡£¬ÕâÊÇÏÂÃæµÄÀý×ÓËùÐèµÄ¡£S  
VR4ÌṩÁË  
Á½Õߣ¬ÀϵÄawk¼È¿ÉÓÃawkÒ²¿ÉÓÃoawkµ÷Ó㬵«ÊÇSVR4ÒÑ˵Ã÷ÔÚ½«À´µÄ°æ±¾ÖÐawk½«  
ÊÇnawk¡£P  
OSIXª±2Õ½ÚÖн«ÐÂawkÓï¾ä¾Í³ÆÎªawk£¬ÕâÕýÊÇÔÚ±¾ÊéÖÐËùʹÓõġ£ª¥  
ÔÚ½âÊÍÆ÷ÎļþÖÐʹÓÃ-fÈÎÑ¡ÏʹÎÒÃÇ¿ÉÒÔд³ö£ºª¥  
#£¡£¯bin/awk -fª¥  
(Ôڴ˽âÊÍÆ÷ÎļþÖкóËæawk³ÌÐò)ª¥  
ÀýÈ磬³ÌÐò8ª±11ÊÇÒ»¸öÔÚ/usr/local/bin/awkexample½âÊÍÆ÷ÎļþÖеijÌÐò¡£ª¥ª¥  
   
P218ª¥ª¥  
³ÌÐò8ª±11¡þÔÚÒ»¸ö½âÊÍÆ÷ÎļþÖеÄawk³ÌÐò¡£ª¥  
Èç¹û·¾¶Ç°×ºÖ®Ò»ÊÇ/usr/local/bin£¬Ôò¿ÉÒÔÏÂÁз½Ê½Ö´ÐгÌÐò8ª±11(¼Ù¶¨ÎÒÃÇÒÑ  
´ò¿ªÁ˸à 
ÎļþµÄÖ´ÐÐλ)£ºª¥  
$ awkexample filel FILENAME2 f3ª¥  
ARGV£Û0£Ý=/bin/awkª¥  
ARGV£Û1£Ý=file1ª¥  
ARGV£Û2£Ý=FILENAME2ª¥  
ARGV£Û3£Ý=f3ª¥  
Ö´ÐÐ/bin/awkʱ£¬ÆäÃüÁîÐвÎÊýÊÇ£ºª¥  
/bin/awk -f /usr/local/bin/awkexample file1 FILENAME2 f3ª¥  
½âÊÍÆ÷ÎļþµÄ·¾¶Ãû(/usr/local/bin/awkexample)´«Ë͸ø½âÊÍÆ÷¡£ÒòΪ²»ÄÜÆÚÍû  
¸Ã½âÊÍÆ÷(  
ÔÚ±¾ÀýÖÐÊÇ/bin/awk)»áʹÓÃPATH±äÁ¿¶¨Î»¸Ã½âÊÍÆ÷Îļþ£¬ËùÒÔÖ»´«´ºÂ·¾¶ÃûÖеĠ 
ÎļþÃûÊÇ  
²»¹»µÄ¡£µ±awk¶Á½âÊÍÆ÷Îļþʱ£¬ÒòΪ'££'ÊÇawkµÄ×¢ÊÍ×Ö·û£¬ËùÒÔÔÚawk¶Á½âÊÍÆ÷  
Îļþʱ  
£¬ËüºöÂÔµÚÒ»ÐС£ª¥  
¿ÉÒÔÓÃÏÂÁÐÃüÁîÑéÖ¤ÉÏÊöÃüÁîÐвÎÊý¡£  
$ su¡þ¡þ³ÉΪ³¬¼¶Óû§ª¥  
Password:¡þÊäÈ볬¼¶Óû§¿ÚÁ  
# mv/bin/awk /bin/awkª±save¡þ±£´æÔ­ÏȵijÌÐòª¥  
# cp /home/stevens/bin/echoarg /bin/awk¡þÔÝʱ´ú»»Ëüª¥  
# suspend¡þÓÃ×÷Òµ¿ØÖÆ¹ÒÆð³¬¼¶Óû§shellª¥  
£Û1£Ý+Stopped¡þ¡þsuª¥  
$ awkexample file1 FILENAME2 f3ª¥  
argv£Û0£Ý: /bin/awkª¥  
argv£Û1£Ý: -fª¥  
argv£Û2£Ý: /usr/local/bin/awkexampleª¥  
argv£Û3£Ý: file1ª¥  
argv£Û4£Ý: FILENAME2ª¥  
argv£Û5£Ý: f3ª¥  
$ fg¡þ¡þÓÃ×÷Òµ¿ØÖƻָ´³¬¼¶Óû§shellª¥  
suª¥  
# mv /bin/awkª±save /bin/awk¡þ»Ö¸´Ô­ÏȵijÌÐòª¥  
# exit¡þÖÕÖ¹³¬¼¶Óû§shellª¥  
ÔÚ´ËÀý×ÓÖУ¬½âÊÍÆ÷µÄ£­fÈÎÑ¡ÏîÊÇÐèÒªµÄ¡£ÕýÈçǰÊö£¬Ëü¸æËßawkÔÚʲôµØ·½µÃµ½  
awk³ÌÐò  
¡£Èç¹ûÔÚ½âÊÍÆ÷ÎļþÖÐɾ³ý-fÈÎÑ¡Ãæ£¬ÔòÆä½á¹ûÊÇ£ºª¥  
$ awkexample file1 FILENAME2 f3ª¥  
/bin/awk:syntax error at source line 1ª¥  
context ifª¥  
 >>> /user/local <<< /bin/awkexampleª¥  
/bin/awk: bailing out at source line 1ª¥  
ÒòΪÔÚÕâÖÖÇé¿öÏÂÃüÁîÐвÎÊýÊÇ£ºª¥  
/bin/awk /usr/local/bin/awkexampel file1 FILENAME2 f3ª¥  
ÓÚÊÇawkÆóͼ½«×Ö·û´®/usr/local/bin/awkexample½âÊÍΪһ¸öawk³ÌÐò¡£Èç¹û²»ÄÜ  
Ïò½âÊÍÆ÷  
ÖÁÉÙ´«µÝÒ»¸ö¿ÉÈÎÑ¡²ÎÊý(ÔÚ±¾ÀýÖÐÊÇ-f)£¬ÄÇôÕâЩ½âÊÍÆ÷ÎļþÖ»ÓжÔshell²ÅÊÇ  
ÓÐÓõġ£  
ª¥  
ÊÇ·ñÒ»¶¨ÐèÒª½âÊÍÆ÷ÎļþÄØ?ÄÇÒ²²»ÍêÈ«Èç´Ë¡£µ«ÊÇËüÃÇȷʵʹÓû§µÃµ½Ð§ÂÊ·½Ãæ  
µÄºÃ´¦£¬  
Æä´ú¼ÛÊÇϵͳºËµÄ¶îÍ⿪Ïú(ÒòΪϵͳºËÐèҪʶ±ð½âÊÍÆ÷Îļþ)¡£ÓÉÓÚÏÂÊöÀíÓÉ£¬½â  
ÊÍÆ÷Îļþ  
ÊÇÓÐÓõġ£ª¥  
1ª±Ä³Ð©³ÌÐòÊÇÓÃijÖÖÓïÑÔдµÄ½Å±¾£¬ÕâÒ»ÊÂʵ¿ÉÒÔÒþ²ØÆðÀ´¡£ÀýÈ磬ΪÁËÖ´Ðг̠ 
Ðò8ª±11£¬  
Ö»ÐèʹÓÃÏÂÁÐÃüÁîÐУºª¥  
awkexample optional-argumentsª¥  
¶ø²¢²»ÐèÒªÖªµÀ¸Ã³ÌÐòʵ¼ÊÉÏÊÇÒ»¸öawk½Å±¾£¬·ñÔòÎÒÃǾÍÒªÒÔÏÂÁз½Ê½Ö´Ðиó̠ 
Ðò£ºª¥  
awk -f awkexample optional-argumentsª¥  
2ª±½âÊÍÆ÷½Å±¾ÔÚЧÂÊ·½ÃæÒ²ÌṩÁ˺ô¦¡£ÔÙ¿¼ÂÇÒ»ÏÂÇ°ÃæµÄÀý×Ó¡£ÎÒÃÇÈÔ¾ÉÒþ²Ø  
¸Ã³ÌÐòÊÇ  
Ò»¸öawk½Å±¾µÄÊÂʵ£¬µ«Êǽ«Æä·ÅÔÚÒ»¸öshell½Å±¾ÖУºª¥  
awk 'BEGIN {ª¥  
for(i=0;i<ARGC;i++)ª¥  
printf "ARGV£Û%d£Ý=%s£Ün",i,ARGVp£Ûi£Ýª¥  
exitª¥  
}' $*ª¥  
ÕâÖÖ½â¾ö·½·¨µÄÎÊÌâÊÇÒªÇó×ö¸ü¶àµÄ¹¤×÷¡£Ê×ÏÈ£¬shell¶Á´ËÃüÁȻºóÊÔͼexec  
lp´ËÎļþ  
Ãû¡£ÒòΪshell½Å±¾ÊÇÒ»¸ö¿ÉÖ´ÐÐÎļþ£¬µ«È´²»ÊÇ»úÆ÷¿ÉÖ´Ðеģ¬ÓÚÊÇ·µ»ØÒ»¸ö´í  
Îó£»È»ºó  
£¬execlp¾ÍÈÏΪ¸ÃÎļþÊÇÒ»¸öshell½Å±¾(Ëüʵ¼ÊÉϾÍÊÇÕâÖÖÎļþ)¡£È»ºó£¬exec /  
bin/sh£¬  
²¢ÒÔ¸ÃShell½Å±¾µÄ·¾¶Ãû×÷ΪÆä²ÎÊý¡£shellÕýÈ·µØ½âÊÍÖ´ÐÐÎÒÃǵÄshell½Å±¾£¬  
µ«ÊÇΪÁË  
ÔËÐÐawk³ÌÐò£¬Ëüµ÷ÓÃfork,execºÍwait¡£ÓÃÒ»¸öshell½Å±¾´úÌæ½âÊÍÆ÷½Å±¾Óиü¶à  
µÄ¿ªÏú¡£  
ª¥  
3ª±½âÊÍÆ÷½Å±¾Ê¹ÎÒÃÇ¿ÉÒÔʹÓóý/bin/shÒÔÍâµÄÆäËüshellÀ´±àдshell½Å±¾¡£µ±e  
xeclpÕÒµ½  
Ò»¸ö·Ç»úÆ÷¿ÉÖ´ÐеĿÉÖ´ÐÐÎļþʱ£¬Ëü×ÜÊǵ÷ÓÃ/bin/shÀ´½âÊÍÖ´ÐиÃÎļþ¡£µ«ÊÇ  
ÓýâÊÍÆ÷  
½Å±¾£¬Ôò¿É±àд³É£ºª¥  
#!/bin/cshª¥  
(Ôڴ˽âÊÍÆ÷ÎļþÖкóËæC Shell½Å±¾)ª¥  
ÔÙÒ»´Î£¬ÎÒÃÇÒ²¿É½«´Ë·ÅÔÚÒ»¸ö/bin/sh½Å±¾ÖÐ(È»ºóÓÉÆäµ÷ÓÃC shell)£¬µ«ÊÇÒªÓР 
¸ü¶àµÄ¿ª  
Ïú¡£ª¥  
Èç¹ûÈý¸öshellºÍawkûÓÐÓÃ'#'×÷ΪעÊÍ·û£¬ÔòÎÒÃÇÉÏÃæËµµÄ¶¼²»»á¹¤×÷¡£ª¥  
8ª±12¡þSystemº¯Êýª¥  
ÔÚÒ»¸ö³ÌÐòÖÐÖ´ÐÐÒ»¸öÃüÁî×Ö·û´®ÊÇ·½±ãµÄ¡£ÀýÈ磬¼Ù¶¨ÎÒÃÇÒª½«Ê±¼äºÍÈÕÆÚ·Åµ½  
Ò»¸öÎļþ  
ÖУ¬Ôò¿ÉʹÓÃ6ª±9½Ú˵Ã÷µÄº¯ÊýʵÏÖÕâÒ»µã¡£µ÷ÓÃtimeµÃµ½µ±Ç°ÈÕÀúʱ¼ä£¬½Ó×ŵ÷  
ÓÃlocalt  
ime½«ÈÕÀúʱ¼ä±ä»»ÎªÄê¡¢Ô¡¢ÈÕ¡¢Ê±¡¢·Ö¡¢Ãë¡¢ÖÜÈÕÐÎʽ£¬È»ºóµ÷ÓÃStrftime¶Ô  
ÉÏÃæµÄ½á  
¹û½øÐиñʽ»¯´¦Àí£¬×îºó½«½á¹ûдµ½ÎļþÖС£µ«ÊÇÓÃÏÂÃæµÄsystemº¯ÊýÔò¸üÈÝÒ××ö  
µ½ÕâÒ»µã  
¡£ª¥  
system("date>file");ª¥  
ANSI C¶¨ÒåÁËsystemº¯Êý£¬µ«ÊÇÆä²Ù×÷ÊÇÇ¿ÁÒÒÀÀµÓÚϵͳµÄ¡£ª¥  
ÒòΪsystem²»ÊôÓÚ²Ù×÷ϵͳ½çÃæ¶øÊÇshell½çÃæ£¬ËùÒÔPOSIXª±1ûÓж¨ÒåËü£¬POSI  
Xª±2ÔòÕý  
ÔÚ¶ÔÆä½øÐбê×¼»¯¡£ÏÂÁÐ˵Ã÷ÓëPOSIXª±2±ê×¼µÄ²Ý°¸11ª±2ÏàÒ»Ö¡£ª¥  
#include <stdlibª±h>ª¥  
int system(const char *ª«cmdstring);ª«ª¥  
Returns:(see below)·µ»Ø£º(¼ûÏÂ)ª¥  
Èç¹ûcmdstringÊÇÒ»¸ö¿ÕÖ¸Õ룬Ôò½öµ±ÃüÁî´¦Àí³ÌÐò¿ÉÓÃʱ£¬system·µ»Ø·Ç0Öµ£¬Ê¹  
ÓÃÕâÒ»ÌØ  
Õ÷¿ÉÒÔ¾ö¶¨ÔÚÒ»¸ö¸ø¶¨µÄ²Ù×÷ϵͳÉÏÊÇ·ñÖ§³Ösystemº¯Êý¡£ÔÚUnixÖУ¬system×ÜÊÇ  
¿ÉÓõġ£  
ª¥  
ÒòΪsystemÔÚÆäʵÏÖÖе÷ÓÃÁËfork¡¢execºÍwaitpid£¬Òò´ËÓÐÈýÖÖ·µ»ØÖµ£ºª¥  
1ª±Èç¹ûforkʧ°Ü»òÕßwaitpid·µ»Ø³ýEINTRÖ®ÍâµÄ³ö´í£¬Ôòsystem·µ»Ø-1£¬¶øÇÒer  
roÖÐÉèÖà 
ÁË´íÎóÀàÐÍ¡£ª¥  
2ª±Èç¹ûexecʧ°Ü(±íʾ²»ÄÜÖ´ÐÐshell)£¬ÔòÆä·µ»ØÖµÈçͬshellÖ´ÐÐÁËexit(127)Ò»  
Ñù¡£ª¥  
3ª±·ñÔòËùÓÐÈý¸öº¯Êý(fork,execºÍwaitpid)¶¼³É¹¦£¬ÔòsystemµÄ·µ»ØÖµÊÇshellµÄ  
ÖÕֹ״̬  
£¬Æä¸ñʽÊÇÔÚwaitpidÖÐËù˵Ã÷µÄ¡£ª¥  
Èç¹ûwaitpidÊÇÒ»¸ö²¶×½µ½µÄÐźÅÖжϣ¬ÔòsystemºÜ¶àµ±Ç°µÄʵÏÖ¶¼·µ»ØÒ»¸ö´íÎó  
(EINTR)£¬  
ÒªÇóÔÚÕâÖÖÇé¿öÏÂsystem²»·µ»ØÒ»¸ö´íÎóÒѱ»¼Óµ½POSIXª±2µÄ×î½ü²Ý°¸ÖС£(ÔÚ10  
ª±5½ÚÖн«  
ÌÖÂÛ±»ÖжϵÄϵͳµ÷Óá£)ª¥  
³ÌÐò8ª±12ÊÇsystemº¯ÊýµÄÒ»ÖÖʵÏÖ¡£Ëü¶ÔÐźÅûÓнøÐд¦Àí¡£ÔÚ10ª±18½ÚÖн«ÐÞ  
¸Ä´Ëº¯Êý  
ʹÆä½øÐÐÐźŴ¦Àí¡£ª¥  
ShellµÄ-CÈÎÑ¡Ïî¸æËßshell³ÌÐòÈ¡ÏÂÒ»¸öÃüÁîÐвÎÊý(ÔÚÕâÀïÊÇcmdstring)×÷ΪÃü  
ÁîÊäÈë(¶ø  
²»ÊÇ´Ó±ê×¼ÊäÈë»ò´ÓÒ»¸ö¸ø¶¨µÄÎļþÖжÁÃüÁî)¡£Shell¶ÔÒÔnull×Ö·ûÖÕÖ¹µÄÃüÁî×Ö  
·û´®½øÐР 
Óï·¨·ÖÎö£¬½«ËüÃǷֳɷָô¿ªµÄÃüÁîÐвÎÊý¡£´«µÝ¸øshellµÄʵ¼ÊÃüÁî´®¿ÉÒÔ°üº¬  
ÈÎÒ»ÓÐЧ  
µÄshellÃüÁî¡£ÀýÈ磬¿ÉÒÔÓÃ<ºÍ>¶ÔÊäÈëºÍÊä³öÖØÐ¶¨Ïò¡£ª¥  
Èç¹û²»Ê¹ÓÃshellÖ´ÐдËÃüÁ¶øÊÇÊÔͼÓÉÎÒÃÇ×Ô¼ºÈ¥Ö´ÐÐËü£¬ÄÇôÕâ»áÊÇÏ൱À§  
Äѵġ£Ê×  
ÏÈ£¬ÎÒÃDZØÐëÓÃexeclp¶ø²»ÊÇexecl£¬ÏóshellÄÇÑùʹÓÃPATH±äÁ¿¡£ÎÒÃDZØÐ뽫nul  
l·û½áβµÄ  
ÃüÁî×Ö·û´®·Ö³É¸÷¸öÃüÁîÐвÎÊý£¬ÒÔ±ãË¥ºÍexeclp¡£×îºó£¬ÎÒÃÇÒ²²»ÄÜʹÓÃÈκÎÒ»  
¸öshell  
Ôª×Ö·û¡£ª¥  
×¢Ò⣬ÎÒÃǵ÷ÓÃ-exit¶ø²»ÊÇexit¡£ÕâÊÇΪÁË·ÀÖ¹ÈÎÒ»±ê×¼I/O»º´æ(ÕâЩ»º´æ»áÔÚ  
forkÖÐÓÉ  
¸¸½ø³Ì¸´ÖƵ½×Ó½ø³Ì)ÔÚ×Ó½ø³ÌÖб»Ë¢Ð¡£ª¥ª¥  
P223ª¥ª¥  
³ÌÐò8ª±12¡þsystemº¯Êý(ûÓжÔÐźŽøÐд¦Àí)ª¥  
ÓóÌÐò8ª±13¶ÔÕâÖÖʵÏÖµÄsystemº¯Êý½øÐвâÊÔ(pr-exitº¯Êý¶¨ÒåÔÚ³ÌÐò8ª±3ÖÐ)¡£  
ÔËÐгÌÐò  
8ª±13µÃµ½£ºª¥  
$ aª±outª¥  
Thu Aug 29 14:24:19 MST 1991ª¥  
normal termination,exit status=0¡þ¡þ¶ÔÓÚdateª¥  
sh:nosuchcommand:not foundª¥  
normal termination,exit status=1¡þ¶ÔÓÚÎÞ´ËÖÖÃüÁ  
stevens console Aug 25 11:49ª¥  
stevens ttyp0 ¡þAug 29 05:56ª¥  
stevens ttyp1 ¡þAug 29 05:56ª¥  
stevens ttyp2 ¡þAug 29 05:56ª¥  
normal termination,exit status=44¡þ¶ÔÓÚexitª¥ª¥  
³ÌÐò8ª±13¡þµ÷ÓÃsystemº¯Êýª¥  
ʹÓÃsystem¶ø²»ÊÇÖ±½ÓʹÓÃforkºÍexecµÄÓŵãÊÇ£ºsystem½øÐÐÁËËùÐèµÄ¸÷ÖÖ³ö´í´¦  
Àí£¬ÒÔ¼°  
¸÷ÖÖÐźŴ¦Àí(ÔÚ10ª±18½ÚÖеÄÏÂÒ»¸ö°æ±¾systemº¯ÊýÖÐ)¡£ª¥  
ÔÚUnixµÄÔçÆÚ°æ±¾ÖУ¬°üÀ¨SVR3ª±2ºÍ4ª±3BSD£¬¶¼Ã»ÓÐwaitpidº¯Êý£¬ÓÚÊǸ¸½ø³Ì  
ÓÃÏÂÁÐÐΠ 
ʽµÄÓï¾äµÈ´ý×Ó½ø³Ì£ºª¥  
while((lastpid=wait(& status)) !=pid && lastpid !=-1)ª¥  
£»ª¥  
Èç¹ûµ÷ÓÃsystemµÄ½ø³ÌÔÚµ÷ÓÃËü֮ǰÒѾ­Éú³ÉÒ»¸ö×Ó½ø³Ì(²¢execÒ»µÀ³ÌÐò)£¬Ôò¾Í  
»áÒýÆðÎÊ  
Ìâ¡£ÒòΪÉÏÃæµÄwhileÓï¾äһֱѭ»·Ö´ÐУ¬Ö±µ½ÓÉsystem²úÉúµÄ×Ó½ø³ÌÖÕÖ¹²ÅÍ£Ö¹  
£¬Èç¹ûÆä  
ÈÎÒ»¸ö²»ÊÇÓÃpid±êʶµÄ×Ó½ø³ÌÔÚ´Ë֮ǰÖÕÖ¹£¬ÔòËüÃǵĽø³ÌIDºÍÖÕֹ״̬¶¼±»wh  
ileÓï¾ä¶ª  
Æú¡£È·Êµ£¬ÓÉÓÚwait²»ÄܵȴýÒ»¸öÖ¸¶¨µÄ½ø³Ì£¬POSIXª±1²ÅΪ´Ë¼°ÆäËüһЩԭÒò¶¨  
ÒåÁËwait  
pidº¯Êý¡£Èç¹û²»Ìṩwaitpid£¬¶ÔÓÚpopenºÍpcloseº¯ÊýÒ²»á·¢ÉúͬÑùµÄÎÊÌâ¡£ª¥  
   
ÉèÖÃ-Óû§-ID³ÌÐòª¥  
Èç¹ûÔÚÒ»¸öÉèÖÃ-Óû§-ID³ÌÐòÖе÷ÓÃsystem£¬ÄÇô·¢ÉúÊ²Ã´ÄØ?ÕâÊÇÒ»¸ö°²È«ÐÔ·½  
ÃæµÄ©¶´  
£¬¾ö²»Ó¦µ±ÕâÑù×ö¡£³ÌÐò8ª±14ÊÇÒ»¸ö¼òµ¥³ÌÐò£¬ËüÖ»ÊÇ¶ÔÆäÃüÁîÐвÎÊýµ÷ÓÃsyte  
mº¯Êý¡£ª¥  
ª¥  
P225ª¥  
³ÌÐò8ª±14¡þÓÃsystemÖ´ÐÐÃüÁîÐвÎÊýª¥  
½«´Ë³ÌÐò±àÒë³É¿ÉÖ´ÐÐÄ¿±êÎļþtsys¡£ª¥  
³ÌÐò8ª±15ÊÇÁíÒ»¸ö¼òµ¥³ÌÐò£¬Ëü´òÓ¡Æäʵ¼ÊºÍÓÐЧÓû§ID¡£ª¥ª¥  
P225ª¥  
³ÌÐò8ª±15¡þ´òӡʵ¼ÊºÍÓÐЧÓû§IDª¥  
½«´Ë³ÌÐò±àÒë³É¿ÉÖ´ÐÐÄ¿±êÎļþprintuidsÔËÐÐÕâÁ½¸ö³ÌÐò£¬µÃµ½ÏÂÁнá¹û£ºª¥  
$ tsys printuids¡þ¡þÕý³£Ö´ÐУ¬ÎÞÌØÈ¨ª¥  
real uid=224,effective uid=224ª¥  
normal termination,exit status=0ª¥  
$ su¡þ¡þ³ÉΪ³¬¼¶Óû§ª¥  
Password:¡þ¡þÊäÈ볬¼¶Óû§¿ÚÁ  
# chown root tsys¡þ¡þ¸ü¸ÄÊôÖ÷ª¥  
# chmod u+s tsys¡þ¡þÔö¼ÓÉèÖÃÓû§-IDª¥  
# ls -1 tsys¡þ¡þ¼ìÑéÎļþÐí¿ÉȨºÍÊôÖ÷ª¥  
-rwsrwxr-x 1 root¡þ105737 Ang 18 11:21 tsysª¥  
# exit¡þ¡þÖÕÖ¹³¬¼¶Óû§shellª¥  
$ tsys printuidsª¥  
real uid=224,effective uid=0¡þ¡þª«oops,ª«ÕâÊÇÒ»¸ö°²È«ÐÔ¿Õ¶´ª¥  
normal termination,exit status=0ª¥  
ÎÒÃǸøÓètsys³ÌÐòµÄ³¬¼¶Óû§Ðí¿ÉȨÔÚsystemÖÐÖ´ÐÐÁËforkºÍexecÖ®ºóÈÔ±»±£³ÖÏ  
À´£¬Ò²¾Í  
ÊÇ˵ִÐÐsystemÖÐshellÃüÁîµÄ½ø³ÌÒ²ÊÇÓÐÁ˳¬¼¶Óû§Ðí¿ÉȨ¡£ª¥  
Èç¹ûÒ»¸ö½ø³ÌÕýÒÔÌØÊâµÄÐí¿ÉȨ(ÉèÖÃ-Óû§-ID»òÉèÖÃ-×é-ID)ÔËÐУ¬ËüÓÖÏëÉú³ÉÁí  
Ò»¸ö½ø³Ì  
Ö´ÐÐÁíÒ»µÀ³ÌÐò£¬ÔòËüÓ¦µ±Ö±½ÓʹÓÃforkºÍexec£¬¶øÇÒÔÚforkÖ®ºó£¬exec֮ǰҪ¸Ä  
»Øµ½ÆÕͨ  
Ðí¿ÉȨ¡£ÉèÖÃ-Óû§-ID»òÉèÖÃ-×é-ID³ÌÐò¾ö²»Ó¦µ÷ÓÃsystemº¯Êý¡£ª¥  
ÕâÖÖ¾¯¸æµÄÒ»¸öÀíÓÉÊÇ£ºsystemµ÷ÓÃshell¶ÔÃüÁî×Ö·û´®½øÐÐÓï·¨·ÖÎö£¬¶øshellÔò  
ʹÓÃIFS  
±äÁ¿×÷ΪÆäÊäÈë×ֶηָô·û¡£½ÏÔçµÄshell°æ±¾ÔÚ±»µ÷ÓÃʱ²»½«´Ë±äÁ¿»Ö¸´ÎªÆÕͨ  
×Ö·û¼¯¡£  
Õâ¾ÍÔÊÐíÒ»¸ö²»»³ºÃÒâµÄÓû§ÔÚµ÷ÓÃsystem֮ǰÉèÖÃIFS£¬Ôì³ÉsystemÖ´ÐÐÒ»¸ö²»  
ͬµÄ³ÌÐò  
¡£ª¥  
8ª±13¡þ½ø³Ì»á¼Æª¥  
ºÜ¶àUnixϵͳÌṩÁËÒ»¸öÈÎÑ¡ÏîÒÔ½øÐнø³Ì»á¼ÆÊÂÎñ´¦Àí¡£µ±È¡ÁËÕâÖÖÈÎÑ¡Ïîºó£¬  
ÿµ±½ø³Ì  
½áÊøÊ±ÏµÍ³ºË¾Íдһ¸ö»á¼Æ¼Ç¼¡£µäÐÍµÄ»á¼Æ¼Ç¼ÊÇ32¸ö×Ö½Ú³¤µÄ¶þ½øÖÆÊý¾Ý£¬°ü  
À¨ÃüÁîÃû  
¡¢ËùʹÓõÄCPUʱ¼ä×ÜÁ¿¡¢Óû§IDºÍ×éID¡¢Æð¶¯Ê±¼äµÈ¡£ÔÚ±¾½ÚÎÒÃÇÒª±È½Ïϸ×еؠ 
˵Ã÷ÕâÖÖ  
»á¼Æ¼Ç¼£¬ÕâÑùҲʹÎÒÃǵõ½ÁËÒ»¸öÔÙ´Î¹Û²ì½ø³ÌµÄ»ú»á£¬µÃµ½ÁËʹÓÃ5ª±9½ÚÖÐËù  
½éÉܵÄfi  
ladº¯ÊýµÄ»ú»á¡£ª¥  
ÈÎÒ»±ê×¼¶¼Ã»ÓжԽø³Ì»á¼Æ½øÐйý˵Ã÷¡£±¾½ÚµÄ˵Ã÷ÒÀ¾ÝSVR4ºÍ4ª±3+BSDʵÏÖ¡£S  
VR4ÌṩÁË  
ºÜ¶à³ÌÐò´¦ÀíÕâÖÖԭʼµÄ»á¼ÆÊý¾Ý¡¼CD2¡½ÀýÈç¼ûrunacctºÍacctcom¡£4ª±3+BSDÌá  
¹©sa(8)´¦  
Àí²¢ÕªÒªÔ­Ê¼»á¼ÆÊý¾Ý¡£ª¥  
Ò»¸öÖÁ½ñûÓÐ˵Ã÷¹ýµÄº¯Êý(acct)Æð¶¯ºÍÖÕÖ¹½ø³Ì»á¼Æ¡£Î¨Ò»Ê¹ÓÃÕâÒ»º¯ÊýµÄÊÇS  
VR4ºÍ4ª±3  
+BSDµÄacction(8)ÃüÁî¡£³¬¼¶Óû§Ö´ÐÐÒ»¸ö´øÂ·¾¶¸÷²ÎÊýµÄacctionÃüÁîÆð¶¯»á¼Æ  
´¦Àí¡£¸Ã  
·¾¶Ãûͨ³£ÊÇ/var/adm/pacct(½ÏÀϵÄϵͳÖÐÕâÊÇ/usr/adm/acct¡£Ö´Ðв»´øÈκβΠ 
ÊýµÄacct  
ÃüÁîÔòÍ£Ö¹»á¼Æ´¦Àí¡£ª¥  
»á¼Æ¼Ç¼½á¹¹¶¨ÒåÔÚÍ·Îļþ<sys/acctª±h>ÖУ¬ÆäÑùʽÊÇ£ºª¥  
typedef u ¼£Ã£Ä££ª³£²¡½short comp ¼£Ã£Ä££ª³£²¡½t;  /* ¡þ3λ»ùÊý£¬8λָÊý  
£¬13λ·Ö  
Êýª¥  
struct acctª¥  
{ª¥  
char¡þac ¼£Ã£Ä££ª³£²¡½flag; /*¡þ±êÖ¾(¼ûͼ8ª±9)ª¥  
char¡þac ¼£Ã£Ä££ª³£²¡½stat; /*¡þÖÕֹ״̬(Ö»ÊÇÐźźÍcore±êÖ¾)ª¥  
¡þ¡þ¡þ¡þ¡þ/*¡þ(BSDϵͳ²»Ìṩ)ª¥  
uid ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½uid;¡þ/*¡þʵ¼ÊÓû§IDª¥  
gid ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½gid;¡þ/*¡þʵ¼Ê×éIDª¥  
dev ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½tty;¡þ  ª³¡þ¿ØÖÆÖն˪¥  
time ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½btime;¡þ  ª³¡þÆðʼÈÕÀúʱ¼äª¥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½utime; ¡þ/*¡þÓû§CPUʱ¼ä(µÎ´ð)ª¥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½stime;¡þ/*¡þϵͳCPUʱ¼ä(µÎ´ð)ª¥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½etime;¡þ  ª³¡þ¾­¹ýµÄʱ¼ä(µÎ´ð)ª¥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½mem;¡þ/¡þ*ƽ¾ùʹÓõÄÄڴ檥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½io;¡þ/*¡þ¶Á¡¢Ð´´«ÊäµÄ×Ö½ÚÊýª¥  
comp ¼£Ã£Ä££ª³£²¡½t¡þac ¼£Ã£Ä££ª³£²¡½rw;¡þ/*¡þ¿é¶Á»òд   þª³£¯ª¥  
char ac-comm£ÛB£Ý; ¡þ£¯ª³ÃüÁîÃû£ºSVR4ÊÇ Û£ £Ý£¬4ª±3+BSDÊÇ£Û£±£° Ý¡þª³£¯  
ª¥  
}£»ª¥  
ÓÉÓÚÀúÊ·´«Í³£¬±´¿ËÀ³ÏµÍ³£¬°üÀ¨4ª±3+BSD²»Ìṩac-stat±äÁ¿¡£ª¥  
ÆäÖУ¬ac-flag¼Ç¼Á˽ø³ÌÖ´ÐÐÆÚ¼äµÄijЩʼþ¡£ÕâЩʼþÈçͼ8ª±9ÖÐËùʾ¡£ª¥  
ª¥ª¥  
P227ª¥ª¥  
ͼ8ª±9¡þ»á¼Æ¼Ç¼ÖеÄac-flagÖµª¥  
»á¼Æ¼Ç¼ËùÐèµÄ¸÷¸öÊý¾Ý(¸÷CPUʱ¼ä£¬´«ÊäµÄ×Ö·ûÊýµÈ)¶¼ÓÉϵͳºË±£´æÔÚ½ø³Ì±í  
ÖУ¬²¢ÔÚ  
Ò»¸öнø³Ì±»´´½¨Ê±ÖóõÖµ(ÀýÈçforkÖ®ºóÔÚ×Ó½ø³ÌÖÐ)¡£Ò»¸ö½ø³ÌÖÕֹʱдһ¸ö»á  
¼Æ¼Ç¼¡£  
Õâ¾ÍÒâζ×ÅÔÚ»á¼ÆÎļþÖмǼµÄ˳Ðò¶ÔÓ¦ÓÚ½ø³ÌÖÕÖ¹µÄ˳Ðò£¬¶ø²»ÊÇËüÃÇÆð¶¯µÄ˳  
Ðò¡£ÎªÁË  
È·¶¨Æð¶¯Ë³Ðò£¬ÐëÒª¶ÁÈ«²¿»á¼ÆÎļþ£¬²¢°´Æð¶¯ÈÕÀúʱ¼ä½øÐÐÅÅÐò¡£Õâ²»ÊÇÒ»Öֺܠ 
ÍêÉÆµÄ·½  
·¨£¬ÒòΪÈÕÀúʱ¼äµÄµ¥Î»ÊÇÃë(1ª±10½Ú)£¬ÔÚÒ»¸ö¸ø¶¨µÄÃëÖпÉÄÜÆð¶¯Á˶à¸ö½ø³Ì  
¡£¶øÇ½ÉÏ  
ʱÖÓʱ¼äµÄµ¥Î»ÊÇʱÖӵδð(ͨ³££¬Ã¿ÃëµÎ´ðÊýÔÚ50¡«£±£°£°Ö®¼ä)¡£µ«ÊÇÎÒÃDz¢²»  
ÖªµÀ½ø³Ì  
µÄÖÕֹʱ¼ä£¬ÎÒÃÇËùÖªµÀµÄÖ»ÊÇÆð¶¯Ê±¼äºÍÖÕֹ˳Ðò¡£Õâ¾ÍÒâζ×Å£¬¼´Ê¹Ç½ÉÏʱ¼ä  
±ÈÆð¶¯Ê±  
¼äÒª¾«È·µÃ¶à£¬µ«ÊÇÎÒÃÇÈÔ²»Äܰ´ÕÕ»á¼ÆÎļþÖеÄÊý¾ÝÖØ¹¹¸÷½ø³ÌµÄ¾«È·Æð¶¯Ë³Ðò  
¡£ª¥  
»á¼Æ¼Ç¼¶ÔÓ¦ÓÚ½ø³Ì¶ø²»ÊdzÌÐò¡£ÔÚforkÖ®ºó£¬ÏµÍ³ºËΪ×Ó½ø³Ì³õʼ»¯Ò»¸ö¼Ç¼£¬  
Õâ²»ÊÇÔÚ  
Ò»¸öгÌÐò±»Ö´ÐÐʱ¡£ËäÈ»exec²¢²»´´½¨Ò»¸öÐÂµÄ»á¼Æ¼Ç¼£¬µ«ÏàÓ¦¼Ç¼ÖеÄÃüÁî  
Ãû¸Ä±äÁË  
£¬AFORK±êÖ¾Ôò±»Çå³ý¡£ÕâÒâζ×Å£¬Èç¹ûÒ»¸ö½ø³Ì˳ÐòexecÁËÈýµÀ³ÌÐò(A exec B,  
B exec C,  
×îºóC exit)£¬µ«Ö»Ð´Ò»¸ö»á¼Æ¼Ç¼¡£ÔڸüǼÖеÄÃüÁîÃû¶ÔÓ¦ÓÚ³ÌÐòC£¬µ«CPUʱ  
¼äÊdzÌÐòA  
¡¢B¡¢CÖ®ºÍ¡£ª¥  
ʵÀýª¥  
ΪÁ˵õ½Ä³Ð©»á¼ÆÊý¾ÝÒÔ±ã²é¿´£¬ÔËÐгÌÐò8ª±16£¬Ëüµ÷ÓÃforkËĴΡ£Ã¿¸ö×Ó½ø³Ì  
×ö²»Í¬µÄ  
ÊÂÇ飬ȻºóÖÕÖ¹¡£´Ë³ÌÐòËù×öµÄ»ù±¾¹¤×÷ʾÓÚͼ8ª±10ÖС£ª¥  
³ÌÐò8ª±17Ôò´Ó»á¼Æ¼Ç¼ÖÐÑ¡Ôñ³öһЩ×ֶβ¢´òÓ¡³öÀ´¡£ª¥ª¥  
P228ª¥  
³ÌÐò8ª±16¡þ²úÉú»á¼ÆÊý¾ÝµÄ³ÌÐòª¥ª¥  
P229ª¥  
ͼ8ª±10¡þ»á¼Æ´¦ÀíʵÀýµÄ½ø³Ì½á¹¹ª¥  
È»ºó£¬Ö´ÐÐÏÂÁвÙ×÷²½Ö裺ª¥  
1ª±±ä³ÉΪ³¬¼¶Óû§£¬ÓÃacctionÃüÁîÆð¶¯»á¼ÆÊÂÎñ´¦Àí¡£×¢Ò⣬µ±´ËÃüÁî½áÊøÊ±£¬  
»á¼ÆÊÂÎñ  
´¦ÀíÒѾ­Æð¶¯£¬Òò´ËÔÚ»á¼ÆÎļþÖеĵÚÒ»¸ö¼Ç¼ӦÀ´×ÔÕâÒ»ÃüÁî¡£ª¥  
2ª±ÔËÐгÌÐò8ª±16¡£Õâ»á¼ÓÎå¸ö¼Ç¼µ½»á¼ÆÎļþÖÐ(¸¸½ø³Ì1¸ö£¬Ëĸö×Ó½ø³Ì¸÷Ò»¸ö  
)¡£ÔÚµÚ  
¶þ¸ö×Ó½ø³ÌÖУ¬execl²¢²»´´½¨Ò»¸öнø³Ì£¬ËùÒÔ¶ÔµÚ¶þ¸ö½ø³ÌÖ»ÓÐÒ»¸ö»á¼Æ¼Ç¼  
¡£ª¥  
3ª±±ä³ÉΪ³¬¼¶Óû§£¬Í£Ö¹»á¼ÆÊÂÎñ´¦Àí¡£ÒòΪÔÚacctionÃüÁîÖÕֹʱÒÑÍ£Ö¹´¦Àí»á  
¼ÆÊÂÎñ£¬  
ËùÒÔ²»»áÔÚ»á¼ÆÎļþÖÐÔö¼ÓÒ»¸ö¼Ç¼¡£ª¥  
4ª±ÔËÐгÌÐò817£¬´Ó´òÓ¡ÎļþÖÐÑ¡³ö×ֶβ¢´òÓ¡Ö®¡£ª¥  
²½Öè4µÄÊä³öÈçÏÂÃæËùʾ¡£ÔÚÿһÐÐÒÔбÌå×Ö¶Ô½ø³Ì¼ÓÁË˵Ã÷£¬ÒÔ±ãºóÃæÌÖÂÛ¡£ª¥  
   
accton¡þe  ¡þ£·£¬chars¡þ£¶£´£¬stat=¡þ£°£º¡þ£Óª¥  
dd¡þe=¡þ37£¬chars=221888,stat¡þ£°£º¡þ¡þµÚ2×Ó½ø³Ìª¥  
aª±out¡þe=¡þ£±£²£¸£¬chars£½¡þ£°£¬stat=¡þ£°£º¡þ¡þ¸¸½ø³Ìª¥  
aª±out¡þe=¡þ274£¬chars=¡þ0£¬stat=134:F þ£Ä¡¡£Ø¡þµÚ1×Ó½ø³Ìª¥  
aª±out¡þe=¡þ360,chars=¡þ0£¬stat=¡þ£¹£º£Æ¡þ¡þ£Ø¡þµÚ4×Ó½ø³Ìª¥  
aª±out¡þe£½¡þ484,chars=¡þ£°£¬stat=¡þ£°£º£Æ¡þ¡þµÚ3×Ó½ø³Ìª¥  
ª¥  
P230ª¥  
³ÌÐò8ª±17¡þ´òÓ¡´Óϵͳ»á¼ÆÎļþÖÐÑ¡³öµÄ×ֶΪ¥  
ǽÉÏÈÕÀúʱ¼äÖµµÄµ¥Î»ÊÇCLK ¼£Ã£Ä££ª³£²¡½TCK¡£´Óͼ2ª±6Öпɼû£¬±¾ÏµÍ³µÄÖµÊÇ  
60¡£ÀýÈç  
£¬ÔÚ¸¸½ø³ÌÖР 
µÄsleep(2)¶ÔÓ¦ÓÚǽÉÏÈÕÀúʱ¼ä128¸öʱÖӵδ𡣶ÔÓÚµÚÒ»¸ö×Ó½ø³Ì£¬sleep(4)±ä  
³É274ʱÖÓ  
µÎ´ð¡£×¢Ò⣬һ¸ö½ø³Ì˯ÃßµÄʱ¼ä×ÜÁ¿²¢²»¾«È·(ÔÚµÚÊ®ÕÂÖн«·µ»Øµ½sleepº¯Êý¡£  
)µ÷ÓÃfor  
kºÍexitҲҪһЩʱ¼ä¡£ª¥  
×¢Ò⣬ac-stat²¢²»Êǽø³ÌµÄÕæÕýÖÕֹ״̬¡£ËüÖ»ÊÇ8ª±6½ÚÖÐÌÖÂÛµÄÖÕֹ״̬µÄÒ»  
²¿·Ö¡£Èç  
¹û½ø³ÌÒì³£ÖÕÖ¹£¬ÔòÔÚ´Ë×Ö½ÚÖеÄÐÅÏ¢Ö»ÊÇcore±ê־λ(Ò»°ãÊÇ×î¸ßλ)ÒÔ¼°Ðźűࠠ
ºÅÊý(Ò»  
°ãÊǵÍ7λ)¡£Èç¹û½ø³ÌÕý³£ÖÕÖ¹£¬Ôò´Ó»á¼ÆÎļþ²»Äܵõ½½ø³ÌµÄÍ˳ö(exit)״̬¡£  
¶ÔÓÚµÚÒ»  
¸ö½ø³Ì£¬´ËÖµÊÇ128+6¡£128ÊÇcore±ê־룬6ÊÇ´ËϵͳÉÏÐźÅSIGBARTµÄÖµ(ËüÊÇÓÉ  
µ÷ÓÃabort  
²úÉúµÄ)¡£µÚËĸö×Ó½ø³ÌµÄÖµÊÇ9£¬Ëü¶ÔÓ¦ÓÚSIGKILLµÄÖµ¡£´Ó»á¼ÆÎļþµÄÊý¾ÝÖв»  
Äܵõ½¸¸  
½ø³ÌÔÚexitʱËùÓõIJÎÊýÖµÊÇ2£¬Èý¸ö×Ó½ø³ÌexitʱËùÓõIJÎÊýÖµÊÇ0¡£ª¥  
dd½ø³Ì¸´ÖƵ½µÚ¶þ¸ö×Ó½ø³ÌÖеÄÎļþ/bootµÄ³¤¶ÈÊÇ110£¬888 byte¡£¶øI/O×Ö·ûÊý  
ÊÇ´ËÖµµÄ  
¶þ±¶£¬ÒòΪ¶ÁÁË110£¬888byta£¬È»ºóÓÖдÁË110£¬888byte¡£¼´Ê¹Êä³öµ½nullÉ豸£¬  
ÈÔ¶ÔI/O  
×Ö·ûÊý½øÐмÆËã¡£ª¥  
ac-flagÖµÓëÎÒÃÇËùÓèÁϵÄÏàͬ¡£³ýµ÷ÓÃÁËexeclµÄµÚ¶þ¸ö×Ó½ø³ÌÒÔÍ⣬ÆäËü×Ó½ø³Ì  
¶¼ÉèÖÃÁË  
F±êÖ¾¡£¸¸½ø³ÌûÓÐÉèÖÃF±êÖ¾£¬ÆäÔ­ÒòÊǽ»»¥Ê½shellÔøµ÷ÓùýforkÉú³É¸¸½ø³Ì£¬  
È»ºóµ÷ÓÃe  
xec aª±outÎļþ¡£µ÷ÓÃÁËabortµÄµÚÒ»¸ö×Ó½ø³ÌµÄcoreת´¢±êÖ¾(D)´ò¿ª¡£ÒòΪabo  
rt²úÉúÐÅ  
ºÅ  
SIGABRTÒÔ²úÉúcoreת´¢¡£¸Ã½ø³ÌµÄX±êÖ¾Ò²´ò¿ª£¬ÒòΪËüÊÇÓÉÐźÅÖÕÖ¹µÄ¡£µÚËĸö  
×Ó½ø³ÌµÄ  
X±êÖ¾Ò²´ò¿ª£¬µ«ÊÇSIGKILLÐźŲ¢²»²úÉúcoreת´¢£¬ËüÖ»ÊÇÖÕÖ¹¸Ã½ø³Ì¡£ª¥  
×îºóҪ˵Ã÷µÄÊÇ£ºµÚÒ»¸ö×Ó½ø³ÌµÄI/O×Ö·ûÊýΪO£¬µ«ÊǸýø³Ì²úÉúÁËÒ»¸öcoreÎļþ  
¡£ÆäÔ­Òò  
ÊÇдcoreÎļþËùÐèµÄI/O²¢²»Óɸýø³Ì¸ºµ£¡£ª¥  
8ª±14¡þÓû§±êʶª¥  
ÈÎÒ»½ø³Ì¶¼¿ÉÒԵõ½Æäʵ¼ÊºÍÓÐЧÓû§ID¼°×éID¡£µ«ÊÇÓÐʱϣÍûÕÒµ½ÔËÐиóÌÐòµÄ  
Óû§µÄµÇ  
¼Ãû¡£ÎÒÃÇ¿ÉÒÔµ÷ÓÃgetpwuid(getuid())£¬µ«ÊÇÈç¹ûÒ»¸öÓû§Óжà¸öµÇ¼Ãû£¬ÕâЩ  
µÇ¼ÃûÓÖ  
¶ÔÓ¦×Åͬһ¸öÓû§ID£¬ÕâÓÖ½«ÈçºÎÄØ?(Ò»¸öÈËÔÚ¿ÚÁî×ÖÎļþÖпÉÒÔÓжà¸ö¼Ç¼Ï  
ËüÃǵÄÓà 
»§IDÏàͬ£¬µ«µÇ¼shellÔò²»Í¬)¡£ÏµÍ³Í¨³£±£´æÓû§µÄµÇ¼Ãû(6ª±7½Ú)£¬ÓÃgetlo  
ginº¯Êý¿É  
ÒÔ´æÈ¡´ËµÇ¼Ãû¡£ª¥  
#include <unistdª±h>ª¥  
char *getlogin(void);ª¥  
Returns:pointer to string giving login name if OK,NULL on errorª¥·µ»Ø£º  
Èô³É¹¦Îª  
Ö¸ÏòµÇ¼Ãû×Ö·û´®µÄÖ¸Õ룬³ö´íΪNULL¡£ª¥  
Èç¹ûµ÷Óô˺¯ÊýµÄ½ø³ÌûÓÐÁ¬½Óµ½Óû§µÇ¼ʱËùÓõÄÖÕ¶Ë£¬Ôò±¾º¯Êý»áʧ°Ü¡£ÎÒÃÇ  
ͨ³£³ÆÕâ  
Щ½ø³ÌΪ¾«Áé½ø³Ì£¬½«ÔÚµÚÊ®ÈýÕ¶ÔÕâÖÖ½ø³ÌרÃŽøÐÐÌÖÂÛ¡£ª¥  
µÃµ½Á˵ǼÃû£¬¾Í¿ÉÓÃgetpwnamÔÚ¿ÚÁî×ÖÎļþ²éÕÒÏàÓ¦¼Ç¼ÒÔÈ·¶¨ÆäµÇ¼shellµÈ  
¡£ª¥  
ΪÁËÕÒµ½µÇ¼Ãû£¬UnixϵͳÔÚÀúÊ·ÉÏÒ»Ö±Êǵ÷ÓÃtlynameº¯Êý(11ª±9½Ú)£¬È»ºóÔÚu  
tmpÎļþ(6  
ª±7½Ú)ÖÐÕÒÆ¥ÅäÏî¡£4ª±3+BSD½«µÇ¼Ãû´æ·ÅÔÚ½ø³Ì±íÏîÖУ¬²¢Ìṩϵͳµ÷Óô桢ȡ  
¸ÃµÇ¼Ãû  
¡£ª¥  
ϵͳVÌṩcuseridº¯Êý·µ»ØµÇ¼Ãû¡£´Ëº¯ÊýÏȵ÷ÓÃgetloginº¯Êý£¬Èç¹ûʧ°ÜÔòÔÙµ÷  
ÓÃgetpwu  
id(getuid())¡£IEEE S+dª±1003ª±1-1988˵Ã÷ÁËcuserid£¬µ«ÊÇËüÒÔÓÐЧÓû§ID¶ø  
²»ÊÇʵ¼Ê  
Óû§IDÀ´µ÷Óá£POSIXª±1µÄ1990×îºó°æ±¾£¬É¾³ýÁËcuseridº¯Êý¡£ª¥  
FIPS151-1ÒªÇóµÇ¼shell¶¨ÒåÒ»¸ö»·¾³±äÁ¿LOGNAME,ÆäֵΪÓû§µÄµÇ¼Ãû¡£ÔÚ4ª±  
3+BSDÖУ¬  
´Ë±äÁ¿ÓÉloginÉèÖ㬲¢ÓɵǼshell¼Ì³Ð¡£µ«ÊÇ£¬ÒªÀí½âÒ»¸öÓû§ÊÇ¿ÉÒԸı价¾³  
±äÁ¿µÄ£¬  
ËùÒÔÎÒÃDz»ÄÜʹÓÃLOGNAMEÀ´È·ÈÏÓû§¡£×÷Ϊ´úÌæ£¬Ó¦µ±Ê¹ÓÃgetloginº¯Êý¡£ª¥  
8ª±15¡þ½ø³Ìʱ¼äª¥  
ÔÚ1ª±10½ÚÖÐ˵Ã÷ÁËǽÉÏʱÖÓʱ¼ä¡¢Óû§CPUʱ¼äºÍϵͳCPUʱ¼ä¡£ÈÎÒ»½ø³Ì¶¼¿Éµ÷  
ÓÃtimesº¯  
ÊýÒÔ»ñµÃËü×Ô¼º¼°ÖÕÖ¹×Ó½ø³ÌµÄÉÏÊöÖµ¡£ª¥  
#include <sys/timesª±h>ª¥  
clock ¼£Ã£Ä££ª³£²¡½t times(struct tms *ª«buf));ª«ª¥  
Returns:elapsed wall clock time in clock ticks if OK,-1 on errorª¥  
·µ»Ø£ºÈô³É¹¦Îª¾­¹ýµÄǽÉÏʱÖÓʱ¼ä(µ¥Î»£ºµÎ´ð)£¬³ö´íΪ-1ª¥  
´Ëº¯ÊýÌîдÓÉbufÖ¸ÏòµÄtms½á¹¹£¬¸Ã½á¹¹¶¨ÒåÊÇ£ºª¥  
struct tms{ª¥  
clock ¼£Ã£Ä££ª³£²¡½t tms ¼£Ã£Ä££ª³£²¡½utime; /* user CPU time */¡þÓû§C  
PUʱ¼äª¥  
clock ¼£Ã£Ä££ª³£²¡½t tms ¼£Ã£Ä££ª³£²¡½stime; /* system CPU time */ ÏµÍ³  
CPUʱ¼äª¥  
clock ¼£Ã£Ä££ª³£²¡½t tms ¼£Ã£Ä££ª³£²¡½cutime; /* user CPU time,terminat  
ed childr  
en */¸÷ÖÕÖ¹×Ó½ø³ÌµÄÓû§CPUʱ¼äª¥  
clock ¼£Ã£Ä££ª³£²¡½t tms ¼£Ã£Ä££ª³£²¡½cstime; /* system CPU time,termin  
ated chil  
dren */ª¥¸÷ÖÕÖ¹×Ó½ø³ÌµÄϵͳCPUʱ¼äª¥  
×¢Ò⣬´Ë½á¹¹Ã»Óаüº¬Ç½ÉÏʱÖÓʱ¼ä¡£×÷Ϊ´úÌætimes´Ëº¯ÊýÒÔº¯ÊýÖµ·µ»ØÇ½ÉÏʱ  
ÖÓʱ¼ä¡£  
´ËÖµÊÇÏà¶ÔÓÚ¹ýÈ¥µÄijһʱ¿Ì¶ÈÁ¿µÄ£¬ËùÒÔ²»ÄÜÓÃÆä¾ø¶ÔÖµ¶ø±ØÐëʹÓÃÆäÏà¶ÔÖµ¡£  
ÀýÈ磬µ÷  
ÓÃtimes£¬±£´æÆä·µ»ØÖµ¡£ÔÚÒÔºóij¸öʱ¼äÔٴε÷ÓÃtimes£¬´Óзµ»ØµÄÖµÖмõÈ¥ÒÔ  
ǰ·µ»ØµÄ  
Öµ¡£´Ë²îÖµ¾ÍÊÇǽÉÏʱÖÓʱ¼ä¡£(Ò»¸ö³¤ÆÚÔËÐеĽø³Ì¿ÉÄÜÆäǽÉÏʱÖÓʱ¼ä»áÒç³ö  
£¬µ±È»Õâ  
ÖÖ¿ÉÄÜÐÔ¼«Ð¡¡£ª¥  
½á¹¹ÖÐÁ½¸öÕë¶Ô×Ó½ø³ÌµÄ×ֶΰüº¬Á˴˽ø³ÌÒѵȴýµ½µÄ¸÷×Ó½ø³ÌµÄÖµ¡£ª¥  
ËùÓÐÓɴ˺¯Êý·µ»ØµÄCLOCK-tÖµ¶¼ÓÃ-SC-CLK-TCK(ÓÉsysconfº¯Êý·µ»ØµÄÿÃëʱÖӵΠ 
´ðÊý£¬¼û  
2ª±5ª±4½Ú)»»³ÉÃëÊý¡£ª¥  
±´¿ËÀ³Ààϵͳ£¬°üÀ¨4ª±3BSD¼Ì³ÐÁËVersion 7µÄtimes°æ±¾£¬Ëü²»·µ»ØÇ½ÉÏʱÖÓʱ  
¼ä¡£ÕâÒ»  
Àϰ汾Èç¹ûÖ´Ðгɹ¦·µ»Ø0£¬Èçʧ°ÜÔò·µ»Ø-1¡£4ª±3+BSDÖ§³ÖPOSIXª±1°æ±¾¡£ª¥  
4ª±3+BSDºÍSVR4(ÔÚBSD¼æÈÝ¿âÖÐ)ÌṩÁËgetrusage(2)º¯Êý£¬´Ëº¯Êý·µ»ØCPUʱ¼ä£¬  
ÒÔ¼°Ö¸Ê¾  
×ÊԴʹÓÃÇé¿öµÄÁíÍâÊ®ËĸöÖµ¡£ª¥  
ʵÀýª¥  
³ÌÐò818½«Ã¿¸öÃüÁîÐвÎÊý×÷ΪShellÃüÁî´®Ö´ÐУ¬¶Ôÿ¸öÃüÁî¼ÆÊ±£¬²¢´òÓ¡´Ótms  
½á¹¹È¡µÃ  
µÄÖµ¡£°´ÏÂÁз½Ê½ÔËÐд˳ÌÐò£¬µÃµ½£ºª¥  
$ aª±out "sleep 5" "date"ª¥  
command: sleep 5ª¥  
real:¡þ¡þ5ª±25ª¥  
user:¡þ¡þ0ª±00ª¥  
sys:¡þ¡þ0ª±00ª¥  
child user:¡þ¡þ0ª±02ª¥  
child sys:¡þ¡þ0ª±13ª¥  
normal termination,exit status=0ª¥  
command:dateª¥  
Sun Aug 18 09:25:38 MST 1991ª¥  
real :¡þ¡þ0ª±27ª¥  
user:¡þ¡þ£°ª±£°£°ª¥  
sys:¡þ¡þ¡þ0ª±00ª¥  
child user:¡þ¡þ0ª±05ª¥  
child sys:¡þ¡þ0ª±10ª¥  
normal termination,exit status=0ª¥  
ÔÚÁ½¸öʵÀýÖУ¬ÔÚchild userºÍchild sysÐÐÖÐÏÔʾµÄʱ¼äÊÇÖ´ÐÐshellºÍÃüÁîµÄ×Ó  
½ø³ÌËùʹÓõÄCPUʱ¼ä¡£ª¥ª¥ª¥  
³ÌÐò8ª±18¡þʱ¼äÒÔ¼°Ö´ÐÐÃüÁîÐвÎÊýª¥  
ÈÃÎÒÃÇÔÙÔËÐÐ1ª±10½ÚÖеÄÀý×Ó£ºª¥ª¥  
P235ª¥ª¥  
ÈçͬËùÆÚÍûµÄÄÇÑù£¬ËùÓÐÈý¸öÖµ(ʵ¼Êʱ¼äºÍ×Ó½ø³ÌCPUʱ¼ä)¶¼Óë1ª±10¸ßÖеÄÖµÏà  
½ü¡£ª¥  
8ª±16¡þÕªÒªª¥  
¶ÔÔÚUnix»·¾³Öеĸ߼¶³ÌÐòÉè¼Æ¶øÑÔ£¬ÍêÕûµØÁ˽âUnixµÄ½ø³Ì¿ØÖÆÊǷdz£ÖØÒªµÄ¡£  
ÆäÖбØÐëÊìÁ·ÕÆÎÕµÄÖ»Óм¸¸ö¡¼CD2¡½fork¡¢exec×å¡¢-exit¡¢waitºÍwaitpid¡£ºÜ¶à  
Ó¦ÓóÌÐò¶¼Ê¹ÓÃÕâЩԭÓï¡£forkÔ­ÓïÒ²¸øÁËÎÒÃÇÒ»¸öÁ˽⾹̬Ìõ¼þµÄ»ú»á¡£ª¥  
ÔÚ±¾ÕÂÖÐ˵Ã÷ÁËsystemº¯ÊýºÍ½ø³Ì»á¼Æ£¬Óë´ËͬʱҲʹÎÒÃÇ¿ÉÒÔ¿´µ½ÕâЩ½ø³Ì¿ØÖÆ  
º¯ÊýµÄÓ¦ÓÃÇé¿ö¡£±¾Õ»¹ËµÃ÷ÁËexecº¯ÊýµÄÁíÒ»ÖÖ±äÌ壻½âÊÍÆ÷Îļþ¼°ËüÃǹ¤×÷µÄ  
·½Ê½¡£¶Ô¸÷ÖÖ²»Í¬µÄÓû§IDºÍ×éID(ʵ¼Ê£¬±£´æµÄ)µÄÀí½âºÍ±àд°²È«µÄÉèÖÃÓû§ID³ÌÐòÊÇÖÁ  
Ø  
ÖØÒªµÄ¡£  
 
ª¥  
ÔÚÏÂÒ»ÕÂÎÒÃÇÔÚÁË½â½ø³ÌºÍ×Ó½ø³ÌµÄ»ù´¡ÉÏ£¬½øÒ»²½ËµÃ÷½ø³ÌºÍÆäËü½ø³ÌµÄ¹ØÏµ¡¼  
CD2¡½¶Ô»°ÆÚºÍ×÷Òµ¿ØÖÆ¡£ÔÚµÚÊ®ÕÂÎÒÃǽ«ËµÃ÷ÐźŻúÖÆÒԴ˽áÊø¶Ô½ø³ÌµÄÌÖÂÛ¡£ª¦  
   
   
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

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