日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

僵尸进程(转)

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 僵尸进程(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前面的文章中,我們已經(jīng)了解了父進(jìn)程和子進(jìn) 程的概念,并已經(jīng)掌握了系統(tǒng)調(diào)用exit的用法,但可能很少有人意識(shí)到,在一個(gè)進(jìn)程調(diào)用了exit之后,該進(jìn)程并非馬上就消失掉,而是留下一個(gè)稱為僵尸進(jìn) 程(zombie)的數(shù)據(jù)結(jié)構(gòu)。在linux進(jìn)程的5種狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被 調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。從這點(diǎn)來(lái)看,僵尸進(jìn)程雖然有 一個(gè)很酷的名字,但它的影響力遠(yuǎn)遠(yuǎn)抵不上那些真正的僵尸兄弟,真正的僵尸總能令人感到恐怖,而僵尸進(jìn)程卻除了留下一些供人憑吊的信息,對(duì)系統(tǒng)毫無(wú)作用。
  
  也許讀者們還對(duì)這個(gè)新概念比較好奇,那就讓我們來(lái)看一眼linux里的僵尸進(jìn)程究竟長(zhǎng)什么樣子。
  
  當(dāng)一個(gè)進(jìn)程已退出,但其父進(jìn)程還沒(méi)有調(diào)用系統(tǒng)調(diào)用wait(稍后介紹)對(duì)其進(jìn)行收集之前的這段時(shí)間里,它會(huì)一直保持僵尸狀態(tài),利用這個(gè)特點(diǎn),我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的小程序:
  
  /* zombie.c */
  #include
  #include
  main()
  {
   pid_t pid;
  
   pid=fork();
  
   if(pid<0) /* 如果出錯(cuò) */
   printf("error occurred!n");
   else if(pid==0) /* 如果是子進(jìn)程 */
   exit(0);
   else /* 如果是父進(jìn)程 */
   sleep(60); /* 休眠60秒,這段時(shí)間里,父進(jìn)程什么也干不了 */
   wait(null); /* 收集僵尸進(jìn)程 */
  }
  
  
  
  sleep的作用是讓進(jìn)程休眠指定的秒數(shù),在這60秒內(nèi),子進(jìn)程已經(jīng)退出,而父進(jìn)程正忙著睡覺(jué),不可能對(duì)它進(jìn)行收集,這樣,我們就能保持子進(jìn)程60秒的僵尸狀態(tài)。
  
  編譯這個(gè)程序:
  
  $ cc zombie.c -o zombie
  
  
  
  后臺(tái)運(yùn)行程序,以使我們能夠執(zhí)行下一條命令:
  
  $ ./zombie &
  [1] 1577
  
  
  
  列一下系統(tǒng)內(nèi)的進(jìn)程:
  
  $ ps -ax
  ... ...
   1177 pts/0 s 0:00 -bash
   1577 pts/0 s 0:00 ./zombie
   1578 pts/0 z 0:00 [zombie ]
   1579 pts/0 r 0:00 ps -ax
  
  
  
  看到中間的“z”了嗎?那就是僵尸進(jìn)程的標(biāo)志,它表示1578號(hào)進(jìn)程現(xiàn)在就是一個(gè)僵尸進(jìn)程。
  
   我們已經(jīng)學(xué)習(xí)了系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵尸進(jìn)程,并不能將其完全銷毀。僵尸進(jìn)程雖然對(duì)其他進(jìn)程 幾乎沒(méi)有什么影響,不占用cpu時(shí)間,消耗的內(nèi)存也幾乎可以忽略不計(jì),但有它在那里呆著,還是讓人覺(jué)得心里很不舒服。而且linux系統(tǒng)中進(jìn)程數(shù)目是有限 制的,在一些特殊的情況下,如果存在太多的僵尸進(jìn)程,也會(huì)影響到新進(jìn)程的產(chǎn)生。那么,我們?cè)撊绾蝸?lái)消滅這些僵尸進(jìn)程呢?
  
  先來(lái)了解 一下僵尸進(jìn)程的來(lái)由,我們知道,linux和unix總有著剪不斷理還亂的親緣關(guān)系,僵尸進(jìn)程的概念也是從unix上繼承來(lái)的,而unix的先驅(qū)們?cè)O(shè)計(jì)這 個(gè)東西并非是因?yàn)殚e來(lái)無(wú)聊想煩煩其他的程序員。僵尸進(jìn)程中保存著很多對(duì)程序員和系統(tǒng)管理員非常重要的信息,首先,這個(gè)進(jìn)程是怎么死亡的?是正常退出呢,還 是出現(xiàn)了錯(cuò)誤,還是被其它進(jìn)程強(qiáng)迫退出的?其次,這個(gè)進(jìn)程占用的總系統(tǒng)cpu時(shí)間和總用戶cpu時(shí)間分別是多少?發(fā)生頁(yè)錯(cuò)誤的數(shù)目和收到信號(hào)的數(shù)目。這些 信息都被存儲(chǔ)在僵尸進(jìn)程中,試想如果沒(méi)有僵尸進(jìn)程,進(jìn)程一退出,所有與之相關(guān)的信息都立刻歸于無(wú)形,而此時(shí)程序員或系統(tǒng)管理員需要用到,就只好干瞪眼了。
  
  那么,我們?nèi)绾问占@些信息,并終結(jié)這些僵尸進(jìn)程呢?就要靠我們下面要講到的waitpid調(diào)用和wait調(diào)用。這兩者的作用都是收集僵尸進(jìn)程留下的信息,同時(shí)使這個(gè)進(jìn)程徹底消失。下面就對(duì)這兩個(gè)調(diào)用分別作詳細(xì)介紹。
  
  
  wait
  
  
  簡(jiǎn)介
  
  wait的函數(shù)原型是:
  
  #include /* 提供類型pid_t的定義 */
  #include
   pid_t wait(int *status)
  
  
  
   進(jìn)程一旦調(diào)用了wait,就立即阻塞自己,由wait自動(dòng)分析是否當(dāng)前進(jìn)程的某個(gè)子進(jìn)程已經(jīng)退出,如果讓它找到了這樣一個(gè)已經(jīng)變成僵尸的子進(jìn) 程,wait就會(huì)收集這個(gè)子進(jìn)程的信息,并把它徹底銷毀后返回;如果沒(méi)有找到這樣一個(gè)子進(jìn)程,wait就會(huì)一直阻塞在這里,直到有一個(gè)出現(xiàn)為止。
  
  參數(shù)status用來(lái)保存被收集進(jìn)程退出時(shí)的一些狀態(tài),它是一個(gè)指向int類型的指針。但如果我們對(duì)這個(gè)子進(jìn)程是如何死掉的毫不在意,只想把這個(gè)僵尸進(jìn)程消滅掉,(事實(shí)上絕大多數(shù)情況下,我們都會(huì)這樣想),我們就可以設(shè)定這個(gè)參數(shù)為null,就象下面這樣:
  
  pid = wait(null);
  
  
  
  如果成功,wait會(huì)返回被收集的子進(jìn)程的進(jìn)程id,如果調(diào)用進(jìn)程沒(méi)有子進(jìn)程,調(diào)用就會(huì)失敗,此時(shí)wait返回-1,同時(shí)errno被置為echild。
  
  實(shí)戰(zhàn)
  
  下面就讓我們用一個(gè)例子來(lái)實(shí)戰(zhàn)應(yīng)用一下wait調(diào)用,程序中用到了系統(tǒng)調(diào)用fork,如果你對(duì)此不大熟悉或已經(jīng)忘記了,請(qǐng)參考上一篇文章進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用(1)。
  
  /* wait1.c */
  #include
  #include
  #include
  #include
  main()
  {
   pid_t pc,pr;
  
   pc=fork();
  
   if(pc<0) /* 如果出錯(cuò) */
   printf("error ocurred!n");
   else if(pc==0){ /* 如果是子進(jìn)程 */
   printf("this is child process with pid of %dn",getpid());
   sleep(10); /* 睡眠10秒鐘 */
   }
   else{ /* 如果是父進(jìn)程 */
   pr=wait(null); /* 在這里等待 */
   printf("i catched a child process with pid of %dn"),pr);
   }
   exit(0);
  }
  
  
  
  編譯并運(yùn)行:
  
  $ cc wait1.c -o wait1
  $ ./wait1
  this is child process with pid of 1508
  i catched a child process with pid of 1508
  
  
  
   可以明顯注意到,在第2行結(jié)果打印出來(lái)前有10秒鐘的等待時(shí)間,這就是我們?cè)O(shè)定的讓子進(jìn)程睡眠的時(shí)間,只有子進(jìn)程從睡眠中蘇醒過(guò)來(lái),它才能正常退出,也 就才能被父進(jìn)程捕捉到。其實(shí)這里我們不管設(shè)定子進(jìn)程睡眠的時(shí)間有多長(zhǎng),父進(jìn)程都會(huì)一直等待下去,讀者如果有興趣的話,可以試著自己修改一下這個(gè)數(shù)值,看看 會(huì)出現(xiàn)怎樣的結(jié)果。
  
  參數(shù)status
  
  如果參數(shù)status的值不是null,wait就會(huì)把子進(jìn)程退出 時(shí)的狀態(tài)取出并存入其中,這是一個(gè)整數(shù)值(int),指出了子進(jìn)程是正常退出還是被非正常結(jié)束的(一個(gè)進(jìn)程也可以被其他進(jìn)程用信號(hào)結(jié)束,我們將在以后的文 章中介紹),以及正常結(jié)束時(shí)的返回值,或被哪一個(gè)信號(hào)結(jié)束的等信息。由于這些信息被存放在一個(gè)整數(shù)的不同二進(jìn)制位中,所以用常規(guī)的方法讀取會(huì)非常麻煩,人 們就設(shè)計(jì)了一套專門的宏(macro)來(lái)完成這項(xiàng)工作,下面我們來(lái)學(xué)習(xí)一下其中最常用的兩個(gè):
  
  ● wifexited(status)
  
  這個(gè)宏用來(lái)指出子進(jìn)程是否為正常退出的,如果是,它會(huì)返回一個(gè)非零值。
  
  (請(qǐng)注意,雖然名字一樣,這里的參數(shù)status并不同于wait唯一的參數(shù)--指向整數(shù)的指針status,而是那個(gè)指針?biāo)赶虻恼麛?shù),切記不要搞混了。)
  
  ● wexitstatus(status)
  
   當(dāng)wifexited返回非零值時(shí),我們可以用這個(gè)宏來(lái)提取子進(jìn)程的返回值,如果子進(jìn)程調(diào)用exit(5)退 出,wexitstatus(status)就會(huì)返回5;如果子進(jìn)程調(diào)用exit(7),wexitstatus(status)就會(huì)返回7。請(qǐng)注意,如 果進(jìn)程不是正常退出的,也就是說(shuō),wifexited返回0,這個(gè)值就毫無(wú)意義。
  
  下面通過(guò)例子來(lái)實(shí)戰(zhàn)一下我們剛剛學(xué)到的內(nèi)容:
  
  /* wait2.c */
  #include
  #include
  #include
  main()
  {
   int status;
   pid_t pc,pr;
   pc=fork();
   if(pc<0) /* 如果出錯(cuò) */
   printf("error ocurred!n");
   else if(pc==0){ /* 子進(jìn)程 */
   printf("this is child process with pid of %d.n",getpid());
   exit(3); /* 子進(jìn)程返回3 */
   }
   else{ /* 父進(jìn)程 */
   pr=wait(&status);
  
   if(wifexited(status)){ /* 如果wifexited返回非零值 */
   printf("the child process %d exit normally.n",pr);
   printf("the return code is %d.n",wexitstatus(status));
   }else /* 如果wifexited返回零 */
   printf("the child process %d exit abnormally.n",pr);
   }
  
  }
  
  
  
  編譯并運(yùn)行:
  
  $ cc wait2.c -o wait2
  $ ./wait2
  this is child process with pid of 1538.
  the child process 1538 exit normally.
  the return code is 3.
  
  
  
  父進(jìn)程準(zhǔn)確捕捉到了子進(jìn)程的返回值3,并把它打印了出來(lái)。
  
  當(dāng)然,處理進(jìn)程退出狀態(tài)的宏并不止這兩個(gè),但它們當(dāng)中的絕大部分在平時(shí)的編程中很少用到,就也不在這里浪費(fèi)篇幅介紹了,有興趣的讀者可以自己參閱linux man pages去了解它們的用法。
  
  進(jìn)程同步
  
   有時(shí)候,父進(jìn)程要求子進(jìn)程的運(yùn)算結(jié)果進(jìn)行下一步的運(yùn)算,或者子進(jìn)程的功能是為父進(jìn)程提供了下一步執(zhí)行的先決條件(如:子進(jìn)程建立文件,而父進(jìn)程寫(xiě)入數(shù) 據(jù)),此時(shí)父進(jìn)程就必須在某一個(gè)位置停下來(lái),等待子進(jìn)程運(yùn)行結(jié)束,而如果父進(jìn)程不等待而直接執(zhí)行下去的話,可以想見(jiàn),會(huì)出現(xiàn)極大的混亂。這種情況稱為進(jìn)程 之間的同步,更準(zhǔn)確地說(shuō),這是進(jìn)程同步的一種特例。進(jìn)程同步就是要協(xié)調(diào)好2個(gè)以上的進(jìn)程,使之以安排好地次序依次執(zhí)行。解決進(jìn)程同步問(wèn)題有更通用的方法, 我們將在以后介紹,但對(duì)于我們假設(shè)的這種情況,則完全可以用wait系統(tǒng)調(diào)用簡(jiǎn)單的予以解決。請(qǐng)看下面這段程序:
  
  #include
  #include
  main()
  {
   pid_t pc, pr;
   int status;
   pc=fork();
   if(pc<0)
   printf("error occured on forking.n");
   else if(pc==0){
   /* 子進(jìn)程的工作 */
   exit(0);
   }else{
   /* 父進(jìn)程的工作 */
   pr=wait(&status);
   /* 利用子進(jìn)程的結(jié)果 */
   }
  }
  
  
  
   這段程序只是個(gè)例子,不能真正拿來(lái)執(zhí)行,但它卻說(shuō)明了一些問(wèn)題,首先,當(dāng)fork調(diào)用成功后,父子進(jìn)程各做各的事情,但當(dāng)父進(jìn)程的工作告一段落,需要用 到子進(jìn)程的結(jié)果時(shí),它就停下來(lái)調(diào)用wait,一直等到子進(jìn)程運(yùn)行結(jié)束,然后利用子進(jìn)程的結(jié)果繼續(xù)執(zhí)行,這樣就圓滿地解決了我們提出的進(jìn)程同步問(wèn)題。
  
  
  waitpid
  
  
  簡(jiǎn)介
  
  waitpid系統(tǒng)調(diào)用在linux函數(shù)庫(kù)中的原型是:
  
  #include /* 提供類型pid_t的定義 */
  #include
  pid_t waitpid(pid_t pid,int *status,int options)
  
  
  
  從本質(zhì)上講,系統(tǒng)調(diào)用waitpid和wait的作用是完全相同的,但waitpid多出了兩個(gè)可由用戶控制的參數(shù)pid和options,從而為我們編程提供了另一種更靈活的方式。下面我們就來(lái)詳細(xì)介紹一下這兩個(gè)參數(shù):
  
  ● pid
  
  從參數(shù)的名字pid和類型pid_t中就可以看出,這里需要的是一個(gè)進(jìn)程id。但當(dāng)pid取不同的值時(shí),在這里有不同的意義。
  
  pid>0時(shí),只等待進(jìn)程id等于pid的子進(jìn)程,不管其它已經(jīng)有多少子進(jìn)程運(yùn)行結(jié)束退出了,只要指定的子進(jìn)程還沒(méi)有結(jié)束,waitpid就會(huì)一直等下去。
  
  pid=-1時(shí),等待任何一個(gè)子進(jìn)程退出,沒(méi)有任何限制,此時(shí)waitpid和wait的作用一模一樣。
  
  pid=0時(shí),等待同一個(gè)進(jìn)程組中的任何子進(jìn)程,如果子進(jìn)程已經(jīng)加入了別的進(jìn)程組,waitpid不會(huì)對(duì)它做任何理睬。
  
  pid<-1時(shí),等待一個(gè)指定進(jìn)程組中的任何子進(jìn)程,這個(gè)進(jìn)程組的id等于pid的絕對(duì)值。
  
  ● options
  
  options提供了一些額外的選項(xiàng)來(lái)控制waitpid,目前在linux中只支持wnohang和wuntraced兩個(gè)選項(xiàng),這是兩個(gè)常數(shù),可以用"|"運(yùn)算符把它們連接起來(lái)使用,比如:
  
  ret=waitpid(-1,null,wnohang | wuntraced);
  
  
  
  如果我們不想使用它們,也可以把options設(shè)為0,如:
  
  ret=waitpid(-1,null,0);
  
  
  
  如果使用了wnohang參數(shù)調(diào)用waitpid,即使沒(méi)有子進(jìn)程退出,它也會(huì)立即返回,不會(huì)像wait那樣永遠(yuǎn)等下去。
  
  而wuntraced參數(shù),由于涉及到一些跟蹤調(diào)試方面的知識(shí),加之極少用到,這里就不多費(fèi)筆墨了,有興趣的讀者可以自行查閱相關(guān)材料。
  
  看到這里,聰明的讀者可能已經(jīng)看出端倪了--wait不就是經(jīng)過(guò)包裝的waitpid嗎?沒(méi)錯(cuò),察看<內(nèi)核源碼目錄>/include/unistd.h文件349-352行就會(huì)發(fā)現(xiàn)以下程序段:
  
  static inline pid_t wait(int * wait_stat)
  {
   return waitpid(-1,wait_stat,0);
  }
  
  
  
  返回值和錯(cuò)誤
  
  waitpid的返回值比wait稍微復(fù)雜一些,一共有3種情況:
  
  ● 當(dāng)正常返回的時(shí)候,waitpid返回收集到的子進(jìn)程的進(jìn)程id;
  
  ● 如果設(shè)置了選項(xiàng)wnohang,而調(diào)用中waitpid發(fā)現(xiàn)沒(méi)有已退出的子進(jìn)程可收集,則返回0;
  
  ● 如果調(diào)用中出錯(cuò),則返回-1,這時(shí)errno會(huì)被設(shè)置成相應(yīng)的值以指示錯(cuò)誤所在;
  
  當(dāng)pid所指示的子進(jìn)程不存在,或此進(jìn)程存在,但不是調(diào)用進(jìn)程的子進(jìn)程,waitpid就會(huì)出錯(cuò)返回,這時(shí)errno被設(shè)置為echild;
  
  /* waitpid.c */
  #include
  #include
  #include
  main()
  {
   pid_t pc, pr;
   pc=fork();
   if(pc<0) /* 如果fork出錯(cuò) */
   printf("error occured on forking.n");
   else if(pc==0){ /* 如果是子進(jìn)程 */
   sleep(10); /* 睡眠10秒 */
   exit(0);
   }
  
   /* 如果是父進(jìn)程 */
   do{
  pr=waitpid(pc, null, wnohang); /* 使用了wnohang參數(shù),waitpid不會(huì)在這里等待 */
  if(pr==0){ /* 如果沒(méi)有收集到子進(jìn)程 */
   printf("no child exitedn");
   sleep(1);
   }
  }while(pr==0); /* 沒(méi)有收集到子進(jìn)程,就回去繼續(xù)嘗試 */
   if(pr==pc)
   printf("successfully get child %dn", pr);
   else
   printf("some error occuredn");
  }
  
  
  
  編譯并運(yùn)行:
  
  $ cc waitpid.c -o waitpid
  $ ./waitpid
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  no child exited
  successfully get child 1526
  
  
  
  父進(jìn)程經(jīng)過(guò)10次失敗的嘗試之后,終于收集到了退出的子進(jìn)程。
  
  因?yàn)檫@只是一個(gè)例子程序,不便寫(xiě)得太復(fù)雜,所以我們就讓父進(jìn)程和子進(jìn)程分別睡眠了10秒鐘和1秒鐘,代表它們分別作了10秒鐘和1秒鐘的工作。父子進(jìn)程都有工作要做,父進(jìn)程利用工作的簡(jiǎn)短間歇察看子進(jìn)程的是否退出,如退出就收集它。
  
   也許有不少讀者從本系列文章一推出就開(kāi)始讀,一直到這里還有一個(gè)很大的疑惑:既然所有新進(jìn)程都是由fork產(chǎn)生的,而且由fork產(chǎn)生的子進(jìn)程和父進(jìn)程 幾乎完全一樣,那豈不是意味著系統(tǒng)中所有的進(jìn)程都應(yīng)該一模一樣了嗎?而且,就我們的常識(shí)來(lái)說(shuō),當(dāng)我們執(zhí)行一個(gè)程序的時(shí)候,新產(chǎn)生的進(jìn)程的內(nèi)容應(yīng)就是程序的 內(nèi)容才對(duì)。是我們理解錯(cuò)了嗎?顯然不是,要解決這些疑惑,就必須提到我們下面要介紹的exec系統(tǒng)調(diào)用。
  
  簡(jiǎn)介
  
  說(shuō)是exec系統(tǒng)調(diào)用,實(shí)際上在linux中,并不存在一個(gè)exec()的函數(shù)形式,exec指的是一組函數(shù),一共有6個(gè),分別是:
  
  #include
  int execl(const char *path, const char *arg, ...);
  int execlp(const char *file, const char *arg, ...);
  int execle(const char *path, const char *arg, ..., char *const envp[]);
  int execv(const char *path, char *const argv[]);
  int execvp(const char *file, char *const argv[]);
  int execve(const char *path, char *const argv[], char *const envp[]);
  
  
  
  其中只有execve是真正意義上的系統(tǒng)調(diào)用,其它都是在此基礎(chǔ)上經(jīng)過(guò)包裝的庫(kù)函數(shù)。
  
  exec函數(shù)族的作用是根據(jù)指定的文件名找到可執(zhí)行文件,并用它來(lái)取代調(diào)用進(jìn)程的內(nèi)容,換句話說(shuō),就是在調(diào)用進(jìn)程內(nèi)部執(zhí)行一個(gè)可執(zhí)行文件。這里的可執(zhí)行文件既可以是二進(jìn)制文件,也可以是任何linux下可執(zhí)行的腳本文件。
  
   與一般情況不同,exec函數(shù)族的函數(shù)執(zhí)行成功后不會(huì)返回,因?yàn)檎{(diào)用進(jìn)程的實(shí)體,包括代碼段,數(shù)據(jù)段和堆棧等都已經(jīng)被新的內(nèi)容取代,只留下進(jìn)程id等一 些表面上的信息仍保持原樣,頗有些神似"三十六計(jì)"中的"金蟬脫殼"。看上去還是舊的軀殼,卻已經(jīng)注入了新的靈魂。只有調(diào)用失敗了,它們才會(huì)返回一個(gè) -1,從原程序的調(diào)用點(diǎn)接著往下執(zhí)行。
  
  現(xiàn)在我們應(yīng)該明白了,linux下是如何執(zhí)行新程序的,每當(dāng)有進(jìn)程認(rèn)為自己不能為系統(tǒng)和擁 護(hù)做出任何貢獻(xiàn)了,他就可以發(fā)揮最后一點(diǎn)余熱,調(diào)用任何一個(gè)exec,讓自己以新的面貌重生;或者,更普遍的情況是,如果一個(gè)進(jìn)程想執(zhí)行另一個(gè)程序,它就 可以fork出一個(gè)新進(jìn)程,然后調(diào)用任何一個(gè)exec,這樣看起來(lái)就好像通過(guò)執(zhí)行應(yīng)用程序而產(chǎn)生了一個(gè)新進(jìn)程一樣。
  
  事實(shí)上第二種 情況被應(yīng)用得如此普遍,以至于linux專門為其作了優(yōu)化,我們已經(jīng)知道,fork會(huì)將調(diào)用進(jìn)程的所有內(nèi)容原封不動(dòng)的拷貝到新產(chǎn)生的子進(jìn)程中去,這些拷貝 的動(dòng)作很消耗時(shí)間,而如果fork完之后我們馬上就調(diào)用exec,這些辛辛苦苦拷貝來(lái)的東西又會(huì)被立刻抹掉,這看起來(lái)非常不劃算,于是人們?cè)O(shè)計(jì)了一種"寫(xiě) 時(shí)拷貝(copy-on-write)"技術(shù),使得fork結(jié)束后并不立刻復(fù)制父進(jìn)程的內(nèi)容,而是到了真正實(shí)用的時(shí)候才復(fù)制,這樣如果下一條語(yǔ)句是 exec,它就不會(huì)白白作無(wú)用功了,也就提高了效率。
  
  稍稍深入
  
  上面6條函數(shù)看起來(lái)似乎很復(fù)雜,但實(shí)際上無(wú)論是作用還是用法都非常相似,只有很微小的差別。在學(xué)習(xí)它們之前,先來(lái)了解一下我們習(xí)以為常的main函數(shù)。
  
  下面這個(gè)main函數(shù)的形式可能有些出乎我們的意料:
  
  int main(int argc, char *argv[], char *envp[])
  
  
  
  它可能與絕大多數(shù)教科書(shū)上描述的都不一樣,但實(shí)際上,這才是main函數(shù)真正完整的形式。
  
   參數(shù)argc指出了運(yùn)行該程序時(shí)命令行參數(shù)的個(gè)數(shù),數(shù)組argv存放了所有的命令行參數(shù),數(shù)組envp存放了所有的環(huán)境變量。環(huán)境變量指的是一組值,從 用戶登錄后就一直存在,很多應(yīng)用程序需要依靠它來(lái)確定系統(tǒng)的一些細(xì)節(jié),我們最常見(jiàn)的環(huán)境變量是path,它指出了應(yīng)到哪里去搜索應(yīng)用程序,如 /bin;home也是比較常見(jiàn)的環(huán)境變量,它指出了我們?cè)谙到y(tǒng)中的個(gè)人目錄。環(huán)境變量一般以字符串"xxx=xxx"的形式存在,xxx表示變量 名,xxx表示變量的值。
  
  值得一提的是,argv數(shù)組和envp數(shù)組存放的都是指向字符串的指針,這兩個(gè)數(shù)組都以一個(gè)null元素表示數(shù)組的結(jié)尾。
  
  我們可以通過(guò)以下這個(gè)程序來(lái)觀看傳到argc、argv和envp里的都是什么東西:
  
  /* main.c */
  int main(int argc, char *argv[], char *envp[])
  {
   printf("n### argc ###n%dn", argc);
   printf("n### argv ###n");
   while(*argv)
   printf("%sn", *(argv++));
   printf("n### envp ###n");
   while(*envp)
   printf("%sn", *(envp++));
   return 0;
  }
  
  
  
  編譯它:
  
  $ cc main.c -o main
  
  
  
  運(yùn)行時(shí),我們故意加幾個(gè)沒(méi)有任何作用的命令行參數(shù):
  
  $ ./main -xx 000
  ### argc ###
  3
  ### argv ###
  ./main
  -xx
  000
  ### envp ###
  pwd=/home/lei
  remotehost=dt.laser.com
  hostname=localhost.localdomain
  qtdir=/usr/lib/qt-2.3.1
  lessopen=|/usr/bin/lesspipe.sh %s
  kdedir=/usr
  user=lei
  ls_colors=
  machtype=i386-redhat-linux-gnu
  mail=/var/spool/mail/lei
  inputrc=/etc/inputrc
  lang=en_us
  logname=lei
  shlvl=1
  shell=/bin/bash
  hosttype=i386
  ostype=linux-gnu
  histsize=1000
  term=ansi
  home=/home/lei
  path=/usr/local/bin:/bin:/usr/bin:/usr/x11r6/bin:/home/lei/bin
  _=./main
  
  
  
  我們看到,程序?qū)ⅰ?/main”作為第1個(gè)命令行參數(shù),所以我們一共有3個(gè)命令行參數(shù)。這可能與大家平時(shí)習(xí)慣的說(shuō)法有些不同,小心不要搞錯(cuò)了。
  
  現(xiàn)在回過(guò)頭來(lái)看一下exec函數(shù)族,先把注意力集中在execve上:
  
  int execve(const char *path, char *const argv[], char *const envp[]);
  
  
  
   對(duì)比一下main函數(shù)的完整形式,看出問(wèn)題了嗎?是的,這兩個(gè)函數(shù)里的argv和envp是完全一一對(duì)應(yīng)的關(guān)系。execve第1個(gè)參數(shù)path是被執(zhí) 行應(yīng)用程序的完整路徑,第2個(gè)參數(shù)argv就是傳給被執(zhí)行應(yīng)用程序的命令行參數(shù),第3個(gè)參數(shù)envp是傳給被執(zhí)行應(yīng)用程序的環(huán)境變量。
  
   留心看一下這6個(gè)函數(shù)還可以發(fā)現(xiàn),前3個(gè)函數(shù)都是以execl開(kāi)頭的,后3個(gè)都是以execv開(kāi)頭的,它們的區(qū)別在于,execv開(kāi)頭的函數(shù)是以 “char *argv[]”這樣的形式傳遞命令行參數(shù),而execl開(kāi)頭的函數(shù)采用了我們更容易習(xí)慣的方式,把參數(shù)一個(gè)一個(gè)列出來(lái),然后以一個(gè)null表示結(jié)束。這 里的null的作用和argv數(shù)組里的null作用是一樣的。
  
  在全部6個(gè)函數(shù)中,只有execle和execve使用了 char *envp[]傳遞環(huán)境變量,其它的4個(gè)函數(shù)都沒(méi)有這個(gè)參數(shù),這并不意味著它們不傳遞環(huán)境變量,這4個(gè)函數(shù)將把默認(rèn)的環(huán)境變量不做任何修改地傳給被執(zhí)行的 應(yīng)用程序。而execle和execve會(huì)用指定的環(huán)境變量去替代默認(rèn)的那些。
  
  還有2個(gè)以p結(jié)尾的函數(shù)execlp和 execvp,咋看起來(lái),它們和execl與execv的差別很小,事實(shí)也確是如此,除execlp和execvp之外的4個(gè)函數(shù)都要求,它們的第1個(gè)參 數(shù)path必須是一個(gè)完整的路徑,如"/bin/ls";而execlp和execvp的第1個(gè)參數(shù)file可以簡(jiǎn)單到僅僅是一個(gè)文件名,如"ls",這 兩個(gè)函數(shù)可以自動(dòng)到環(huán)境變量path制定的目錄里去尋找。
  
  實(shí)戰(zhàn)
  
  知識(shí)介紹得差不多了,接下來(lái)我們看看實(shí)際的應(yīng)用:
  
  /* exec.c */
  #include
  main()
  {
   char *envp[]={"path=/tmp",
   "user=lei",
   "status=testing",
   null};
   char *argv_execv[]={"echo", "excuted by execv", null};
   char *argv_execvp[]={"echo", "executed by execvp", null};
   char *argv_execve[]={"env", null};
   if(fork()==0)
   if(execl("/bin/echo", "echo", "executed by execl", null)<0)
   perror("err on execl");
   if(fork()==0)
   if(execlp("echo", "echo", "executed by execlp", null)<0)
   perror("err on execlp");
   if(fork()==0)
   if(execle("/usr/bin/env", "env", null, envp)<0)
   perror("err on execle");
   if(fork()==0)
   if(execv("/bin/echo", argv_execv)<0)
   perror("err on execv");
   if(fork()==0)
   if(execvp("echo", argv_execvp)<0)
   perror("err on execvp");
   if(fork()==0)
   if(execve("/usr/bin/env", argv_execve, envp)<0)
   perror("err on execve");
  }
  
  
  
  程序里調(diào)用了2個(gè)linux常用的系統(tǒng)命令,echo和env。echo會(huì)把后面跟的命令行參數(shù)原封不動(dòng)的打印出來(lái),env用來(lái)列出所有環(huán)境變量。
  
  由于各個(gè)子進(jìn)程執(zhí)行的順序無(wú)法控制,所以有可能出現(xiàn)一個(gè)比較混亂的輸出--各子進(jìn)程打印的結(jié)果交雜在一起,而不是嚴(yán)格按照程序中列出的次序。
  
  編譯并運(yùn)行:
  
  $ cc exec.c -o exec
  $ ./exec
  executed by execl
  path=/tmp
  user=lei
  status=testing
  executed by execlp
  excuted by execv
  executed by execvp
  path=/tmp
  user=lei
  status=testing
  
  
  
  果然不出所料,execle輸出的結(jié)果跑到了execlp前面。
  
  大家在平時(shí)的編程中,如果用到了exec函數(shù)族,一定記得要加錯(cuò)誤判斷語(yǔ)句。因?yàn)榕c其他系統(tǒng)調(diào)用比起來(lái),exec很容易受傷,被執(zhí)行文件的位置,權(quán)限等很多因素都能導(dǎo)致該調(diào)用的失敗。最常見(jiàn)的錯(cuò)誤是:
  
  找不到文件或路徑,此時(shí)errno被設(shè)置為enoent;
  
  數(shù)組argv和envp忘記用null結(jié)束,此時(shí)errno被設(shè)置為efault;
  
  沒(méi)有對(duì)要執(zhí)行文件的運(yùn)行權(quán)限,此時(shí)errno被設(shè)置為eacces。
  
  
  進(jìn)程的一生
  
  
  下面就讓我用一些形象的比喻,來(lái)對(duì)進(jìn)程短暫的一生作一個(gè)小小的總結(jié):
  
  隨著一句fork,一個(gè)新進(jìn)程呱呱落地,但它這時(shí)只是老進(jìn)程的一個(gè)克隆。
  
  然后隨著exec,新進(jìn)程脫胎換骨,離家獨(dú)立,開(kāi)始了為人民服務(wù)的職業(yè)生涯。
  
   人有生老病死,進(jìn)程也一樣,它可以是自然死亡,即運(yùn)行到main函數(shù)的最后一個(gè)"}",從容地離我們而去;也可以是自殺,自殺有2種方式,一種是調(diào)用 exit函數(shù),一種是在main函數(shù)內(nèi)使用return,無(wú)論哪一種方式,它都可以留下遺書(shū),放在返回值里保留下來(lái);它還甚至能可被謀殺,被其它進(jìn)程通過(guò) 另外一些方式結(jié)束他的生命。
  
  進(jìn)程死掉以后,會(huì)留下一具僵尸,wait和waitpid充當(dāng)了殮尸工,把僵尸推去火化,使其最終歸于無(wú)形。
  
  這就是進(jìn)程完整的一生。
  
  
  小結(jié)
  
  
  本文重點(diǎn)介紹了系統(tǒng)調(diào)用wait、waitpid和exec函數(shù)族,對(duì)與進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用的介紹就在這里告一段落,在下一篇文章,也是與進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用的最后一篇文章中,我們會(huì)通過(guò)兩個(gè)很酷的實(shí)際例子,來(lái)重溫一下最近學(xué)過(guò)的知識(shí)。




