亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 系統(tǒng) > Unix > 正文

UNIX高級(jí)環(huán)境編程(9)進(jìn)程控制(Process Control)- fork,vfork,僵尸進(jìn)程,wait和waitpid

2024-06-28 13:21:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
UNIX高級(jí)環(huán)境編程(9)進(jìn)程控制(PRocess Control)- fork,vfork,僵尸進(jìn)程,wait和waitpid

本章包含內(nèi)容有:

  • 創(chuàng)建新進(jìn)程
  • 程序執(zhí)行(program execution)
  • 進(jìn)程終止(process termination)
  • 進(jìn)程的各種ID

?

1 進(jìn)程標(biāo)識(shí)符(Process Identifiers)

每個(gè)進(jìn)程都有一個(gè)唯一的標(biāo)識(shí)符,進(jìn)程ID(process ID)。

進(jìn)程的ID是可重用的,如果一個(gè)進(jìn)程被終止,那么它的進(jìn)程ID會(huì)被系統(tǒng)回收,但是會(huì)延遲使用,防止該進(jìn)程ID標(biāo)識(shí)的新進(jìn)程被誤認(rèn)為是以前的進(jìn)程。

三個(gè)特殊ID的進(jìn)程:

  • Process ID 0:調(diào)度者進(jìn)程,內(nèi)核進(jìn)程。
  • Process ID 1:init進(jìn)程,內(nèi)核引導(dǎo)程序最后啟動(dòng),負(fù)責(zé)啟動(dòng)Unix系統(tǒng)。對(duì)應(yīng)系統(tǒng)文件/sbin/init。
  • Process ID 2:pagedaemon,負(fù)責(zé)虛擬內(nèi)存的頁(yè)管理。

獲取進(jìn)程各種ID的相關(guān)函數(shù):

函數(shù)聲明:

#include <unistd.h>

pid_t getpid(void); ? ? // Returns: process ID of calling process

pid_t getppid(void); ? ? ? ?// Returns: parent process ID of calling process

uid_t getuid(void); ? ? ? ?// Returns: real user ID of calling process

uid_t geteuid(void); ? ? ? // Returns: effective user ID of calling process

gid_t getgid(void); ? ? ? ?// Returns: real group ID of calling process

gid_t getegid(void); ? ? ? ?// Returns: effective group ID of calling process

這里的各種ID在前面第三篇中有說(shuō)明,http://www.CUOXin.com/suzhou/p/4295535.html

?

2 fork函數(shù)

fork函數(shù)用于一個(gè)已存在的進(jìn)程創(chuàng)建一個(gè)新的進(jìn)程。

函數(shù)聲明:

#include <unistd.h>

pid_t fork(void);

函數(shù)細(xì)節(jié):

  1. 創(chuàng)建的新進(jìn)程叫做子進(jìn)程,子進(jìn)程是父進(jìn)程的一個(gè)拷貝,拷貝數(shù)據(jù)段,堆和棧,而共享文本段。
  2. 該函數(shù)調(diào)用一次,但是返回兩次(父進(jìn)程和子進(jìn)程各返回一次,子進(jìn)程返回0,父進(jìn)程返回子進(jìn)程的進(jìn)程號(hào))。這樣設(shè)置的原因是:父進(jìn)程可以有多個(gè)子進(jìn)程,父進(jìn)程沒(méi)有方法獲取子進(jìn)程的進(jìn)程號(hào),而子進(jìn)程只可能有一個(gè)父進(jìn)程,并且可以通過(guò)getppid方法獲取父進(jìn)程的進(jìn)程號(hào)。
  3. 寫(xiě)時(shí)復(fù)制(copy-on-write)機(jī)制:子進(jìn)程剛創(chuàng)建,在只讀的情況下和父進(jìn)程共享數(shù)據(jù)段、堆和棧。如果子進(jìn)程或者父進(jìn)程試著修改這些數(shù)據(jù),內(nèi)核會(huì)進(jìn)程這些數(shù)據(jù)的拷貝。
  4. 我們無(wú)法判斷子進(jìn)程和父進(jìn)程的執(zhí)行順序,這取決于系統(tǒng)的調(diào)度順序。

Example:

#include "apue.h"

?

