ʵÑé2 ½ø³Ì¹Û²ìʵÑé ÏÂÔØ±¾ÎÄ

ʵÑé¶þ ½ø³Ì¹Û²ìʵÑ飨¶þ£©£º½ø³ÌµÄ¿ØÖÆ

ʵÑéÄ¿µÄ

1¡¢ÁË½â½ø³Ì´´½¨ºó¶Ô½ø³Ì¿ØÖƵÄϵͳµ÷Ó㬿ÉʵÏÖ¶Ô½ø³ÌµÄÓÐЧ¿ØÖÆ 2¡¢ÕÆÎÕ½ø³ÌµÄ˯Ãß¡¢Í¬²½¡¢³·ÏûµÈ½ø³Ì¿ØÖÆ·½·¨

ʵÑéÄÚÈÝ

1¡¢Í¨¹ýÏà¹ØÃüÁ¶Ô½ø³ÌµÄ״̬½øÐпØÖÆ¡£

2¡¢±àд³ÌÐò£¬Ê¹ÓÃfork( )´´½¨Ò»¸ö×Ó½ø³Ì¡£Ê¹ÓÃÏà¹ØµÄϵͳµ÷ÓÿØÖƽø³ÌµÄ״̬¡£¹Û²ì²¢·ÖÎö¶à½ø³ÌµÄÖ´ÐдÎÐò¼°×´Ì¬×ª»»¡£

ʵÑé»ù´¡

Ò»¡¢½ø³ÌµÄ¿ØÖÆ

½ø³ÌÒò´´½¨¶ø´æÔÚ£¬ÒòÖ´ÐÐÍê³É»òÒì³£Ô­Òò¶øÖÕÖ¹.ÔÚ½ø³ÌµÄÉúÃüÖÜÆÚÖУ¬½ø³ÌÔÚÄÚ´æÖÐÓÐÈýÖÖ»ù±¾×´Ì¬:¾ÍÐ÷£¬Ö´ÐУ¬×èÈû.½ø³Ì״̬µÄת»»ÊÇͨ¹ý½ø³Ì¿ØÖÆÔ­ÓïÀ´ÊµÏֵġ£

Linux²Ù×÷ϵͳÌṩÁËÏàÓ¦¹¦ÄܵÄϵͳµ÷Óü°ÃüÁÀ´ÊµÏÖÓû§²ãµÄ½ø³Ì¿ØÖÆ¡£

¶þ¡¢Ïà¹ØµÄÃüÁî

£¨1£©Ë¯ÃßÖ¸¶¨Ê±¼ä Ö´Ðиñʽ£º# sleep x xΪָ¶¨Ë¯ÃßµÄÃëÊý¡£ £¨2£©½áÊø»òÖÕÖ¹½ø³Ì kill

Ö´Ðиñʽ£º# kill [-9] PID £¨PIDΪÀûÓÃpsÃüÁîËù²é³öµÄprocess ID£© Àý£º kill -9 456 ÖÕÖ¹process ID Ϊ456µÄprocess £¨3£©ºǫ́£¨background£©Ö´ÐÐprocess commandµÄÃüÁî Ö´Ðиñʽ£º# command & £¨ÔÚÃüÁîºó¼ÓÉÏ &£© Àý£º gcc file1 & ÔÚºǫ́±àÒëfile1.c

×¢Ò⣺°´ÏÂ^Z£¬ÔÝÍ£ÕýÔÚÖ´ÐеÄprocess¡£¼üÈ롱bg¡±£¬½«ËùÔÝÍ£µÄprocessÖÃÈëbackgroundÖмÌÐøÖ´ÐС£ Àý£º# gcc file1 & ^Z stopped # bg

£¨4£©²é¿´ÕýÔÚbackgroundÖÐÖ´ÐеÄprocess Ö´Ðиñʽ£º# jobs

£¨5£©½áÊø»òÖÕÖ¹ÔÚbackgroundÖеĽø³Ì kill Ö´Ðиñʽ£º# kill %n

Àý£º kill %1 ÖÕÖ¹ÔÚbackgroundÖеĵÚÒ»¸öjob kill %2 ÖÕÖ¹ÔÚbackgroundÖеĵڶþ¸öjob

Èý¡¢Ïà¹ØµÄϵͳµ÷ÓÃ

ÔÚLINUXÖÐfork( )ÊÇÒ»¸ö·Ç³£ÓÐÓõÄϵͳµ÷Ó㬵«ÔÚLINUXÖн¨Á¢½ø³Ì³ýÁËfork( )Ö®Í⣬Ҳ¿ÉÓÃÓëfork( ) ÅäºÏʹÓõÄexec( )¡£