總結(jié)

以上是生活随笔為你收集整理的僵尸进程(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久精品久久国产 | 国产资源中文字幕 | 中文字幕人成乱码在线观看 | 狠狠干在线 | 欧美精品久久久 | 欧洲精品久久久久毛片完整版 | 亚洲国产成人精品电影在线观看 | 日本少妇高清做爰视频 | 久久精品草| 国产精品高清一区二区三区 | 久久视了 | 天堂av观看 | 国产精品毛片一区二区 | 五月婷婷一区 | 天天干天天拍 | www.国产高清 | 色天天综合久久久久综合片 | 成人黄大片视频在线观看 | 中文av在线播放 | 99这里只有 | 美女在线免费观看视频 | 久久视了 | 色综合久久五月天 | 日韩在线精品一区 | 麻豆手机在线 | 国产成人av电影在线观看 | 亚洲九九九在线观看 | 国产黄色在线观看 | 日韩av中文在线观看 | 天天色欧美 | 久久亚洲私人国产精品 | 处女av在线 | 久久久精品福利视频 | av在线成人 | 天天干天天操天天干 | 91av视频免费在线观看 | 五月婷婷在线播放 | 97在线视频免费看 | 国产精品一区二区三区在线播放 | 成 人 黄 色 片 在线播放 | 香蕉影视在线观看 | 中文电影网 | 在线影院中文字幕 | 五月天激情婷婷 | 久久成年视频 | 激情视频免费观看 | 欧美日韩免费在线视频 | 五月花激情 | 久草www | 欧美日韩成人一区 | 2018好看的中文在线观看 | 久久免费黄色大片 | 最新国产视频 | 99精品欧美一区二区三区黑人哦 | 久久精品一区 | 黄色av网站在线观看免费 | 天天射天天操天天色 | 最新久久久 | 久久兔费看a级 | 日韩大片在线免费观看 | 亚洲精品一区二区三区新线路 | 狠狠狠色狠狠色综合 | 亚洲免费在线视频 | 免费黄色网址大全 | 91精品天码美女少妇 | 天天摸天天干天天操天天射 | 五月婷婷黄色网 | www.一区二区三区 | 欧美日韩亚洲第一页 | 久久免费公开视频 | www..com毛片 | 国产一二区免费视频 | www.成人sex| 成人资源在线播放 | 麻豆免费视频 | 国产在线观看中文字幕 | 国产91成人| 国产亚洲视频在线观看 | 波多野结衣视频一区二区三区 | 五月婷婷影院 | 国产不卡在线观看视频 | 亚洲日本精品 | 最近中文国产在线视频 | 最新日韩视频 | av在线免费观看黄 | 国产精品黄色在线观看 | 欧美在线视频一区二区 | 亚州av一区 | 97超碰成人 | 狠狠地日 | 91网在线| 欧美日韩网址 | 最近中文字幕视频完整版 | 欧美精品在线观看免费 | 黄色成人在线 | 国产美女精品 | 国产品久精国精产拍 | 国产一级精品视频 | 国产精品mv在线观看 | 一区二区三区四区不卡 | 人人超在线公开视频 | 中文亚洲欧美日韩 | 不卡精品视频 | 中文在线www | 亚洲成av人片在线观看香蕉 | 国产成人精品久久亚洲高清不卡 | 国产成人久久av977小说 | 国产美女免费观看 | 在线亚洲欧美日韩 | 国产精品女人网站 | 精品美女久久久久 | 精品视频久久久久久 | 久久久久久国产精品999 | 天天干天天综合 | 亚洲乱码精品久久久 | 激情综合网五月婷婷 | 狠狠色狠狠色综合日日92 | 色婷婷综合视频在线观看 | a黄色一级 | 在线а√天堂中文官网 | 国产99亚洲 | www.av中文字幕.com | 色香天天 | 91九色视频在线播放 | 草樱av| 婷婷色综 | 亚洲精品乱码 | 国产精品福利在线 | 人人澡人人舔 | 97超碰成人在线 | 日韩精品久久久久久久电影99爱 | 欧美性生活大片 | 国产91粉嫩白浆在线观看 | 综合伊人久久 | 亚洲一级片免费观看 | 在线精品亚洲 | 欧美成人精品三级在线观看播放 | 国产色在线视频 | 成人污视频在线观看 | 国产中文 | 国产亚洲欧美精品久久久久久 | 久久精品国产一区 | 国产精品免费在线观看视频 | 最近中文字幕mv免费高清在线 | 99色精品视频 | 久久精品一区二区国产 | 国产手机视频在线观看 | 探花视频免费观看 | 最近中文字幕免费 | 国产破处视频在线播放 | 国产免费久久 | 国产美女免费 | 99热最新地址 | 国产精品亚洲人在线观看 | 午夜美女福利直播 | 欧美有色 | 日本午夜在线亚洲.国产 | 色狠狠操 | 国内成人精品2018免费看 | 波多野结衣一区二区 | www.婷婷com | 在线视频一区观看 | 久久综合狠狠 | 国产成人99av超碰超爽 | 久久成人国产精品入口 | 中文字幕成人在线观看 | 国产伦理久久精品久久久久_ | 伊人影院99 | 视频一区二区视频 | 麻豆影视网站 | 免费在线黄 | 成年人网站免费观看 | 国产成人精品亚洲日本在线观看 | www.av在线.com | 免费av网址大全 | 亚洲精品视 | 国产成人一区二区啪在线观看 | 97精品国产aⅴ | 久久午夜剧场 | 黄色福利| 最近日本中文字幕a | 黄色一级在线视频 | 亚洲国产精品推荐 | 国产精品一区二区久久 | 久久精品—区二区三区 | 亚洲爽爽网 | 国产精品中文久久久久久久 | 中文字幕一区二区三区在线观看 | www欧美日韩 | 九月婷婷人人澡人人添人人爽 | 中文在线a√在线 | 999视频网| 亚洲午夜精品久久久久久久久 | 激情av网| 视频在线播放国产 | 亚洲国产剧情 | 成人电影毛片 | 国产高清成人 | 成人视屏免费看 | 欧美91成人网 | 高清不卡一区二区在线 | 欧美日韩精品免费观看视频 | 中文字幕精品一区久久久久 | 五月天堂色 | 中国一级特黄毛片大片久久 | 欧美精品一区二区性色 | 爱情影院aqdy鲁丝片二区 | 干干日日 | 麻豆高清免费国产一区 | 成人黄在线 | 亚洲爱爱视频 | 国产精品国产三级国产aⅴ入口 | 欧美一级黄色片 | 日韩二区在线播放 | 日韩精品一区二区三区视频播放 | 免费视频在线观看网站 | 亚洲综合色av | 在线国产日本 | 蜜臀av网址| 国产亚洲婷婷免费 | 日韩大片在线观看 | 国产亚洲在线视频 | 91中文字幕在线 | 国产精品入口久久 | 一区二区三区日韩在线 | 最近2019年日本中文免费字幕 | 色综合天天综合 | 久久久久久片 | 久久这里有 | 国产精品视频 | 日日综合网 | 午夜视频不卡 | 91成人在线视频 | 91色国产在线| 在线中文视频 | 欧美精品亚洲精品 | 五月婷在线观看 | 国产乱码精品一区二区三区介绍 | 国产成人精品aaa | 91视频-88av | 丁香在线视频 | 欧美一级免费在线 | 国产精品午夜久久 | 久久精品99北条麻妃 | av福利在线免费观看 | 亚洲三区在线 | 2021久久| 国产一级久久久 | 久久成人午夜视频 | 久久影视一区二区 | 国产九九在线 | 91超碰免费在线 | 又黄又爽的视频在线观看网站 | 伊人色综合久久天天 | 99视频在线免费播放 | 五月婷婷中文网 | 日韩精品在线播放 | 超碰av在线播放 | 成人在线观看资源 | 国产精品麻豆视频 | 99国产免费网址 | 园产精品久久久久久久7电影 | 亚洲精品中文字幕视频 | 少妇搡bbbb搡bbb搡aa | 在线观看亚洲视频 | 可以免费观看的av片 | 天天做夜夜做 | 亚洲,国产成人av | 日韩在线视频看看 | 免费日韩电影 | 91看片在线 | 色网站国产精品 | 狠狠色丁香婷婷综合久小说久 | 欧美a级在线免费观看 | 激情欧美国产 | 日日夜精品 | 欧美日产一区 | 亚洲天堂自拍视频 | 成年人在线免费看视频 | 欧美在线不卡一区 | 狠狠色伊人亚洲综合网站野外 | 亚洲成人黄色 | 麻豆精品在线 | 久久福利| 国产免费高清视频 | 亚洲少妇影院 | 日韩精品一区二区三区第95 | 久久婷婷国产 | 日日夜夜综合网 | 亚洲精品在线观看不卡 | 久草视频免费 | 日韩精品在线看 | 视频一区亚洲 | 国语久久| 国产免费中文字幕 | 日本久久精品 | www黄在线| 日本公乱妇视频 | 久久午夜国产精品 | 91在线国内视频 | 久射网| 国产综合91 | 国产一二三四在线观看视频 | 手机看片国产 | 国产色婷婷 | 国产小视频在线免费观看 | 中文字幕在线观看资源 | 99热这里只有精品在线观看 | 精品久久久久久亚洲综合网 | 亚洲精品一区二区三区在线观看 | 亚洲一级片在线观看 | 粉嫩av一区二区三区四区 | 国产999精品久久久久久 | 久久久国产网站 | 国产精品免费成人 | 日韩久久在线 | 亚洲一区欧美激情 | 日日日爽爽爽 | 欧美激情精品久久久久久免费印度 | 天天干夜夜夜 | 国产亚洲欧美精品久久久久久 | 九九一级片 | 久久久一本精品99久久精品 | 免费人做人爱www的视 | 福利片免费看 | 五月婷婷在线观看 | 久久免费一 | 国产片免费在线观看视频 | 色老板在线视频 | 狠狠狠色丁香婷婷综合久久88 | 日韩电影一区二区三区在线观看 | 亚洲欧美国产精品久久久久 | 色婷婷综合五月 | 亚洲 欧美 综合 在线 精品 | 久久久精品影视 | 成人av动漫在线观看 | 免费久久99精品国产婷婷六月 | 国产精品免费在线 | 激情五月婷婷激情 | 韩国一区二区三区视频 | 一区二区伦理 | 免费在线精品视频 | wwxxxx日本 | 日韩va欧美va亚洲va久久 | 婷婷在线网 | 激情婷婷色 | 国产成人精品综合久久久久99 | 亚洲,播放 | 在线观看视频黄色 | 91成人在线观看喷潮 | 日日夜夜天天射 | 精品99在线视频 | 免费a网址| 成人黄色在线视频 | 91麻豆文化传媒在线观看 | 免费福利在线观看 | 91亚洲精品在线观看 | 国产裸体视频网站 | 搡bbbb搡bbb视频 | 在线网址你懂得 | av成人资源 | 精品1区二区 | 久久国产精品色av免费看 | 久草视频免费观 | 香蕉视频色 | 日韩免费在线视频观看 | 亚洲japanese制服美女 | 中文在线字幕免费观看 | 久久国产美女 | 国产亚洲精品成人av久久影院 | 一区二区三区在线免费观看视频 | 日韩午夜在线 | 91超级碰碰| 国产精品久久久久久久久久直播 | 人人插人人爱 | 激情五月播播久久久精品 | 日韩专区视频 | 亚洲国产精品久久久久久 | 99久久精品免费看 | 一区二区三区免费 | 天天艹日日干 | 黄色大片入口 | 国产69精品久久99不卡的观看体验 | 热re99久久精品国产99热 | 国产a视频免费观看 | 久久久久久久久久久影院 | 美女视频黄是免费的 | www.久久成人 | 欧美精品久久久久a | 亚洲三级黄色 | 成年人看片网站 | 欧美韩国日本在线观看 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲午夜久久久久久久久电影网 | 亚洲免费a| 亚洲精品成人 | 激情在线免费视频 | 欧美成年网站 | 久久九九久久精品 | 在线视频区 | 日韩电影久久久 | 丁香激情五月婷婷 | 精品国产一区二区三区四区在线观看 | 中文字幕亚洲字幕 | 福利片免费看 | 精品久久久久久久久久久久久久久久 | 又黄又爽又刺激的视频 | 91看片在线免费观看 | 午夜一级免费电影 | 97人人爽人人 | 国产录像在线观看 | 国产黄色片免费看 | 黄色片网站大全 | 九九视频在线 | 免费中午字幕无吗 | 少妇bbbb| 免费久草视频 | 91精品视频在线看 | 麻豆国产精品永久免费视频 | 久久免费的视频 | 视频在线一区二区三区 | 99re6热在线精品视频 | 国产精品精品国产婷婷这里av | 精品国产伦一区二区三区观看方式 | 日韩精品无 | 久久精品一区二区三区国产主播 | 九色在线 | 国产精品久久久久久久午夜 | 久草精品免费 | 亚洲在线视频免费 | 天干啦夜天干天干在线线 | 久久久精品视频网站 | 激情文学综合丁香 | 99九九99九九九视频精品 | 综合精品在线 | 在线一级片 | 中文字幕日韩一区二区三区不卡 | 欧美日韩裸体免费视频 | 天天操夜夜操国产精品 | 久久综合9988久久爱 | 天天干,天天干 | 中文字幕在线播出 | 免费成人黄色av | 国产99久久久国产精品免费二区 | 91精品导航| av不卡免费在线观看 | 精品视频亚洲 | 91毛片在线观看 | 国产精品一区二区三区免费视频 | 草莓视频在线观看免费观看 | 毛片永久新网址首页 | 最新国产精品久久精品 | 国产亲近乱来精品 | 久久久国产精品免费 | 日韩理论| 久久福利在线 | 成年人黄色大全 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲精品国偷拍自产在线观看 | 色妞色视频一区二区三区四区 | 成年人精品 | 久久亚洲美女 | 在线观看成年人 | 午夜av一区二区三区 | 操操操人人 | 99视频偷窥在线精品国自产拍 | 久久只有精品 | 99久久99精品| 亚洲精品白浆高清久久久久久 | 久草在线视频免费资源观看 | 国产91综合一区在线观看 | 又色又爽又黄高潮的免费视频 | 免费精品国产va自在自线 | 麻豆一精品传二传媒短视频 | 国产在线精品观看 | 人人藻人人澡人人爽 | 日本爱爱免费 | 国产女教师精品久久av | 中文一区二区三区在线观看 | 国产精品999久久久 久产久精国产品 | 久久久999| 亚洲天堂网视频在线观看 | 亚洲人成精品久久久久 | 国产91精品看黄网站在线观看动漫 | 中文字幕在线有码 | 精品一区二区在线播放 | 久久免费看 | 操操日日 | av高清一区二区三区 | 一本一道久久a久久精品蜜桃 | 999在线观看视频 | 国产韩国日本高清视频 | 精品国产久 | 国产精品18久久久久vr手机版特色 | 日韩性片 | 国产五月婷婷 | 91原创在线观看 | 日韩大片在线免费观看 | 91精选在线观看 | 免费特级黄色片 | 韩国av三级 | 国产视频一二区 | 激情五月婷婷激情 | 这里只有精品视频在线观看 | 在线国产视频一区 | 久久歪歪| 中文字幕二区三区 | 午夜精品久久久久久久99热影院 | 国产糖心vlog在线观看 | 国产黄在线看 | 欧美在线一二区 | 日韩在线电影一区二区 | 免费看片亚洲 | 亚洲国产中文在线 | 欧美精品久久久久久 | 久久九九久久九九 | 中文字幕 国产精品 | 国产成人一区二区三区在线观看 | 国产精品久久婷婷六月丁香 | 国产精品专区h在线观看 | 婷婷综合视频 | 国产黄色一级片 | 天天综合网久久 | 日韩视频免费观看高清完整版在线 | 欧美天堂视频在线 | 亚洲国产精品一区二区久久,亚洲午夜 | 日本在线观看一区二区三区 | 夜又临在线观看 | 黄网站色欧美视频 | 韩日av一区二区 | 夜夜操夜夜干 | 99爱这里只有精品 | 在线观看日本高清mv视频 | 国产二区av | 一区二区三区日韩在线 | 国产91丝袜在线播放动漫 | 国产精品久久久久久高潮 | 久久免费的精品国产v∧ | 91探花国产综合在线精品 | 亚洲激情p | 91av播放 | 米奇影视7777| 久久综合网色—综合色88 | 麻豆av一区二区三区在线观看 | 91网在线 | 六月丁香在线视频 | 亚洲精品小视频在线观看 | 欧美国产不卡 | 国产特级毛片aaaaaa高清 | 干亚洲少妇 | 日韩伦理一区二区三区av在线 | 超碰大片 | 黄色精品一区 | 色九九影院 | 深爱激情综合网 | 999成人免费视频 | 狠狠躁日日躁夜夜躁av | 天天操天天射天天爱 | 狠狠久久伊人 | 成人av影院在线观看 | 国产精品一区二区吃奶在线观看 | 狠狠干五月天 | 日韩欧美大片免费观看 | 亚州日韩中文字幕 | 国产黄色片网站 | 99久视频 | 日韩在线高清 | 国产一区二区三区免费视频 | 日韩性xxx| 狠狠色丁香婷婷综合最新地址 | 69国产精品视频免费观看 | 成人av在线一区二区 | 日韩av免费一区二区 | 国产精品第一页在线 | 欧美日韩另类视频 | 欧美 激情在线 | 丁香五月亚洲综合在线 | 99久高清在线观看视频99精品热在线观看视频 | 欧美精品在线观看一区 | 国产99久久久国产精品 | 久久久午夜精品福利内容 | 日韩精品视 | 99久久精品国产网站 | a天堂免费 | 国产精品久久一区二区三区, | 国产日韩视频在线播放 | 91丨porny丨九色 | 国产成人精品免高潮在线观看 | 丁香综合五月 | 国产成人一区二区精品非洲 | 国产中文字幕三区 | 国产午夜精品久久久久久久久久 | 免费看三级网站 | 婷婷去俺也去六月色 | 玖玖玖在线观看 | 视频在线99 | 中文字幕一区二区三区在线播放 | 91免费在线播放 | 在线视频久久 | 99久久精品费精品 | 久草视频网 | 91精品视频在线免费观看 | av成人在线观看 | 九色在线 | 国产高清在线 | 久久av伊人 | 狠狠插狠狠干 | 精品在线观看国产 | 欧美精品在线视频观看 | 天天干.com| 911久久香蕉国产线看观看 | 超碰在线网 | 国产精品国产三级国产aⅴ9色 | 在线观看网站av | 91九色在线视频 | 色99视频| 亚洲成人黄色 | 人人天天夜夜 | 国产美女精品视频 | 欧美性色综合 | 亚洲一区二区三区精品在线观看 | av在线电影免费观看 | 中文字幕av免费 | 亚洲黄色在线观看 | 久久国产精品小视频 | 98涩涩国产露脸精品国产网 | 婷婷网站天天婷婷网站 | 岛国一区在线 | 国产黑丝一区二区 | 欧亚日韩精品一区二区在线 | 香蕉视频亚洲 | 96av视频 | 日韩精品2区 | 国产一区二区在线观看视频 | 日日操网站 | 亚洲精品午夜国产va久久成人 | 91视频国产免费 | 亚州av网站 | 国产精品a久久久久 | 激情久久影院 | 国产亚洲精品久久久网站好莱 | 99999精品视频| 视频一区二区视频 | 18久久久久 | 日日夜夜综合 | 日韩精品一区二区三区三炮视频 | 日韩天堂在线观看 | 99久久精品国产一区二区成人 | 精品国产电影一区 | 精品av在线播放 | 一级黄色片在线观看 | 中文字幕在线观看网址 | 激情导航 | 欧美午夜性 | 国产精品视频久久久 | 久精品一区 | 色偷偷中文字幕 | 日韩av成人在线观看 | 永久免费毛片在线观看 | 国产精品久久久久久久7电影 | 99视频在线免费观看 | 国产精品毛片一区二区 | 久草网在线观看 | 亚洲欧美视频在线 | 国产精品久久久久永久免费看 | 九九热视频在线免费观看 | 在线观看av麻豆 | 中文字幕久久精品一区 | 成人a视频片观看免费 | 国产精品自拍在线 | 狠狠狠狠狠狠操 | 91在线免费公开视频 | 天天操天天射天天插 | 成人免费xyz网站 | 亚洲精选视频免费看 | 国内毛片毛片 | 欧美激情视频一区二区三区免费 | 亚洲精品视频在 | 91中文视频| www.av中文字幕.com | 在线观看亚洲国产 | 91精品电影| 国产小视频在线播放 | 久久久www免费电影网 | 久热超碰| 夜夜摸夜夜爽 | 国产特级毛片aaaaaa | 久草香蕉在线 | 在线免费色视频 | 在线看av的网址 | 99自拍视频在线观看 | 综合天天 | 91av蜜桃| 欧美激情视频一区二区三区免费 | 日韩精品视频在线观看免费 | 日韩国产高清在线 | 精品国产_亚洲人成在线 | 在线免费观看欧美日韩 | 国产精品永久免费观看 | 亚洲欧洲日韩在线观看 | 丁香九月婷婷 | 在线免费性生活片 | 免费av影视 | 久久久久久久久久久久99 | avsex| 日本精品中文字幕 | 国产白浆在线观看 | 色噜噜日韩精品一区二区三区视频 | 视频在线99re | 欧美人人爱| 久久综合免费 | 国内精品久久久久久中文字幕 | 国产不卡精品 | 国产精品美女久久久久久网站 | 国产高清在线永久 | 国产免费黄视频在线观看 | www.xxx.性狂虐| 69av久久 | 一级免费片| 射综合网 | 日本最新一区二区三区 | 一区二区欧美激情 | 91传媒在线观看 | 成人在线一区二区三区 | 欧美精品一二 | 婷婷免费视频 | 在线激情影院一区 | 亚洲精品影视在线观看 | 激情五月激情综合网 | 国产v在线| 久久草av | 久久久成人精品 | 这里只有精品视频在线 | 97视频免费看 | 日韩高清片| 夜夜躁日日躁狠狠躁 | 日韩极品在线 | 狠狠躁日日躁夜夜躁av | 一区二区观看 | 色婷婷中文 | 久热只有精品 | 一区二区视频免费在线观看 | 日韩美av在线 | 成人黄色免费在线观看 | 日韩精品中字 | 91最新网址在线观看 | 免费在线观看午夜视频 | 日韩成人免费在线观看 | 91福利社区在线观看 | 久久久久久99精品 | 国产精品高潮呻吟久久av无 | 伊人狠狠色丁香婷婷综合 | 中文字幕av免费在线观看 | 国产中文字幕视频在线观看 | 91精品无人成人www | 免费看片日韩 | 日韩精品一区二区三区电影 | 狠狠狠色丁香婷婷综合久久五月 | 综合影视 | 久久国内免费视频 | 久久精品一区二区三区国产主播 | 欧美 亚洲 另类 激情 另类 | 亚洲黄色网络 | 久久国产综合视频 | 91桃色国产在线播放 | 欧美日韩xx | 日日摸日日| 一区二区电影网 | 超碰在线日本 | av片中文字幕 | 天天色天天上天天操 | 欧美极度另类性三渗透 | 亚洲一区动漫 | 91精品国产一区二区三区 | 嫩模bbw搡bbbb搡bbbb | 在线a人片免费观看视频 | 久久精品国产精品亚洲 | 天天操天天舔天天爽 | 久久久精品久久日韩一区综合 | 国产视频综合在线 | 国产美女精品在线 | 狠狠操狠狠干天天操 | 久久久久久欧美二区电影网 | 久精品视频免费观看2 | 2019久久精品 | 激情在线网址 | 91黄在线看 | 99久久久国产精品 | 96超碰在线 | 久久久久久久久久久免费 | 久久久久久久久久久久久久电影 | 精品欧美一区二区在线观看 | 国产精品久免费的黄网站 | 日日夜夜骑 | 欧美一级视频免费 | 国产免费一区二区三区最新 | 久久久久久久久久伊人 | 国内小视频 | 国产高清在线看 | 在线免费观看国产 | 中文字幕二区 | 少妇自拍av | 精品中文字幕视频 | 天天操天天怕 | 99久热在线精品视频成人一区 | 超碰在线人人爱 | 国产黄色片久久 | 亚洲成人xxx | 亚洲va男人天堂 | 91精品视频一区二区三区 | 色资源二区在线视频 | 免费网站观看www在线观看 | 日韩久久精品一区 | 少妇bbbb揉bbbb日本 | 中文字幕a在线 | 91在线视频免费 | 日韩特级黄色片 | 狠狠色香婷婷久久亚洲精品 | 天天爽人人爽夜夜爽 | a午夜电影 | 91视频首页 | 亚洲码国产日韩欧美高潮在线播放 | 日韩欧美高清在线观看 | 精品视频免费播放 | 国产福利网站 | 五月婷婷视频在线 | 中文字幕免费高清 | 美女网站在线 | 国产精品久久久久久久妇 | 久久99精品国产麻豆宅宅 | www.五月婷婷 | 视频在线精品 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 国产成人a亚洲精品 | 亚洲在线观看av | 国产免费黄色 | 亚洲人成在 | 狠狠干夜夜 | 久久精品99精品国产香蕉 | 夜夜视频资源 | 韩国一区二区三区视频 | 中文字幕乱码电影 | 国产精品久久久久久久久久久久午夜 | 国产在线一区观看 | av一区二区三区在线观看 | 国产高清在线免费视频 | 中文在线免费看视频 | 在线国产片 | 91亚洲国产成人久久精品网站 | 婷婷久久一区 | 综合精品久久久 | 国产黄| 免费av免费观看 | 亚洲久草网 | 日韩一区二区久久 | 日韩视频a| 国产精品美女久久久久久久久久久 | 成年人黄色免费网站 | 日韩av电影免费在线观看 | 亚洲精品ww| 国产精品成 | 日韩一区在线播放 | 色婷婷色 | 插综合网 | 国产又粗又猛又爽又黄的视频免费 | 西西44人体做爰大胆视频 | 国产黄色免费在线观看 | 欧美激情综合网 | 成人免费在线视频 | 日韩午夜剧场 | 免费高清无人区完整版 | 91大神免费在线观看 | 天天综合导航 | 国产专区视频在线 | 综合精品在线 | 九九九在线 | 手机看片国产日韩 | 国产亚洲视频中文字幕视频 | 欧美男女爱爱视频 | 日韩高清dvd | 欧美疯狂性受xxxxx另类 | 久久精品电影网 | 毛片随便看 | 亚洲欧洲视频 | 国产精品九九久久久久久久 | 国产精品理论片在线观看 | www黄色软件 | 五月婷网站 | 91在线精品秘密一区二区 | 亚洲精品午夜久久久久久久 | 樱空桃av | 在线免费91| 亚洲综合激情五月 | 欧美日韩电影在线播放 | 国产精品第72页 | 精品人妖videos欧美人妖 | 亚洲精品在线观看的 | 久久精品人人做人人综合老师 | 婷婷视频导航 | 开心激情五月网 | 国产一级h | 日韩视频一区二区三区在线播放免费观看 | 亚洲爱av| 99色人| 日本中文字幕在线免费观看 | 97视频人人澡人人爽 | 天天综合色 | 免费观看的av | 国产精品久久一区二区无卡 | 涩涩资源网 | 成人永久在线 | 97超碰免费在线观看 | 福利一区二区三区四区 | 高清国产在线一区 | 国产精品麻豆果冻传媒在线播放 | 视频一区二区在线 | 最近中文字幕高清字幕在线视频 | 免费av网址大全 | 亚洲精品高清一区二区三区四区 | 国产精品免费在线播放 | 久久国产精品一区二区三区 | 五月天丁香 | 在线视频成人 | 综合国产在线观看 | 亚洲成人二区 | 国产在线精 | 黄色av免费看 | 精品国产欧美 | 久插视频 | 亚洲国产操 | av大全在线 | 国产精品久久久久久久久久不蜜月 | 精品国产区在线 | 久久免费国产精品 | 最近更新的中文字幕 | 狠狠的日 | 国产精品久久久久久久久久久久 | 人人插人人看 | 国产精品一区二区无线 | 婷婷激情影院 | 精品国产1区二区 | 国产亚洲精品久 | 久草精品在线观看 | av综合 日韩 | 亚洲精品激情 | 亚洲日本成人网 | 狠狠狠狠狠狠操 | 国产日韩欧美视频在线观看 | av一区二区在线观看中文字幕 | h视频日本 | 欧美色道| 日韩视频一区二区三区在线播放免费观看 | 欧美精品久久人人躁人人爽 | 国产一区二区三区四区在线 | 91精品国产综合久久婷婷香蕉 | 国产粉嫩在线观看 | 国产手机在线 | 日韩激情一二三区 | 在线天堂中文www视软件 | 中文字幕久久精品 | 97成人精品区在线播放 | 久久草在线精品 | 日韩欧美观看 | 在线观看免费国产小视频 | 中文字幕在线看视频 | 日韩免费大片 | 一级黄色av | 久久99精品一区二区三区三区 | 国产精品成人免费精品自在线观看 | 日韩av高清在线观看 | 国产精品18久久久久久首页狼 | 国产日女人 | 亚洲专区在线视频 | 免费看片色| 久久久久国产成人免费精品免费 | av黄色免费在线观看 | 欧美国产亚洲精品久久久8v | 四虎影视精品永久在线观看 | 婷婷丁香久久五月婷婷 | 永久黄网站色视频免费观看w | 久久毛片高清国产 | 中文字幕高清在线 | 久久久精品 | 日韩亚洲在线 | 特黄一级毛片 | 91超级碰碰 | 日韩区视频 | 日韩在线观看的 | 久久情爱| 日韩欧美视频免费观看 | 久久精品欧美 | 国产 欧美 日产久久 | 久久国产热视频 | 中文在线字幕观看电影 | 亚州欧美视频 | 免费一级日韩欧美性大片 | 欧美片一区二区三区 | 欧美午夜久久久 |