int ? ? globvar = 6;? ? ? ? /* external variable in initialized data */

char? ? buf[] = "a write to stdout/n";

?

int

main(void)

{

? ? int ? ? var;? ? ? ? /* automatic variable on the stack */

? ? pid_t ? pid;

?

? ? var = 88;

? ? if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)

? ? ? ? err_sys("write error");

? ? printf("before fork/n");? ? /* we don't flush stdout */

?

? ? if ((pid = fork()) < 0) {

? ? ? ? err_sys("fork error");

? ? } else if (pid == 0) {? ? ? /* child */

? ? ? ? globvar++;? ? ? ? ? ? ? /* modify variables */

? ? ? ? var++;

? ? } else {

? ? ? ? sleep(2); ? ? ? ? ? ? ? /* parent */

? ? }

?

? ? printf("pid = %ld, glob = %d, var = %d/n", (long)getpid(), globvar,

? ? ? var);

? ? exit(0);

}

執(zhí)行結(jié)果:

NewImage

pid為12291的進(jìn)程為子進(jìn)程,對(duì)變量glob和var進(jìn)行了加1。

當(dāng)把輸出重定向到一個(gè)文件時(shí),我們發(fā)現(xiàn)結(jié)果和直接輸出到終端中不太一樣:

NewImage

原因:?

  • 函數(shù)write不使用緩存,所以在系統(tǒng)調(diào)用fork之前調(diào)用write,結(jié)果直接輸出到標(biāo)準(zhǔn)輸出上;
  • 而標(biāo)準(zhǔn)輸出如果連接到終端,則是行緩沖(line buffered),否則是全緩沖(full buffered);
  • 在第一個(gè)例子中,換行導(dǎo)致printf寫(xiě)入到標(biāo)準(zhǔn)輸出中的數(shù)據(jù)flush到終端上(行緩沖,換新行,導(dǎo)致前面一行被打?。?;
  • 在第二個(gè)例子中,我們將標(biāo)準(zhǔn)輸出重定向到文件,則使用全緩沖,printf的數(shù)據(jù)被緩存在buffer中沒(méi)有被打印,在fork時(shí),buffer同樣被拷貝了一份,這樣父子進(jìn)程都有了一個(gè)標(biāo)準(zhǔn)IO緩存(standard IO buffer);
  • 程序中的第二個(gè)printf將新的內(nèi)從append到buffer中已有數(shù)據(jù)的后面,一同打印出,就看到了第二個(gè)例子中打印的結(jié)果。

?

文件共享(File Sharing)

當(dāng)調(diào)用fork函數(shù)時(shí),父進(jìn)程的所有打開(kāi)的文件描述符都會(huì)復(fù)制一份到子進(jìn)程中,包括文件偏移量(file offset)。

所以當(dāng)父子進(jìn)程同時(shí)寫(xiě)文件時(shí),他們的操作都會(huì)更新同一個(gè)文件偏移量(file offset),加入子進(jìn)程向文件中寫(xiě)入了一部分?jǐn)?shù)據(jù),同時(shí)更新了file offset,那么父進(jìn)程進(jìn)行寫(xiě)入操作時(shí),會(huì)使用跟新以后的offset,從而避免了覆蓋了子進(jìn)程寫(xiě)入的數(shù)據(jù)。

父子進(jìn)程共享文件如下圖所示:

NewImage

我們可以發(fā)現(xiàn),父子進(jìn)程擁有相同的文件描述符,又沒(méi)有其他的同步方式,所以他們的輸出可能會(huì)混起來(lái)(intermixed)。

fork之后,常見(jiàn)的處理父子進(jìn)程擁有的文件描述符有兩種方式:

  • 父進(jìn)程等待子進(jìn)程完成。
  • 父子進(jìn)程各自工作,關(guān)閉不需要的文件描述符。

除了打開(kāi)的文件描述,其他的子進(jìn)程會(huì)繼承自父進(jìn)程的內(nèi)容包括:

NewImage

父子進(jìn)程不同的地方包括:

  • fork的返回值不同
  • 進(jìn)程ID不同
  • 進(jìn)程的父進(jìn)程ID不同
  • 子進(jìn)程的tms_utime, tms_stime, itms_cutime和itms_cstime值被置為0
  • 父進(jìn)程的文件鎖不會(huì)被子進(jìn)程繼承
  • 子進(jìn)程的pending signals被置空