1¡¢exec( )ϵÁÐ

ϵͳµ÷ÓÃexec( )ϵÁУ¬Ò²¿ÉÓÃÓÚгÌÐòµÄÔËÐС£fork( )Ö»Êǽ«¸¸½ø³ÌµÄÓû§¼¶ÉÏÏÂÎÄ¿½±´µ½Ð½ø³ÌÖУ¬¶øexec( )ϵÁпÉÒÔ½«Ò»¸ö¿ÉÖ´ÐеĶþ½øÖÆÎļþ¸²¸ÇÔÚнø³ÌµÄÓû§¼¶ÉÏÏÂÎĵĴ洢¿Õ¼äÉÏ£¬ÒÔ¸ü¸Äнø³ÌµÄÓû§¼¶ÉÏÏÂÎÄ¡£exec( )ϵÁÐÖеÄϵͳµ÷Óö¼Íê³ÉÏàͬµÄ¹¦ÄÜ£¬ËüÃǰÑÒ»¸öгÌÐò×°ÈëÄڴ棬À´¸Ä±äµ÷Óýø³ÌµÄÖ´ÐдúÂ룬´Ó¶øÐγÉнø³Ì¡£Èç¹ûexec( )µ÷Óóɹ¦£¬µ÷Óýø³Ì½«±»¸²¸Ç£¬È»ºó´ÓгÌÐòµÄÈë¿Ú¿ªÊ¼Ö´ÐУ¬ÕâÑù¾Í²úÉúÁËÒ»¸öнø³Ì£¬Ð½ø³ÌµÄ½ø³Ì±êʶ·ûid Óëµ÷Óýø³ÌÏàͬ¡£

exec( )ûÓн¨Á¢Ò»¸öÓëµ÷Óýø³Ì²¢·¢µÄ×Ó½ø³Ì£¬¶øÊÇÓÃнø³ÌÈ¡´úÁËÔ­À´½ø³Ì¡£ËùÒÔexec( )µ÷Óóɹ¦ºó£¬Ã»ÓÐÈκÎÊý¾Ý·µ»Ø£¬ÕâÓëfork( )²»Í¬¡£exec( )ϵÁÐϵͳµ÷ÓÃÔÚLINUXϵͳ¿âunistd.hÖУ¬¹²ÓÐexecl¡¢execlp¡¢execle¡¢execv¡¢execvpÎå¸ö£¬Æä»ù±¾¹¦ÄÜÏàͬ£¬Ö»ÊÇÒÔ²»Í¬µÄ·½Ê½À´¸ø³ö²ÎÊý¡£

Ò»ÖÖÊÇÖ±½Ó¸ø³ö²ÎÊýµÄÖ¸Õ룬È磺 int execl(path,arg0[,arg1,...argn],0); char *path,*arg0,*arg1,...,*argn; ÁíÒ»ÖÖÊǸø³öÖ¸Ïò²ÎÊý±íµÄÖ¸Õ룬È磺 int execv(path,argv); char *path,*argv[ ];

ÁíÍ⣬ÔÚlinuxÖУ¬³öÓÚ°²È«µÄ¿¼ÂÇ£¬ÏÞÖÆÁËexec()¿ÉÒÔÖ´ÐеÄгÌÐòµÄλÖÃΪϵͳָ¶¨µÄËÑË÷·¾¶¡£

ÀýÈ磺

execl(¡°/bin/ls¡±,¡±ls¡±,NULL); execl(¡°/usr/bin/gcc¡±,¡±-v¡±,NULL);

execl(¡°./test¡±,NULL); //µ±Ç°Ä¿Â¼ÏµĿÉÖ´ÐгÌÐò 2¡¢exec( )ºÍfork( )ÁªºÏʹÓÃ

ϵͳµ÷ÓÃexecºÍfork( )ÁªºÏʹÓÃÄÜΪ³ÌÐò¿ª·¢ÌṩÓÐÁ¦Ö§³Ö¡£ÓÃfork( )½¨Á¢×Ó½ø³Ì£¬È»ºóÔÚ×Ó½ø³ÌÖÐʹÓÃexec( )£¬ÕâÑù¾ÍʵÏÖÁ˸¸½ø³ÌÓëÒ»¸öÓëËüÍêÈ«²»Í¬×Ó½ø³ÌµÄ²¢·¢Ö´ÐС£

Ò»°ã£¬wait¡¢execÁªºÏʹÓõÄÄ£ÐÍΪ£º int status; ............

