BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: forest (ÇẮС¥~~С¼ªÆª), ÐÅÇø: Unix
±ê Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-8 (×ªÔØ)
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Fri Mar 17 17:51:03 2000)
¡¾ ÒÔÏÂÎÄ×Ö×ªÔØ×Ô Linux ÌÖÂÛÇø ¡¿
¡¾ ÔÎÄÓÉ SuperSB Ëù·¢±í ¡¿
·¢ÐÅÈË: 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ˮľÇ廪վ¡Ã¾«»ªÇø