?

3 vfork

vfork和fork有相同的返回值。

vfork和fork的不同點(diǎn):

  • 函數(shù)目的:vfork創(chuàng)建的子進(jìn)程是為了讓子進(jìn)程執(zhí)行一個(gè)新的程序
  • 復(fù)制操作:不復(fù)制父進(jìn)程的地址空間,而是直接運(yùn)行在父進(jìn)程的地址空間中,直到子進(jìn)程調(diào)用exec或者exit
  • 效率:所以vfork的執(zhí)行效率比f(wàn)ork要高,因?yàn)樗鼪](méi)有copy操作
  • 不確定的結(jié)果:但是如果子進(jìn)程修改了數(shù)據(jù)、調(diào)用函數(shù)或者沒(méi)有調(diào)用exec和exit方法,則會(huì)造成不確定的結(jié)果
  • 子進(jìn)程先運(yùn)行:vfork保證子進(jìn)程先運(yùn)行

?Example:

#include "apue.h"

?

int ? ? globvar = 6;? ? ? ? /* external variable in initialized data */

?

int

main(void)

{

? ? int ? ? var;? ? ? ? /* automatic variable on the stack */

? ? pid_t ? pid;

?

? ? var = 88;

? ? printf("before vfork/n"); ? /* we don't flush stdio */

? ? if ((pid = vfork()) < 0) {

? ? ? ? err_sys("vfork error");

? ? } else if (pid == 0) {? ? ? /* child */

? ? ? ? globvar++;? ? ? ? ? ? ? /* modify parent's variables */

? ? ? ? var++;

? ? ? ? _exit(0); ? ? ? ? ? ? ? /* child terminates */

? ? }

?

? ? /* parent continues here */

? ? printf("pid = %ld, glob = %d, var = %d/n", (long)getpid(), globvar,

? ? ? var);

?

? ? exit(0);

}

運(yùn)行結(jié)果:

NewImage

?

4 進(jìn)程退出和僵尸進(jìn)程

正常退出:三個(gè)函數(shù)exit,?

如果子進(jìn)程不正常退出,則內(nèi)核保證記錄該進(jìn)程的異常退出狀態(tài),該進(jìn)程的父進(jìn)程可以通過(guò)調(diào)用wait或者waitpid函數(shù)獲取該子進(jìn)程的異常退出狀態(tài)。

如果父進(jìn)程在子進(jìn)程之前終止,則init進(jìn)程成為該子進(jìn)程的父進(jìn)程。從而保證每個(gè)進(jìn)程都有父進(jìn)程。

如果子進(jìn)程先終止(異常終止或者正常退出),內(nèi)核會(huì)保存該子進(jìn)程的部分信息,包括進(jìn)程pid,進(jìn)程終止時(shí)的狀態(tài)和該進(jìn)程占用的CPU時(shí)間,同時(shí)內(nèi)核會(huì)清除該進(jìn)程占用的內(nèi)存,關(guān)閉所有已經(jīng)打開(kāi)的文件描述符。父進(jìn)程可以通過(guò)檢查該信息獲取子進(jìn)程的終止情況。

如果子進(jìn)程先終止,而沒(méi)有父進(jìn)程調(diào)用waitpid獲取該子進(jìn)程的信息,那么這種進(jìn)程被成為僵尸進(jìn)程。使用ps命令可以看到僵尸進(jìn)程的相關(guān)信息。

如果父進(jìn)程為init進(jìn)程,那么子進(jìn)程異常終止并不會(huì)成為僵尸進(jìn)程,因?yàn)閕nit進(jìn)程會(huì)對(duì)它的所有子進(jìn)程調(diào)用wait函數(shù)獲取子進(jìn)程的終止?fàn)顟B(tài)。

?

5 wait和waitpid函數(shù)

