Linux¿Î³ÌÉè¼Æ½ø³Ì¿ØÖÆ ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚÁù ÎÄÕÂLinux¿Î³ÌÉè¼Æ½ø³Ì¿ØÖƸüÐÂÍê±Ï¿ªÊ¼ÔĶÁ1d3fd0c5fad6195f302ba6a6

ͼ2 ½ø³Ì¿ØÖÆϵͳµ÷ÓÃ-fork_wait

2.1.3

Mini Shell±à³Ì(´Ë²¿·Ö²Ù×÷½Øͼ¼ûͼ4¡¢5)

1. ÔÚexp2Ŀ¼±àдһ¸ö¼òµ¥µÄshell³ÌÐò¡ªMini Shell£¬Ëü½ÓÊÕÊäÈëµÄÃüÁî²¢½âÊÍÖ´ÐС£

? LinuxµÄÃüÁî·ÖΪÄÚ²¿ÃüÁîºÍÍⲿÃüÁîÁ½ÖÖ¡£ÄÚ²¿ÃüÁîÓÉShell³ÌÐò×Ô¼ºÊµÏÖ£¬Èçcd¡¢

pwdµÈ£¬ÍⲿÃüÁîÊÇλÓÚ´ÅÅÌÉÏ£¨¶àÊýÔÚ/binºÍ/usr/binĿ¼Ï£©µÄ¿ÉÖ´ÐгÌÐò¡£Mini ShellֻʵÏÖÁ½¸öÄÚ²¿ÃüÁpwdºÍquit£¨Í˳ö£©£¬Ëü¿ÉÖ´ÐÐËùÓв»´øÑ¡ÏîºÍ²ÎÊýµÄÍⲿÃüÁÈçdate¡¢who¡¢cal¡¢lsµÈ¡£

2. £¨Ñ¡×ö1£©ÐÞ¸ÄMini Shell³ÌÐò£¬Ê¹Ëü¿ÉÖ´ÐÐÖ»´øÒ»¸öÃüÁîÑ¡Ïî»ò²ÎÊýµÄÃüÁîÐУ¬Èçls -a¡¢

cat file¡¢echo helloµÈ¡£