if (fork( )= =0) {

...........; execl(...); ...........; }

wait(&status); 3¡¢wait£¨ £©

µÈ´ý×Ó½ø³ÌÔËÐнáÊø¡£Èç¹û×Ó½ø³ÌûÓÐÍê³É£¬¸¸½ø³ÌÒ»Ö±µÈ´ý¡£wait( )½«µ÷Óýø³Ì¹ÒÆð£¬Ö±ÖÁÆä×Ó½ø³ÌÒòÔÝÍ£»òÖÕÖ¹¶ø·¢À´ÈíÖжÏÐźÅΪֹ¡£Èç¹ûÔÚwait( )ǰÒÑÓÐ×Ó½ø³ÌÔÝÍ£»òÖÕÖ¹£¬Ôòµ÷Óýø³Ì×öÊʵ±´¦Àíºó±ã·µ»Ø¡£wait( )¸øÎÒÃÇÌṩÁËÒ»ÖÖʵÏÖ½ø³Ìͬ²½µÄ¼òµ¥·½·¨¡£

ϵͳµ÷Óøñʽ£º int wait(status) int *status;

ÆäÖУ¬statusÊÇÓû§¿Õ¼äµÄµØÖ·¡£ËüµÄµÍ8λ·´Ó¦×Ó½ø³Ì״̬£¬Îª0±íʾ×Ó½ø³ÌÕý³£½áÊø£¬·Ç0Ôò±íʾ³öÏÖÁ˸÷ÖÖ¸÷ÑùµÄÎÊÌ⣻¸ß8λÔò´ø»ØÁËexit( )µÄ·µ»ØÖµ¡£exit( )·µ»ØÖµÓÉϵͳ¸ø³ö¡£

ºËÐĶÔwait( )×÷ÒÔÏ´¦Àí£º

£¨1£©Ê×ÏȲéÕÒµ÷Óýø³ÌÊÇ·ñÓÐ×Ó½ø³Ì£¬ÈôÎÞ£¬Ôò·µ»Ø³ö´íÂ룻

£¨2£©ÈôÕÒµ½Ò»´¦ÓÚ¡°½©ËÀ״̬¡±µÄ×Ó½ø³Ì£¬Ôò½«×Ó½ø³ÌµÄÖ´ÐÐʱ¼ä¼Óµ½¸¸½ø³ÌµÄÖ´ÐÐʱ¼äÉÏ£¬²¢ÊÍ·Å×Ó½ø³ÌµÄ½ø³Ì±íÏ

£¨3£©ÈôδÕÒµ½´¦ÓÚ¡°½©ËÀ״̬¡±µÄ×Ó½ø³Ì£¬Ôòµ÷Óýø³Ì±ãÔڿɱ»ÖжϵÄÓÅÏȼ¶ÉÏ˯Ãߣ¬µÈ´ýÆä×Ó½ø³Ì·¢À´ÈíÖжÏÐźÅʱ±»»½ÐÑ¡£

4¡¢sleep£¨ £© ˯ÃßÖ¸¶¨Ê±¼ä¡£ ϵͳµ÷Óøñʽ£º void sleep(int second)

ÆäÖУ¬secondΪָ¶¨Ë¯ÃßµÄÃëÊý¡£¸Ãº¯ÊýʹµÃµ±Ç°½ø³Ì×ÔÎÒ×èÈûsecondÃ룬ÓÉÖ´ÐÐ̬ת»»³É×èÈû̬£¬Ö±µ½ÏµÍ³»½ÐÑ¡£

5¡¢exit£¨ £© ÖÕÖ¹½ø³ÌµÄÖ´ÐС£ ϵͳµ÷Óøñʽ£º void exit(status) int status;

ÆäÖУ¬statusÊÇ·µ»Ø¸ø¸¸½ø³ÌµÄÒ»¸öÕûÊý£¬ÒÔ±¸²é¿¼¡£

ΪÁ˼°Ê±»ØÊÕ½ø³ÌËùÕ¼ÓõÄ×ÊÔ´²¢¼õÉÙ¸¸½ø³ÌµÄ¸ÉÔ¤£¬LINUX/LINUXÀûÓÃexit( )À´ÊµÏÖ½ø³ÌµÄ×ÔÎÒÖÕÖ¹£¬Í¨³£¸¸½ø³ÌÔÚ´´½¨×Ó½ø³Ìʱ£¬Ó¦ÔÚ½ø³ÌµÄĩβ°²ÅÅÒ»Ìõexit( )£¬Ê¹×Ó½ø³Ì×ÔÎÒÖÕÖ¹¡£exit(0)±íʾ½ø³ÌÕý³£ÖÕÖ¹£¬exit(1)±íʾ½ø³ÌÔËÐÐÓÐ´í£¬Òì³£ÖÕÖ¹¡£