子進(jìn)程終止,內(nèi)核會(huì)向父進(jìn)程發(fā)送SIGCHLD信號(hào)。父進(jìn)程默認(rèn)的行為是忽略該信號(hào),父進(jìn)程也可以設(shè)置一個(gè)信號(hào)處理函數(shù),當(dāng)捕捉到該信號(hào)時(shí),調(diào)用該處理函數(shù),在后面的相關(guān)章節(jié)會(huì)介紹信號(hào)相關(guān)的概念。

本節(jié)介紹的wait和waitpid函數(shù)的作用是:

  • 如果子進(jìn)程在運(yùn)行,則阻塞;
  • 如果子進(jìn)程終止,并且子進(jìn)程的終止?fàn)顟B(tài)被父進(jìn)程獲取,則該函數(shù)立刻返回該終止?fàn)顟B(tài);
  • 如果該進(jìn)程沒(méi)有任何子進(jìn)程,則返回錯(cuò)誤。

需要注意的一點(diǎn)是,如果我們?cè)诮邮盏絊IGCHLD信號(hào)后,調(diào)用wait函數(shù),則該函數(shù)會(huì)立刻返回。在其他情況下調(diào)用wait函數(shù),則會(huì)阻塞。

函數(shù)聲明:

#include <sys/wait.h>

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid, int *statloc, int options);?

// Both return: process ID if OK, 0,or -1 on error

兩個(gè)函數(shù)之間的區(qū)別:

  • wait函數(shù)會(huì)阻塞,一直到一個(gè)子進(jìn)程終止;waitpid函數(shù)的參數(shù)options可以指定不阻塞;
  • waitpid函數(shù)可以選擇不阻塞,并且可以指定等待某一個(gè)子進(jìn)程終止。

函數(shù)細(xì)節(jié):

  • 如果一個(gè)子進(jìn)程終止并成為了僵尸進(jìn)程,wait函數(shù)立刻返回該子進(jìn)程的狀態(tài);
  • 如果一個(gè)進(jìn)程調(diào)用wait()函數(shù)并阻塞,并且有多個(gè)子進(jìn)程,則當(dāng)有一個(gè)子進(jìn)程終止時(shí),wait()函數(shù)返回;
  • 參數(shù)statloc是一個(gè)整型指針,如果該參數(shù)不為null,則子進(jìn)程的終止?fàn)顟B(tài)被保存在該參數(shù)指向的整型中;如果我們不關(guān)心進(jìn)程的終止?fàn)顟B(tài),statloc傳入null就行;

返回值檢查:

使用四個(gè)宏來(lái)檢查wait和waitpid函數(shù)來(lái)獲取子進(jìn)程的終止?fàn)顟B(tài)(terminated status),如退出狀態(tài),信號(hào)值等信息。

四個(gè)宏的具體說(shuō)明見(jiàn)下表所示:

NewImage

pid的取值對(duì)waitpid函數(shù)行為的影響:

  • pid == -1:行為和wait相同,等待任意一個(gè)子進(jìn)程終止
  • pid > 0:等待進(jìn)程號(hào)為pid的進(jìn)程終止
  • pid ==0:等待進(jìn)程組號(hào)和調(diào)用進(jìn)程的進(jìn)程組號(hào)相同的任意一個(gè)子進(jìn)程終止
  • pid < -1:等待進(jìn)程組號(hào)等于pid的任意一個(gè)子進(jìn)程終止

參數(shù)option的取值:

NewImage

waitpid函數(shù)提供了三個(gè)wait沒(méi)有的特性:

  • waitpid可以讓我們等待某一個(gè)特定的進(jìn)程;
  • waitpid提供了不阻塞版本的wait函數(shù);
  • option參數(shù)WCONTINUED和WUNTRACED為系統(tǒng)的任務(wù)控制(job control)提供了支持。

?

Example:

#include "apue.h"

#include <sys/wait.h>

?

int

main(void)