? ÓÃstrtokº¯Êý½«¶ÁÈëµÄÃüÁîÐÐcmdÒÔ¿Õ¸ñΪ·Ö¸ô·û²ðΪÁ½¸ö×Ö·û´®cmd1ºÍcmd2£º cmd1=strtok(cmd,\ cmd2=strtok(NULL,\

´ËʱµÄcmd1¼´ÎªÃüÁîÃû£¬cmd2¼´ÎªÃüÁîµÄÑ¡Ïî»ò²ÎÊý¡£ÅжÏcmd2£¬ÈôΪ¿ÕÔòÖ´ÐÐϵͳµ÷ÓÃexeclp(cmd1, cmd1, NULL)£¬·ñÔòÖ´ÐÐexeclp(cmd1, cmd1, cmd2, NULL)

3. £¨Ñ¡×ö2£©ÐÞ¸ÄMini Shell³ÌÐò£¬¿É×öÈκÎÄãÈÏΪ¿ÉÒԸĽøµÄÐ޸ģ¬Èç½çÃæ¡¢Ìáʾ¡¢´¦ÀíÊä

Èë´íÎó¡¢ÔöÇ¿¹¦Äܵȡ£

ͼ4 Mini Shell±à³Ì-1

ͼ5 Mini Shell-2

ͼ6 Mini Shell-3

3. ʵÑé½áÂÛÓëÆÀ¼Û

3.1 ½ø³Ì¿ØÖÆÃüÁî

´Ë²¿·Ö²Ù×÷½ÏΪ¼òµ¥£¬Ö÷ÒªÔÚ°ïÖúÀí½â½ø³ÌµÄ¸ÅÄîºÍ½ø³ÌµÄPID£¬ÕÆÎÕ»ù±¾µÄ½ø³Ì²Ù×÷Èçps killºÍºǫ́ÔËÐÐÒ»¸ö³ÌÐòµÈ¡£Í¨¹ýÕâÒ»²¿·ÖµÄ²Ù×÷ÎÒÁ˽⵽½ø³ÌÊÇʲô£¬½ø³ÌºÍ³ÌÐòÓÐʲô²»Ò»Ñù£¬×Ó½ø³ÌºÍ¸¸½ø³ÌÖ®¼äµÄ¹Øϵ¡£

3.2 ½ø³Ì¿ØÖÆϵͳµ÷ÓÃ

fork_waitÊDZ¾´ÎʵÑéµÄµÚÒ»¸ö±à³ÌÌ⣬ͨ¹ýÒѾ­¸øºÃµÄ´úÂëÎÒÁ˽⵽Á˼¸¸öÔÚLinuxÖг£Óõĺ¯Êý£¬Èçsleep()£¬ getpid()£¬ fork()£¬ wait() µÈ£¬ÎÒ¸ü¼ÓÇåÎúµØÔÚÐ޸ijÌÐòµÄ¹ý³ÌÖÐÀí½âÁË×Ó½ø³ÌºÍ¸¸½ø³ÌµÄ¹Øϵ£¬¸üÖØÒªµÄÊÇÎÒѧ»áÁËͨ¹ý¼òµ¥º¯ÊýÀ´¶Ô½ø³Ì½øÐпØÖÆ¡£¹Û²ìµ½ÁËÌØÊâµÄ½©Ê¬½ø³Ì£º½©Ê¬½ø³Ì£¨zombie£©ÊÇÖ¸ÒÑÖÕÖ¹ÔËÐУ¬µ«ÉÐδ±»Çå³ýµÄ½ø³Ì¡£

exec_testÊDZ¾´ÎÊÔÑéµÄµÚ¶þ¸ö±à³ÌÌ⣬Õâ´Îѧϰµ½µÄº¯ÊýÊÇexecl()£¬µÚÒ»²ÎÊýpath×Ö·ûÖ¸ÕëËùÖ¸ÏòÒªÖ´ÐеÄÎļþ·¾¶£¬ ½ÓÏÂÀ´µÄ²ÎÊý´ú±íÖ´ÐиÃÎļþʱ´«µÝµÄ²ÎÊýÁÐ±í£ºargv[0],argv[1]... ×îºóÒ»¸ö²ÎÊýÓÿÕÖ¸ÕëNULL×÷½áÊø¡£ÀûÓÃÕâ¸öº¯ÊýʵÏÖÁËÓÃexec()Öû»³ÌÐòµÄÖ´ÐдúÂëÎļþµÄ¹¦ÄÜ¡£

3.3 Mini Shell±à³Ì

ÕâÒ»²¿·ÖµÄ²Ù×÷½ÏΪ¸´ÔÓ£¬Õ¼ÓÃÁËʵÑéµÄ´ó²¿·Öʱ¼ä¡£ÈÃÎÒÒâʶµ½ÎÒÃǵıà³ÌÄÜÁ¦»¹ÓдýÌá¸ß£¬ÓÈÆäÊÇ×Ö·û´®¡¢ÎļþµÈ²¿·Ö¡£Ñ¡×÷Ò»µÄµØ·½Í¨¹ý¿Õ¸ñ°ÑÃüÁîÃûºÍ²ÎÊý·Ö¿ª·Ö±ðÖ´ÐУ¬ÐèÒª·ÖÇåÊÇÓ¦¸ÃÏȶÁÃüÁîÔÙ·Ö¿ª»¹ÊÇÏÈ·Ö¿ªÔÙ¶ÁÃüÁѡ×÷¶þÎÒÔöÌíÁ˼¸¸öMini ShellÄÚ²¿ÃüÁÐÞ¸ÄÁ˽çÃæ¡£

4. ³ÌÐòÇåµ¥

4.1 fork_wait.c

#include #include #include main() {

int rid, cid;

printf(\2012010948****\\n\ //½«your-sid¸ÄΪÄãµÄѧºÅ rid = fork();

if ( rid < 0 ) printf(\ else if ( rid == 0 ) { // ×Ó½ø³Ì

printf(\ sleep(10); // ˯Ãß10Ãë printf(\ }

else { // ¸¸½ø³Ì

//sleep(30); //˯Ãß30Ãë cid=wait(NULL);

printf(\ } exit(0); } }

4.2 exec_test.c

#include #include #include main() { int rid;

printf(\2012010948****\\n\ //½«your-sid¸ÄΪÄãµÄѧºÅ rid = fork();

if ( rid < 0 ) printf(\ else if ( rid == 0 ) { // ×Ó½ø³Ì

printf(\ execl(\ }