Èç¹ûµ÷Óýø³ÌÔÚÖ´ÐÐexit( )ʱ£¬Æä¸¸½ø³ÌÕýÔڵȴýËüµÄÖÕÖ¹£¬Ôò¸¸½ø³Ì¿ÉÁ¢¼´µÃµ½Æä·µ»ØµÄÕûÊý¡£ºËÐÄÐëΪexit( )Íê³ÉÒÔϲÙ×÷£º

£¨1£©¹Ø±ÕÈíÖÐ¶Ï £¨2£©»ØÊÕ×ÊÔ´ £¨3£©Ð´¼ÇÕÊÐÅÏ¢

£¨4£©Öýø³ÌΪ¡°½©ËÀ״̬¡±

ʵÑéÖ¸µ¼

1¡¢²ÎÕղο¼³ÌÐò±àд³ÌÐò£¬ÆäÖи¸½ø³ÌÎÞÏÞÑ­»·¡£ÔÚºǫִ́ÐиóÌÐò¡£ [root@localhost lab2]# vi fork_1.c [root@localhost lab2]# gcc fork_1.c -o def [root@localhost lab2]# ./def & [1] 3620 def fork_1.c

×Ó½ø³ÌÓÃexec( )×°ÈëÃüÁîls £¬exec( )ºó£¬×Ó½ø³ÌµÄ´úÂë±»lsµÄ´úÂëÈ¡´ú£¬Õâʱ×Ó½ø³ÌµÄPCÖ¸ÏòlsµÄµÚ1ÌõÓï¾ä£¬¿ªÊ¼Ö´ÐÐlsµÄÃüÁî´úÂë¡£

Èç¹ûÊÇÏÂÃæÕâÖÖ£º

[root@localhost lab2]# ./def

ÔòÖ»ÓÐÓÃ^cÇ¿ÐÐÖÕÖ¹¸¸½ø³Ì£¬ÔòÔÚµÚ2²½½á¹û¾Í²»Í¬ÁË£¬¸¸×Ó½ø³Ì¶¼³ÉΪ½©ËÀ½ø³Ì¡£ 2¡¢ÏÔʾµ±Ç°ÖÕ¶ËÉÏÆô¶¯µÄËùÓнø³Ì¡£ [root@localhost lab2]# ps -af

UID PID PPID C STIME TTY TIME CMD root 3620 3126 0 20:11 pts/1 00:00:00 ./def

root 3621 3620 0 20:11 pts/1 00:00:00 [ls ] root 3623 3126 0 20:12 pts/1 00:00:00 ps -af

ÆäÖУ¬¡±¡±ËµÃ÷½ø³Ì¡±ls¡±ÊÇÒ»¸ö½©ËÀ½ø³Ì¡£¸¸½ø³Ì´´½¨Ò»¸ö×Ó½ø³Ìºó£¬¿ÉÒÔÓÃwait()µÈ´ý»ØÊÕÆä×Ó½ø³ÌµÄ×ÊÔ´£¬Ò²¿ÉÒÔÕý³£ÖÕÖ¹ºóÓÉϵͳ»ØÊÕÆä×Ó½ø³ÌµÄ×ÊÔ´¡£¡±./def ¡±¾ÍÊÇ¡±ls¡±µÄ¸¸½ø³Ì¡£¡±./def ¡±½ø³ÌÖУ¬¼ÈûÓеȴý»ØÊÕÆä×Ó½ø³ÌµÄ×ÊÔ´£¬Ò²Ã»ÓÐÕý³£ÖÕÖ¹£¬Òò´ËÔì³É¡±ls¡±³ÉΪһ¸ö½©ËÀ½ø³Ì¡£

3¡¢ÓÃkillÃüÁîÖ±½ÓɱËÀ¸Ã×Ó½ø³Ì£¬¿´¿´ÊÇ·ñÄܹ»³É¹¦£¿ [root@localhost lab2]# kill -9 3621 [root@localhost lab2]# ps -af Ϊʲô²»ÄÜɱËÀ£¿ÒòΪ¸¸½ø³Ì»¹Ã»½áÊø¡£ 4¡¢ÓÃkillÃüÁîɱËÀ¸¸½ø³ÌÖ®ºóÄØ£¿½âÊÍÔ­Òò¡£ [root@localhost lab2]# kill -9 3620 [root@localhost lab2]# ps -af