{

? ? pid_t ? pid;

?

? ? if ((pid = fork()) < 0) {

? ? ? ? err_sys("fork error");

? ? } else if (pid == 0) {? ? ? /* first child */

? ? ? ? if ((pid = fork()) < 0)

? ? ? ? ? ? err_sys("fork error");

? ? ? ? else if (pid > 0)

? ? ? ? {

? ? ? ? ? ? exit(0);? ? /* parent from second fork == first child */

? ? ? ? }

?

? ? ? ? /*

?? ? ? ? * We're the second child; our parent becomes init as soon

?? ? ? ? * as our real parent calls exit() in the statement above.

?? ? ? ? * Here's where we'd continue executing, knowing that when

?? ? ? ? * we're done, init will reap our status.

? ? ? ? ?*/

? ? ? ? sleep(2);

? ? ? ? printf("second child, parent pid = %ld/n", (long)getppid());

? ? ? ? exit(0);

? ? }

?

? ? if (waitpid(pid, NULL, 0) != pid) ? /* wait for first child */

? ? ? ? err_sys("waitpid error");

?

? ? /*

?? ? * We're the parent (the original process); we continue executing,

?? ? * knowing that we're not the parent of the second child.

?? ? */

? ? exit(0);

}

執(zhí)行結(jié)果:

NewImage

結(jié)果分析:

在這里我們fork了兩次,原因是,當(dāng)我們想fork一個(gè)子進(jìn)程出來(lái),而我們不希望父進(jìn)程阻塞在wait函數(shù),并且不希望由于父進(jìn)程沒(méi)有調(diào)用wait函數(shù)先退出導(dǎo)致子進(jìn)程成為僵尸進(jìn)程,那么fork兩次,并且退出第一個(gè)子進(jìn)程,可以使得父進(jìn)程及時(shí)退出,并且第二個(gè)子進(jìn)程的父進(jìn)程變成init進(jìn)程。

?

小結(jié)

本篇主要介紹了fork、vfork、僵尸進(jìn)程、wait和waitpid函數(shù),這些在unix環(huán)境中都是很重要的概念和函數(shù),并且在面試中也經(jīng)常問(wèn)到。

下一篇的內(nèi)容包括:

  • 解釋器文件(interpreter files)
  • 系統(tǒng)調(diào)用(system function)

?

參考資料:

《Advanced Programming in the UNIX Envinronment 3rd》