µ«ÊÇÈç¹û¸¸×Ó½ø³Ì¶¼Òì³£ÖÕÖ¹£¬Ôòshell½ø³Ì½«»ØÊÕÆä×ÊÔ´¡£Init½ø³Ì»ØÊÕËùÓн©ËÀ½ø³Ì×ÊÔ´£¿

5¡¢Ð޸ijÌÐòfork_1.c£¬ÔÚ¸¸½ø³ÌÖ´ÐС± while(1)¡±Ö®Ç°£¬Ìí¼Ó´úÂ롱wait(0);¡±¡£ÔÚºǫִ́ÐиóÌÐò¡£ÏÔʾµ±Ç°ÖÕ¶ËÉÏÆô¶¯µÄËùÓнø³Ì¡£½âÊÍÔ­Òò¡£

6¡¢ÐÞ¸ÄÒÔÉϳÌÐò£¬ÔÚ×Ó½ø³ÌÖ´ÐС± printf(¡°Is son:\\n¡±);¡±Ö®Ç°Ìí¼Ó´úÂë ¡°sleep(1);¡±¡£¹Û²ì¶à½ø³ÌµÄÖ´ÐÐÐòÁУ¬½âÊÍÔ­Òò¡£

7¡¢Ñ¡×÷£ºÐ޸ġ°¶à½ø³Ì»·¾³ÊµÑ顱ÖеIJο¼³ÌÐò£¬ÔÚ¡°×Ó½ø³Ì1¶Î¡±Ç°Ìí¼Ó´úÂë¡°sleep(2);¡±£¬ÔÚ¡°¸¸½ø³Ì¶Îb¡±Ç°Ìí¼Ó´úÂë¡°wait(0); wait(0);¡±¡£¹Û²ì¶à½ø³ÌµÄÖ´ÐÐÐòÁУ¬½âÊÍÔ­Òò¡£ÊÔÒ»ÏÂ×÷ÆäËüÐ޸ĺóµÄЧ¹û£¿

²Î¿¼³ÌÐò

#include

#include main( ) {

int pid;

pid=fork( ); /*´´½¨×Ó½ø³Ì*/

switch(pid)

{

case -1: /*´´½¨Ê§°Ü*/ printf(\ exit(1);

case 0: /*×Ó½ø³Ì*/ printf(¡°Is son:\\n¡±);

execl(\

printf(\ exit(1);

default: /*¸¸½ø³Ì*/ printf(\ while(1) sleep(1); exit(0); }

}

˼¿¼Ìâ

£¨1£©¿ÉÖ´ÐÐÎļþ¼ÓÔØÊ±½øÐÐÁËÄÄЩ´¦Àí£¿²Î¿¼³ÌÐòÖУ¬Ê²Ã´Ê±ºòÖ´ÐÐÓï¾ä ¡±printf(\fail!\\n\¡± £¿

£¨2£©ÊµÑéÖ¸µ¼ÖеĵÚ5²½£¬wait( )ÊÇÈçºÎʵÏÖ½ø³Ìͬ²½µÄ£¿ £¨3£©ÊµÑéÖ¸µ¼ÖеĵÚ6²½£¬sleep(1)ΪʲôÄܵ¼Ö½ø³ÌÇл»£¿

´´½¨½ø³Ì£º

#include #include #include #include #include #include #include

int main() { pid_t pid; if(-1 == (pid = fork())) { printf(\ return 0; } if(0 == pid) { printf(\ } else { printf(\ } return 0; }

ʹÓÃwaitº¯ÊýÈø¸½ø³ÌµÈ´ý×Ó½ø³ÌÔËÐнáÊøºó²Å¿ªÊ¼ÔËÐС£×¢Ò⣬ΪÁËÖ¤Ã÷¸¸½ø³ÌȷʵÊǵȴý×Ó½ø³ÌÔËÐнáÊøºó²Å¼ÌÐøÔËÐеģ¬ÎÒÃÇʹÓÃÁËsleepº¯Êý¡£µ«ÊÇ£¬ÔÚlinuxÏÂÃæ£¬sleepº¯ÊýµÄ²ÎÊýÊÇÃ룬¶øwindowsÏÂÃæsleepµÄº¯Êý²ÎÊýÊǺÁÃë¡£ #include #include #include

int main(int argc, char* argv[]) {

pid_t pid;

pid = fork();

if(0 == pid) {

printf(\ sleep(5); } else {

wait(NULL);

printf(\ }

return 1;