?


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲欧美另类视频| 中文字幕人妻一区二区在线视频| 国产高中女学生第一次| 日韩成人精品在线观看| 精品国产自在久精品国产| 精品综合久久久久久8888| 国产日韩精品视频一区| 亚洲国产成人精品久久久国产成人一区| 波多野结衣大片| 国产精品99一区二区| 国产日韩高清一区二区三区在线| 欧美亚洲一区二区在线观看| 在线观看国产福利| 亚洲中文字幕无码不卡电影| 在线看免费毛片| 成人在线免费观看91| 中文字幕有码av| 成人久久久久久久久| 色诱女教师一区二区三区| 亚洲综合色噜噜狠狠| 在线免费观看电影网站入口| 蜜月aⅴ免费一区二区三区| 国产91精品一区二区麻豆网站| 92裸体在线视频网站| 国产欧美一区二区三区沐欲| a级免费视频| 美女91精品| 精品av在线播放| 亚洲精品久久久久久久久久久久久| 欧美一区二区三区视频在线观看| 国产精品区二区三区日本| 亚洲伊人色欲综合网| 精品国产免费人成在线观看| 亚洲永久精品在线观看| 国v精品久久久网| 欧美日韩在线电影| 日本少妇一区| 超碰国产精品久久国产精品99| 日本三级韩国三级欧美三级| 在线激情视频| 欧美在线视频导航| 91沈先生播放一区二区| zzijzzij亚洲日本成熟少妇| 亚洲大片在线观看| 校园激情久久| 中文在线综合| 香蕉免费毛片视频| 中文综合在线观看| 成人黄色免费电影| 国产欧美日韩在线看| 日本韩国欧美精品大片卡二| 精品一区二区三区免费播放| 5858s免费视频成人| 久久久久亚洲精品中文字幕| 亚洲国产精品久久久久蝴蝶传媒| 成人羞羞视频免费| 亚洲第一区第二区第三区| 日韩毛片在线看| 放荡的美妇在线播放| 欧美午夜不卡视频| 国产中文一区| jizz在线观看中文| 中文字幕人妻一区二区在线视频| 黄色大秀av大片| 国产精品久久久久久久久久久新郎| 欧美特黄一级片| 99久久精品免费看国产交换| 青青草国产成人a∨下载安卓| 性生活免费在线观看| 91久久国产综合久久蜜月精品| 欧美风情在线视频| 亚洲老妇xxxxxx| 国产欧美一区二区三区久久| 国产口爆吞精一区二区| 五月婷婷激情视频| 精品久久久无码中文字幕| h版电影在线播放视频网址| 亚洲欧洲日产国码二区| 首播影院在线观看免费观看电视| 亚洲精品综合精品自拍| 天堂资源在线中文精品| 亚洲xxxx在线| 亚洲最新永久观看在线| 一本色道久久综合亚洲| 一插菊花综合| 欧产日产国产精品视频| 国产对白叫床清晰在线播放| 中文字幕欧美在线| 国产激情久久久久久熟女老人av| 精品人妻一区二区三区换脸明星| 亚洲精品福利在线观看| 91av国产在线| 国产精品免费一区二区三区| 蜜臀av亚洲一区中文字幕| 国产精品久久影院| 99精品国产一区二区三区不卡| 国产乱码在线观看| 黄色网页在线观看| 色网站在线免费观看| 青青热久免费精品视频在线18| 黄色小视频免费| 色av一区二区| 欧美日韩综合一区二区三区| 国产精品成人av| 色偷偷久久一区二区三区| 国产一区二区小视频| 精品久久久久久久久久久久久久久久久| 亚洲国产一区二区精品专区| 伊人网站在线| 免费一区二区| 一起操在线播放| 国产精品一区久久| 玛丽玛丽电影原版免费观看1977| 欧美激情欧美激情| 欧美日韩激情视频| 特级西西人体高清大胆| 成人在线观看免费播放| 一区二区视频在线观看免费的| 一二三四区在线| 韩国三级成人在线| 在线观看的日韩av| 女子免费在线观看视频www| 久久久久成人精品免费播放动漫| 国产精品高潮久久久久无| 欧美激情久久久久久久| 一区二区三区激情| av电影在线网| 国产草草影院ccyycom| 大地资源二中文在线影视观看| 国产在线看片免费视频在线观看| 午夜国产福利一区二区| 欧美在线观看不卡| jizz一区二区三区| 在线观看黄色小视频| 色天使综合视频| 国产秒拍福利视频露脸| 日韩av影视大全| 中文字幕在线播放日韩| 欧美成人sm免费视频| 精品国产伦一区二区三区| 在线精品国精品国产尤物884a| 亚洲精品在线a| 日韩欧美国产精品一区二区三区| 久久中文字幕视频| 美国黄色a级片| 国产欧亚日韩视频| 欧美日本啪啪无遮挡网站| 免费观看国产视频在线| 亚洲成a人片77777kkkk| 免费观看国产精品视频| 国产又大又黄又爽| yellow91字幕网在线| 亚洲欧洲av在线| 在线播放你懂的| 香蕉视频亚洲一级| 国产欧美在线观看视频| 色婷婷免费视频| 日本一卡二卡在线播放| 欧美日韩视频| 国产精品久久久久久亚洲av| 再深点灬舒服灬太大了添少妇视频| 久久亚洲国产精品日日av夜夜| 亚洲一二三四视频| 亚洲国内高清视频| 亚欧精品一区二区三区| 日韩在线高清视频| 欧美激情aⅴ一区二区三区| av男人天堂av| 99在线观看视频| 裸体在线国模精品偷拍| 欧美成人精品一区二区综合免费| 中文字幕免费高清电视剧网站在线观看| 日本三级片在线观看| 天堂在线资源库| 国产 日韩 欧美 精品| 在线观看福利片| 久久久久国产免费| 天天综合在线视频| 久久香蕉国产| 免费网站看av| 亚洲精品粉嫩美女一区| 性欧美丰满熟妇xxxx性仙踪林| 亚洲国产日韩欧美在线| 国产丝袜在线精品| 天堂99x99es久久精品免费| 亚洲国产综合一区| 国产欧美亚洲视频| 欧美一区二区色| 97在线观看免费| 久久精品国产综合| 亚洲主播在线| 91美女精品| 91久久精品美女高潮| 日韩激情视频一区二区| 精品久久久久久中文字幕一区奶水| 天堂在线中文在线| 26uuu国产精品视频| 日韩视频一区二区三区四区| 蜜桃av免费在线观看| 99久久精品国产色欲| 欧美日韩国产中文字幕| 中文字幕无码日韩专区免费| 992kp快乐看片永久免费网址| 欧美办公室脚交xxxx| 国产剧情一区二区| 在线观看亚洲电影| 久久uomeier| 全彩无遮挡全彩口工漫画h#| 欧美精品一区二区三区久久久| 99九九99九九九99九他书对| 中文字幕免费在线播放| free性欧美69巨大| 18av千部影片| 国产精品免费久久久久影院| 6080国产精品一区二区| 精品国内二区三区| 久久一区二区三区欧美亚洲| 91丝袜在线观看| 漂亮人妻被黑人久久精品| 成人免费自拍视频| 一区久久精品| 三级短视频在线| 波多野结衣视频网站| 另类色图亚洲色图| 91精品国产调教在线观看| 中国一级大黄大黄大色毛片| 欧美吻胸吃奶大尺度电影| 免费看h片网站| 日本福利一区二区三区| 99www免费人成精品| 国产欧美久久久久久久久| 亚洲精品国产一区二| 黄色av网站免费在线观看| 免费看黄裸体一级大秀欧美| 超碰精品一区二区三区乱码| 91丨九色丨尤物| 韩国女主播一区二区三区| 在线电影院国产精品| 欧美在线观看日本一区| 一区 二区 三区| 国产精品视频500部| 99在线视频首页| 精品国产网站| 亚洲精品一区二区久| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美少妇bbb| 国产在线播放av| 欧美日本一区| 色菇凉天天综合网| c++连点器| chien国产乱露脸对白| 色偷偷88888欧美精品久久久| 国产精品网站在线| 丁香影院在线| 色爱区成人综合网| 日韩欧美在线视频日韩欧美在线视频| 国产精品三级在线观看无码| 热99re久久精品精品免费| 亚洲精品成人av久久| 18videosex性欧美麻豆| 欧美理论在线播放| 午夜精品久久久久久久久| www免费在线观看| 国产亚洲视频中文字幕视频| 性欧美xxxx大乳国产app| 国产综合色一区二区三区| 99久久夜色精品国产亚洲| 久久99精品久久久久久青青日本| 97精品久久久久中文字幕| www.xxx亚洲| 欧美日韩亚洲综合一区二区三区激情在线| 久久久久久久久久久久久国产| 亚洲第一精品久久忘忧草社区| 欧美日韩高清在线| av资源新版天堂在线| 同性恋视频网站资源| 欧洲美女7788成人免费视频| 亚洲国产一区二区久久久777| 国产在线观看网站| 国产精品免费久久久久久| 在线国产福利| 在线视频影院| 国产精品186在线观看在线播放| 亚洲国产欧美日本视频| 国产日韩精品在线看| 久久人人爽爽人人爽人人片av| 久久人妻免费视频| www.四虎精品| 国产美女久久精品香蕉69| 日日摸.com| 国产精品久久久免费视频| 国产女主播喷水高潮网红在线| 99国产精品久久久| 日韩不卡一二三区| 欧美在线视频第一页| 国产人妖一区二区| 黄色一级大片免费| 少妇饥渴放荡91麻豆| 久久精品国产亚洲av麻豆| 国产一区二区三区在线观看网站| 超碰cao国产精品一区二区| 欧美日高清视频| 国产精品天天狠天天看| 欧美精品videosex性欧美| 7777精品久久久大香线蕉小说| 欧美国产日韩一区二区| 久久影院视频免费| 日韩国产一区二区三区| 亚洲无线视频| 91免费精品视频| 亚洲 自拍 另类小说综合图区| 亚洲乱码日产精品bd在线观看| 成人影院一区二区三区| 国产一区二区成人| 成人精品在线播放| 国产探花在线精品一区二区| 不卡一区视频| 国产精品免费视频一区一| 亚洲a v网站| 2019中文字幕全在线观看| 一本色道精品久久一区二区三区| 久久精品国产v日韩v亚洲| 亚洲无码精品在线播放| 久久机这里只有精品| 激情五月六月婷婷| 国产精品精华液网站| 成人av网站观看| 免费91麻豆精品国产自产在线观看|