黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

使用 UNIX System V IPC 機制共享應用程序數據

瀏覽:2日期:2024-06-13 08:16:49

引言

Unix 內核管理的進程自主地操作,從而產生更穩定的系統。然而,每個開發人員最終都會遇到這樣的情況,即其中一組進程需要與另一組進程通信,也許是為了交換數據或發送命令。這種通信稱為進程間通信(Inter-Process Communication,IPC)。System V (SysV) UNIX 規范描述了以下三種 IPC 機制,它們統稱為 SysV IPC:

消息隊列

信號量

共享內存

此外,進程還可以通過其他機制通信,例如:

讀、寫和鎖定文件

信號

套接字

管道

FIFO(先進先出)

這后一組機制一般也稱為 IPC。由于其簡單性和有效性,本文將集中于 SysV IPC 方法。

了解 SysV 模型

三種 SysV IPC 方法具有類似的語法,盡管它們具有不同的用途。一般情況下,它們執行以下操作:

確定要用于 ftok(3) 的正確 IPC 密鑰。

分別使用 msgget(2)、semget(2) 或 shmget(2) 獲得用于消息隊列、信號量或共享內存的特定于 IPC 的標識符,這些標識符與 IPC 密鑰相關聯。

使用 msgctl(2)、semctl(2) 或 shmctl(2) 修改 IPC 實例的屬性。

利用特定的 IPC 實例。

最后,使用 msgctl(2)、semctl(2) 或 shmctl(2) 和 IPC_RMID 標志銷毀 IPC 實例。

每個 IPC 實例都被賦予一個標識符,以將它與系統上存在的其他 IPC 實例區分開來。例如,兩個不同的應用程序可能分別決定使用共享內存段,因此系統范圍的 IPC ID 將區分這兩個實例。雖然可能不是那么明顯,但是第一個挑戰就是弄清如何分發這樣的信息:即如何在沒有準備某種 IPC 機制的情況下附加到一個公共 IPC 實例。

ftok 庫調用使用某個給定文件中的索引節點信息和一個唯一標識符來得出一個密鑰,只要該文件存在并且該標識符為常量,此密鑰就保持相同。因此,兩個進程可以使用它們的配置文件和編譯時常量來得出相同的 IPC 密鑰。常量的存在允許同一個應用程序通過改變常量來創建 IPC 機制的多個實例。

在一組進程獨立得出各自的 IPC 密鑰之后,它們必須使用某個 get 系統調用來獲得與該特定 IPC 實例關聯的特定標識符。各個 get 調用全都需要 IPC 密鑰和一組標志,以及一些信號量和共享內存大小信息。由于 Unix 是多用戶系統,標志將包括熟悉的八進制形式的文件權限(因此 666 意味著任何人都可以執行讀和寫)。如果還設置了 IPC_CREAT 標志,則會在 IPC 實例不存在時創建該實例。如果沒有設置 IPC_CREAT 標志并且還未創建 IPC 實例,則 get 調用將返回錯誤。

對于能夠自己分發 IPC 實例標識符的應用程序,存在一種用于執行該任務的更簡單方法。如果您在調用 get 以創建 IPC 時使用密鑰 IPC_PRIVATE,則實例標識符將是唯一的。需要附加到該 IPC 的其他進程不需要調用 get,因為它們已經擁有該標識符。

一旦擁有了標識符,應用程序就可以任意使用 IPC 實例。每種 IPC 方法都是不同的,并在它們各自的部分中進行處理。

通過隊列傳遞消息

消息隊列提供了一種機制,使得一個進程可以發送另一個進程能夠獲得的消息。在獲得該消息之后,將從隊列中刪除該消息。消息隊列非常獨特,因為兩個進程不必同時存在——一個進程可以發送一個消息并退出,而該消息可以在數天后才被另一個進程獲得。

消息必須由一個長整數后面跟著消息數據組成。清單 1 顯示了 C 語言中的這樣一個結構,其中使用了一個 100 字節的消息。

清單 1. 示例消息的 C 語言定義

struct mq_message {long type; /* The type or destination */char text[100]; /* Data */};

消息接收者使用消息類型。當從隊列輪詢消息時,您可以選擇第一個可用的消息,或者可以查找某種特定的消息類型。將要使用的消息類型特定于應用程序,從而使得隊列獨特于其他形式的 IPC,因為內核通過讀取 type 字段,從而在一定程度上了解所傳遞的應用程序數據。

清單 2 顯示了消息隊列的消息提交部分。

清單 2. 向消息隊列提交消息的程序

#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#include <string.h>#include <stdio.h>int main (void) {key_t ipckey;int mq_id;struct { long type; char text[100]; } mymsg;/* Generate the ipc key */ipckey = ftok("/tmp/foo", 42);printf("My key is %dn", ipckey);/* Set up the message queue */mq_id = msgget(ipckey, IPC_CREAT | 0666);printf("Message identifIEr is %dn", mq_id);/* Send a message */memset(mymsg.text, 0, 100); /* Clear out the space */strcpy(mymsg.text, "Hello, world!");mymsg.type = 1;msgsnd(mq_id, &mymsg, sizeof(mymsg), 0);}

清單 2 中的代碼包括了必要的頭文件,然后定義了將在 main 函數中使用的變量。第一要務是使用 /tmp/foo 作為命令文件和使用數字 42 作為 ID 來確定 IPC 密鑰。出于演示的目的,這里使用 printf(3c) 將密鑰顯示在屏幕上。接下來,該代碼使用 msgget 創建消息隊列。msgget 的第一個參數是 IPC 密鑰,第二個參數是一組標志。在該示例中,標志包括八進制權限(該權限允許具有 IPC 密鑰的任何人完全使用該 IPC)和 IPC_CREAT 標志(此標志導致 msgget 創建隊列)。同樣,結果被打印到屏幕上。

將消息發送到隊列是非常簡單的。在對消息中的內存空間清零之后,將一個熟悉的字符串復制到緩沖區的文本部分。將消息類型設置為 1,然后調用 msgsnd。msgsnd 預期接受的參數為隊列 ID、一個指向數據的指針和數據的大小,以及一個指示是否阻塞該調用的標志。如果該標志為 IPC_NOWAIT,則即使隊列已滿,該調用也會返回。如果該標志為 0,則調用將阻塞,直至隊列上的空間被釋放、隊列被刪除或應用程序收到某個信號。

該過程的客戶端行為與此類似。清單 3 顯示了檢索服務器發送的消息的代碼。

清單 3. 用于從隊列檢索消息的代碼

#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#include <string.h>#include <stdio.h>int main (void) {key_t ipckey;int mq_id;struct { long type; char text[100]; } mymsg;int received;/* Generate the ipc key */ipckey = ftok("/tmp/foo", 42);printf("My key is %dn", ipckey);/* Set up the message queue */mq_id = msgget(ipckey, 0);printf("Message identifIEr is %dn", mq_id);received = msgrcv(mq_id, &mymsg, sizeof(mymsg), 0, 0);printf("%s (%d)n", mymsg.text, received);}

獲得 IPC 密鑰和消息隊列標識符的過程與服務器的代碼類似。對 msgget 的調用不指定任何標志,因為服務器已經創建了隊列。如果應用程序的設計允許客戶端在服務器之前啟動,則客戶端和服務器都必須指定權限和 IPC_CREAT 標志,以便其中首先啟動的應用程序創建隊列。

然后 mq_clIEnt.c 調用 msgrcv 以從隊列提取消息。前三個參數指定消息隊列標識符、指向將包含消息的內存空間的指針和緩沖區的大小。第四個參數是類型參數,它允許您選擇所要獲得的消息:

如果類型為 0,則返回隊列中的第一個消息。

如果類型為正整數,則返回隊列中的第一個該類型的消息。

如果類型為負整數,則返回隊列中具有最小值的第一個消息,且該最小值小于或等于指定類型的絕對值。例如,如果要將 2 然后再將 1 添加到隊列,則使用類型 -2 調用 msgrcv 將返回 1,因為它最小,盡管它是隊列中的第二個消息。

傳遞給 msgrcv 的第五個參數同樣是阻塞標志。清單 4 顯示了實際操作中的客戶端和服務器。

清單 4. 客戶端和服務器代碼的輸出

sunbox$ ./mq_serverMy key is 704654099Message identifier is 2sunbox$ ./mq_clientMy key is 704654099Message identifier is 2Hello, world! (104)

客戶端和服務器的輸出表明,它們得出了相同的 IPC 密鑰,因為它們都引用同一個文件和標識符。服務器創建了 IPC 實例,內核為該實例分配了值 2,并且客戶端應用程序知道這一點。這樣,客戶端從消息隊列提取回“Hello, world!就沒什么奇怪的了。

此示例顯示了最簡單的情況。消息隊列對于短期進程是有用的,例如將工作提交給重負荷后端應用程序(例如某個批處理應用程序)的 Web 事務。客戶端也可以是服務器,并且多個應用程序可以向隊列提交消息。消息類型字段允許應用程序將消息發送給特定的讀取器。

使用信號量鎖定資源

進程之間的通信不需要涉及到發送大量的數據。實際上,單個位可能就足以指示某個進程在使用某個資源。請考慮兩個需要訪問某個硬件部分的進程,但是一次只有一個進程能夠使用該硬件。每個進程就包含引用計數器的點達成一致。如果一個進程讀取該計數器并看到其值為 1,則它就知道另一個進程正在使用該硬件。如果該計數器的值為 0,則該進程就可以自由使用該硬件資源,前提是在該硬件操作期間將計數器設置為 1 并在結束操作時將其重置為 0。

此場景存在兩個問題:第一個問題不過就是設置共享計數器并就其位置達成一致,再沒有比這麻煩的了。第二個問題是鎖定硬件資源所需要的獲取和設置操作不是原子的。如果一個進程在讀取計數器時,其值為 0,但是在它還沒有機會將計數器設置為 1 之前,另一個進程已搶先讀取了該計數器,則第二個進程就能夠讀取和設置計數器。兩個進程都會認為它們可以使用該硬件。沒有辦法知道另一個或其他進程是否會設置該計數器。這稱為爭用條件。信號量通過提供一個公共應用程序接口,以及通過實現原子測試和設置操作,從而同時解決了這兩個問題。

信號量的 SysV 實現比上述解決方案更通用。首先,信號量的值不需要是 0 或 1;它可以是 0 或任何正數。其次,可以執行一系列信號量操作,與用于 msgrcv 的 type 參數非常類似。這些操作作為一個指令集提供給內核,并且這些指令要么全部運行,要么一個也不會運行。內核要求將這些指令放在一個名為 sembuf 的結構中,該結構具有以下成員(按順序):

sem_num:描述正在操作該集合中的哪一個信號量。

sem_op:一個有符號整數,其中包含要執行的指令或測試。

sem_flg:熟悉的 IPC_NOWAIT 標志(它指示測試應該立即返回還是阻塞直至通過)和 SEM_UNDO(它在進程提前退出時導致撤銷該信號量操作)的組合。

sem_op 是放置許多配置的地方:

如果 sem_op 為 0,則測試 sem_num 以確定它是否為 0。如果 sem_num 為 0,則運行下一個測試。如果 sem_num 不為 0,則在未設置 IPC_NOWAIT 時,操作將阻塞直至信號量變為 0,而在設置了 IPC_NOWAIT 時,則跳過其他測試。

如果 sem_op 是某個正數,則將信號量的值加上 sem_op 的值。

如果 sem_op 是一個負整數,并且信號量的值大于或等于 sem_op 的絕對值,則從信號量的值減去該絕對值。

如果 sem_op 是一個負整數,并且信號量的值小于 sem_op 的絕對值,則在 IPC_NOWAIT 為 true 時立即停止測試的執行,而在該值為 false 時則阻塞,直至信號量的值變得大于 sem_op 的絕對值。

清單 5 中的示例闡明了信號量的使用,其中研究了一個可同時運行多次的程序,但是該程序確保一次只有一個進程處于關鍵部分。其中使用了簡單情況下的信號量;當信號量的值為 0 時釋放資源。

清單 5. 使用信號量來保護關鍵部分

#include <sys/types.h>#include <sys/sem.h>#include <sys/ipc.h>#include <string.h> /* For strerror(3c) */#include <errno.h> /* For errno */#include <unistd.h> /* rand(3c) */#include <stdio.h>int main (int argc, char **argv) {key_t ipckey;int semid;struct sembuf sem[2]; /* sembuf defined in sys/sem.h *//* Generate the ipc key */ipckey = ftok("/tmp/foo", 42);/* Set up the semaphore set. 4 == READ, 2 == ALTER */semid = semget(ipckey, 1, 0666 | IPC_CREAT);if (semid < 0) {printf("Error - %sn", strerror(errno));_exit(1);}/* These never change so leave them outside the loop */sem[0].sem_num = 0;sem[1].sem_num = 0;sem[0].sem_flg = SEM_UNDO; /* Release semaphore on exit */sem[1].sem_flg = SEM_UNDO; /* Release semaphore on exit */while(1) { /* loop forever */printf("[%s] Waiting for the semaphore to be releasedn", argv[1]);/* Set up two semaphore operations */sem[0].sem_op = 0; /* Wait for zero */sem[1].sem_op = 1; /* Add 1 to lock it*/semop(semid, sem, 2);printf("[%s] I have the semaphoren", argv[1]);sleep(rand() % 3); /* Critical section, sleep for 0-2 seconds */sem[0].sem_op = -1; /* Decrement to unlock */semop(semid, sem, 1);printf("[%s] Released semaphoren", argv[1]);sleep(rand() % 3); /* Sleep 0-2 seconds */}}

清單 5 的開頭與消息隊列示例的開頭相同。其中 msgget 在第二個參數中指定消息隊列的大小,semget 指定信號量集(Semaphore Set) 的大小。信號量集是一組共享一個公共 IPC 實例的信號量。該集合中的信號量數量無法更改。如果已經創建了信號量集,則 semget 的第二個參數實際上被忽略。如果 semget 返回一個指示失敗的負整數,則打印原因,并退出程序。

在主 while 循環之前,對 sem_num 和 sem_flg 進行了初始化,因為它們在整個示例中保持一致。此外還指定了 SEM_UNDO,以便在信號量擁有者未能釋放該信號量就已退出的情況下,不會鎖定所有其他應用程序。

該循環中還打印了一個狀態消息,以指示應用程序已開始等待信號量。此輸出附帶第一個命令行參數作為前綴,以將它與其他實例區分開來。在進入關鍵部分之前,應用程序鎖定了信號量。此示例中指定了兩個信號量指令。第一個為 0,意味著應用程序將等待,直至信號量值恢復為 0。第二個為 1,意味著在信號量恢復為零之后,將向該信號量加 1。應用程序調用 semop 以運行指令,并向其傳遞信號量 ID、數據結構的地址和要使用的 sembuf 指令數量。

在 semop 返回以后,應用程序知道它已經鎖定了信號量,并打印一個消息以指示這一點。然后關鍵部分將會運行,在此例中是隨機地暫停幾秒。最后,使用 semop 值 -1 來運行單個 sembuf 命令,從而釋放信號量,這實際上是從信號量減去 1,并將其值恢復為 0。隨后打印更多的調試輸出,應用程序隨機暫停,然后繼續執行。清單 6 顯示了此應用程序的兩個實例的輸出。

清單 6. 兩個使用信號量來保護關鍵部分的程序

sunbox$ ./sem_example a & ./sem_example b &[a] Waiting for the semaphore to be released[a] I have the semaphore[b] Waiting for the semaphore to be released[a] Released semaphore[b] I have the semaphore[a] Waiting for the semaphore to be released[b] Released semaphore[a] I have the semaphore[a] Released semaphore[a] Waiting for the semaphore to be released[a] I have the semaphore

清單 6 顯示了運行的示例的兩個實例,這兩個實例分別具有名稱 a 和 b。首先,a 獲得信號量,在 a 擁有該信號量的同時,b 嘗試獲得一個鎖。一旦釋放了信號量,b 即獲得鎖。現在情況顛倒過來,變為等待 b 完成。最后,a 在信號量被釋放后再次獲得該信號量,因為 b 沒有等待。

關于信號量,要注意的最后一個事項在于,它們被稱為建議鎖(Advisory Lock)。這意味著信號量本身并不阻止兩個進程同時使用同一個資源;相反,它們旨在建議任何進程自愿詢問該資源是否正在使用。

共享內存空間

共享內存也許是最強大的 SysV IPC 方法,并且此方法最容易實現。顧名思義,共享內存是在兩個進程之間共享一個內存塊。清單 7 顯示了一個程序,該程序調用 fork(2) 來將自身劃分為一個父進程和一個子進程,兩個進程之間使用一個共享內存段進行通信。

清單 7. 演示共享內存用法的程序

#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <unistd.h>#include <string.h>#include <errno.h>int main(void) {pid_t pid;int *shared; /* pointer to the shm */int shmid;shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);if (fork() == 0) { /* Child *//* Attach to shared memory and print the pointer */shared = shmat(shmid, (void *) 0, 0);printf("Child pointer %pn", shared);*shared=1;printf("Child value=%dn", *shared);sleep(2);printf("Child value=%dn", *shared);} else { /* Parent *//* Attach to shared memory and print the pointer */shared = shmat(shmid, (void *) 0, 0);printf("Parent pointer %pn", shared);printf("Parent value=%dn", *shared);sleep(1);*shared=42;printf("Parent value=%dn", *shared);sleep(5);shmctl(shmid, IPC_RMID, 0);}}

您現在應該已經熟悉傳遞給 shmget 的參數了:密鑰、大小和標志。此示例中的共享內存大小是單個整數。清單 7 與前一個示例的不同之處在于它對 IPC 密鑰使用了 IPC_PRIVATE。當使用了 IPC_PRIVATE 時,將保證創建一個唯一的 IPC ID,并且預期應用程序將自己分發該 ID。在此示例中,父進程和子進程都知道 shmid,因為它們分別是對方的副本。fork 系統調用創建當前進程的第二個副本,稱為子進程,此進程幾乎與父進程完全相同。兩個進程的執行都在 fork 之后恢復。返回值將用于確定當前進程是父進程還是子進程。

父進程和子進程看起來相似。首先,shmat 系統調用被用于獲得指向共享內存段的指針。shmat 需要共享內存 ID、一個指針和某些標志。該指針用于請求特定的內存地址。通過傳遞 0,內核可以隨心所欲地選擇任何內存地址。標志大部分是特定于供應商的,不過 SHM_RDONLY 是一個公共標志,用于指示不寫入的段。如清單 7 所示,shmat 的常見用法是讓內核決定一切。

shmat 返回一個指向共享內存段的指針,此示例出于調試目的而將其打印到了屏幕上。然后每個進程依次修改該共享內存段,并打印出值。最后,父進程使用 shmctl(2) 來刪除共享內存段。清單 8 顯示了此程序的輸出。

清單 8. 共享內存示例的輸出

sunbox$ ./shared_memoryChild pointer ff390000Child value=1Parent pointer ff380000Parent value=1Parent value=42Child value=42

您可以從輸出中看到相同內存空間的共享。起初,共享內存中的值為 1,這是由子進程設置并由父進程讀取的。然后父進程將該值設置為 42,并由子進程讀取。請注意,父進程和子進程擁有指向共享內存段的不同指針地址,盡管它們是在訪問相同的物理內存。在使用物理地址時,這會導致某些數據結構出現問題,例如鏈表,因此當您在共享內存中構建復雜結構時,可以使用相對尋址。

此示例依賴在一個進程向共享內存寫入時,另一個進程暫停。在實際應用程序中,這是不切實際的,因此,如果您的應用程序可能潛在地擁有多個向相同內存位置執行寫入的進程,可以考慮使用信號量來鎖定該區域。

結束語

Unix 提供了若干種用于 IPC 的方法。SysV IPC 方法是消息隊列、信號量和共享內存。消息隊列允許一個應用程序提交消息,其他應用程序可以在以后獲得該消息,甚至是在發送應用程序已結束之后。信號量確保多個應用程序可以鎖定資源并避免爭用條件。共享內存允許多個應用程序共享一個公共內存段,從而提供了一種傳遞和共享大量數據的快速方法。您還可以將這些方法結合起來使用。例如,您可以使用信號量來控制對共享內存段的訪問。

IPC 方法對應用程序開發人員非常有用,因為它們提供了應用程序之間的標準通信方法,并且是跨不同 UNIX 風格可移植的。當您下次發現自己需要鎖定資源或在進程之間共享數據時,可以試驗一下 SysV IPC 機制。

標簽: Unix系統
主站蜘蛛池模板: www.五月激情| 乌克兰少妇videos高潮 | 亚洲人吸女人奶水 | 久久精品中文字幕大胸 | 一本一本久久a久久精品综合麻豆 | 黄色片子视频 | 激情久久网 | 偷妻h高h短篇| 国产精品久久久久久久久毛片 | 国产性猛交╳xxx乱大交 | 日产国产精品亚洲系列 | 欧美综合77777色婷婷 | 岛国片在线播放97 | 亚洲欧美日韩国产精品一区午夜 | 中文字幕亚洲欧美 | 久久黄色网址 | 国产精品99久久久久人最新消息 | 夜夜爽夜夜叫夜夜高潮漏水 | 97免费公开在线视频 | 免费看日批视频 | 99er在线 | 6―13呦精品 | 久久久久久香蕉 | 欧美成人a交片免费看 | 少妇玉梅抽搐呻吟 | 亚洲专区一区 | 嫩草影院ncyy入口 | 五月天激情四射 | 中文字幕在线观看网址 | 伊伊亚洲综合人网777 | 凹凸精品熟女在线观看 | 午夜国产片 | 九九热综合 | 国产成人精品亚洲午夜麻豆 | 国产精品日本欧美一区二区三区 | 成人天堂资源www在线 | 亚洲黄色在线视频 | 24小时日本在线www免费的 | 中国一级免费毛片 | 亚洲视频一二三 | 人妻系列av无码专区 | 日韩免费三级 | 少妇放荡的呻吟干柴烈火动漫 | 18禁网站免费无遮挡无码中文 | 色片在线免费观看 | 精品免费国产一区二区三区四区 | 中文无码精品a∨在线观看不卡 | 免费观看又色又爽又黄的传媒 | 亚洲一级在线观看 | 在线观看av不卡 | 伊人久久大香线蕉综合5g | 亚洲婷婷综合色高清在线 | 国产乱论视频 | 人妻精品久久无码区 | 韩日精品视频在线观看 | 中文字幕女优 | 日本国产视频 | 超碰综合网| 亚洲人高潮女人毛茸茸 | 狠狠色噜噜狠狠狠狠米奇7777 | 亚洲老妈激情一区二区三区 | 变态孕妇孕交av免费看 | jizz性欧美15 | 粉嫩av国产一区二区三区 | 国产色视频在线播放 | 超级av在线天堂东京热 | 国产色婷婷五月精品综合在线 | 国产精品女同一区二区软件 | 日韩精品在线观看免费 | 性欧美69 | аⅴ资源新版在线天堂 | 久久久久欠精品国产毛片国产毛生 | 3d动漫精品啪啪一区二区下载 | 国产良妇出轨视频在线观看 | 99国产一区 | 国内国外精品影片无人区 | 久久久精品欧美一区二区免费 | yy111111少妇影院免费观看 | 又污又黄又爽的网站 | 嫩草嫩草嫩草嫩草嫩草 | 伦理一国产a级 | 日韩精品人妻系列无码专区免费 | 国产无遮挡免费 | 福利小视频在线播放 | 在线的av| 天天摸夜夜添狠狠添婷婷 | 天堂综合在线 | 亚洲黄色一区二区 | wwwwww在线观看 | 欧美性久久 | 国产欧美69久久久久久9龙 | 爱逼综合网 | 一本色道久久综合亚洲精品按摩 | 男女裸体无遮挡做爰 | 中文字幕av在线免费观看 | 日韩中文字幕在线免费观看 | 久热国产精品视频一区二区三区 | 爆乳一区二区三区无码 | 日本肉体xxxx裸体137大胆图 | 牛牛在线视频 | 乱码人妻一区二区三区 | 日韩极品一区 | 日本高清视频wwww色 | 亚洲色欲色欲www在线丝 | 欧美爱爱视频 | 97超碰资源总站 | 免费无码一区二区三区蜜桃大 | 国产农村妇女aaaaa视频 | 在线观看黄色小视频 | 成人男同av在线观 | 青草国产精品久久久久久 | 一区在线免费观看 | 人人妻人人添人人爽日韩欧美 | 久伊人网 | 污污的视频在线观看 | 国产乱对白刺激在线视频 | 亚洲精品乱码久久久久久麻豆不卡 | 国产探花在线精品一区二区 | 欧美另类在线播放 | 少妇裸体做爰免费视频网站 | 亚洲日本va午夜中文字幕一区 | 亚洲国产成人久久综合 | 黄色福利视频 | 欧美性猛交乱大交 | 国产乱子伦农村xxxx | 久久久无码精品国产一区 | 欧美一卡二卡三卡 | 国产有码在线 | 欧美性xxxxx极品娇小 | 亚欧美一区二区三区 | 中文字幕高清免费日韩视频在线 | 日本三级欧美三级人妇视频黑白配 | 毛片首页| 欧美高清激情brazzers | 国内自拍第一页 | 精品久久久久久久免费人妻 | 成人免费播放视频 | 亚洲日韩一区二区三区 | 区二三区四区精华日产一线二线三 | 久久精品免费 | 全部免费毛片在线播放一个 | 九九热综合| 刘亦菲三级床视频大全 | 久久国产视频一区二区 | 97国产精品视频人人做人人爱 | 日韩在线国产 | 妺妺窝人体色www在线观看 | 国产黄av| 怡红院最新网址 | 国产精品高潮呻吟久 | 久青草视频在线 | 中文字幕免费在线 | 国产 日韩 欧美 制服丝袜 | 精品国产www| 欧美r级在线 | 自拍色图 | 特黄特色大片免费播放叫疼 | 成年人晚上看的视频 | av在线播放网 | 五月网| 四虎午夜影院 | 国产免费中文字幕 | 欧美性生交xxxxx | 麻豆国产va免费精品高清在线 | 日韩第四页 | 一个色综合网 | 亚洲美女黄色 | 欧美日韩一区二区三区不卡视频 | 伊人蕉久 | 国产淫语对白粗口video | 人妻聚色窝窝人体www一区 | 成人免费xxxxxx视频 | 波多野结衣一本 | 日韩在线视 | 中文字幕一区二区三区在线视频 | 动漫羞免费网站中文字幕 | 精品一区二区在线播放 | 精品久久久久久无码中文字幕 | 色欧洲| 免看一级片| 猫咪www免费人成人入口 | 亚洲精品视频播放 | 日韩欧美高清在线视频 | 精品国产一区二区三区久久狼黑人 | 欧美亚洲精品一区二区三区 | 国产一级av毛片 | 国产精品久久久久久人妻精品 | 亚洲精品久久久久一区二区三区 | 欧洲熟妇色xxxx欧美老妇老头多毛 | 久久久久久久蜜桃 | 日日噜噜夜夜狠狠久久av小说 | 国产女人18水真多18精品一级做 | 四虎影成人精品a片 | 日韩人妻熟女中文字幕a美景之屋 | 日韩大片免费 | 亚洲九九爱 | 熟女少妇a性色生活片毛片 熟人妇女无乱码中文字幕 熟透的岳跟岳弄了69视频 | 国产精品亚洲综合一区二区三区 | 日日爱99| 国产乱码精品一区二三赶尸艳谈 | 少妇撒尿一区二区在线视频 | 国产精品1区2区 | 内射国产内射夫妻免费频道 | 伊人国| 欧美高清视频一区二区三区 | 亚洲va韩国va欧美va | 夜夜嗨一区 | 国产精品久久久久久久久久综合 | 黑人爱爱视频 | av黄色在线免费观看 | 亚洲大尺度无码无码专区 | 亚洲女同av| 成人激情四射网 | 亚洲综合专区 | 91av福利视频| 日韩一区二区三区国产 | 国产免费叼嘿网站免费 | 91视频污在线观看 | 日韩综合在线 | 国产又粗又猛又爽又黄 | 性欧美巨大 | 亚洲无毛 | 亚洲日韩一页精品发布 | 成年女人免费v片 | 成人影片麻豆国产影片免费观看 | 欧美videos最新极品 | 久久久久色 | 妇女bbbbb撒尿正面视频 | 亚洲自拍偷拍av | 色婷婷香蕉在线一区二区 | 日本黄色片视频 | 无码人妻精品中文字幕 | 欧美成人秋霞久久aa片 | 少妇高潮九九九αv | 五月激情丁香婷婷 | 久久久91视频 | 中文字幕一区二区三区四区五区 | 日本久久久久久科技有限公司 | 人妻教师痴汉电车波多野结衣 | 国产三级91| 欧美激情一区二区在线观看 | 欧美视频一区二区 | 久久精品一二三区白丝高潮 | a免费毛片| 国产亚洲影院 | 日本性猛交 | 一级黄色大片在线观看 | 免费国产在线观看麻豆 | 亚洲美女毛片 | 无码乱肉视频免费大全合集 | 亚洲天天摸日日摸天天欢 | 东北少妇露脸无套对白 | 1级性生活片 | 日本乱淫视频 | 少妇和邻居做不戴套视频 | 久久日韩激情一区二区三区四区 | 亚洲男人天堂av | 成人涩涩软件 | 一本久道视频一本久道 | 日本高清视频网站www | 成人久久18免费网站 | 国产va免费精品高清在线观看 | 国产黄色在线网站 | 国产精品亚亚洲欧关中字幕 | 青草一区二区 | 日韩国产小视频 | 国产98视频 | 999久久久国产精品 999久久久精品 | xxnn成人免费视频 | 无码国产69精品久久久孕妇 | 国产老少配bbbb搡bbbb | 亚洲国产综合精品久久久久久 | 美女mm131爽爽爽免费动视频 | 97精品在线观看 | 国产精品v欧美精品v日韩精品v | 欧美激情a∨在线视频播放 欧美激情aaa | 成人国产精品久久久 | 偷拍中国夫妇高潮视频 | 国产又粗又猛又爽又黄的视频软件 | 欧美视频a | 国产精品国产馆在线真实露脸 | 天堂在线www中文 | 少妇伦子伦精品无吗在线观看 | 天天干视频在线观看 | 免费观看的无遮挡av | 免费看黄色av | 日出水了特别黄的视频 | 亚洲字幕在线观看 | 精品一区视频 | 国产视频在线观看网站 | 久久丁香网 | 99re8这里有精品热视频免费 | 中文字幕在线观看英文怎么写 | 四虎成人网 | а天堂中文最新一区二区三区 | 蜜桃日本免费看mv免费版 | 日本少妇白嫩猛烈进入免费视频 | 日本高清无卡码一区二区久久 | 人人射人人爱 | 国产自产区 | 自拍偷拍第一页 | 日本又黄又猛又爽免费视频 | 国产精品一区二区三区四区 | 成人wxx视频免费 | 后进极品白嫩翘臀在线播放 | 午夜毛片在线观看 | 国产播放隔着超薄丝袜进入 | 国产香蕉在线 | 国产干干干 | 夜夜爽妓女8888视频免费观看 | 久久精品国产精品亚洲蜜月 | 91视频在线免费观看 | 四色永久网址在线观看 | 日韩aⅴ片 | 狠狠色噜噜狠狠狠888奇米 | 天干夜天干夜天天免费视频 | 无码ol丝袜高跟秘书在线观看 | 少妇人妻av无码专区 | 国产影视一区 | 91精品国产乱码久久 | cao在线| 国产区在线看 | 精品在线播放视频 | 国产精品综合久久久精品综合蜜臀 | 亚洲欧美成人综合 | 日韩精品极品视频在线 | 亚洲国产精品久久久久婷婷老年 | 黄色在线播放 | 人妻激情偷乱视频一区二区三区 | 亚洲人人夜夜澡人人爽 | 国产午夜性爽视频男人的天堂 | 国产在线视频你懂的 | 美女穴穴 | 久久午夜夜伦鲁鲁一区二区 | 污免费在线观看 | 情人伊人久久综合亚洲 | 爽啪啪gif动态图第136期 | 欧美性猛交xxxⅹ丝袜 | 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产网站 | 久久国产精品成人免费 | 超级乱淫视频 | 亚洲熟区 | 国产免费网 | 一级黄色片网站 | 亚洲精品中文字幕久久久久下载 | 免费亚洲视频 | 人人妻人人做人人爽 | 久久无吗视频 | 日韩不卡在线观看 | 国产精品久久久久久久久久久久久久久久久 | 无码人妻丰满熟妇区五十路 | 日本熟伦人妇xxxx | 美国三级日本三级久久99 | 蜜臀av色欲a片无码精品一区 | 欧美日韩一区免费 | 日本边添边摸边做边爱的网站 | 韩国性猛交╳xxx乱大交 | 色欧美日韩 | 久久丫精品久久丫 | 精品一卡二卡 | 欧美wwwxxxx | 一边吃奶一边做爰爽到爆视频 | 农村寡妇一区二区三区 | 羽月希奶水一区二区三区 | 潮喷失禁大喷水无码 | 国产乱码一区 | 性生交大片免费看视频 | 在线 国产 欧美 亚洲 天堂 | 亚洲欧美另类久久久精品 | 一久久久久 | 午夜激情视频网站 | 一级视频免费观看 | 一二三国产精品 | 免费国精产品—品二品 | 亚洲在线视频 | 欧美人与性动交α欧美精品 | 久久人人爽天天玩人人妻精品 | 国产精品91在线 | 老头吃奶性行交 | av无毛| 成人极品视频 | 国产成人精品一区二区三区无码 | 精品国产乱码久久久久久丨区2区 | 欧美视频一二区 | 国产性猛交xxxⅹ交酡全过程 | 九久久久久 | 日日噜噜夜夜狠狠va视频 | 五月婷婷免费视频 | 国产精品一区二区久久 | 亚洲精品久久久久9999吃药 | 日产精致一致六区麻豆 | 亚洲视频一二三四 | 日本少妇呻吟高潮免费看 | 美女裸奶100%无遮挡免费网站 | 亚洲人成亚洲人成在线观看 | 高清性色生活片97 | 欧美精品第20页 | 中文字幕一路线二路线三路线 | 熟妇人妻无乱码中文字幕真矢织江 | 伊人黄色 | 日日骚网 | 91福利专区 | 日韩精品极品视频 | 无翼乌口工全彩无遮挡h全彩 | 欧美日韩高清在线观看 | 久久99精品久久久久久 | 国产性一乱一性一伧一色 | 国产一区二区三区小说 | 亚洲在线视频观看 | 亚洲一区二区三区四区在线 | 国产成人三级一区二区在线观看一 | 黄色小视频免费网站 | 国模精品一区 | 色多多福利网站免费破解 | 精品亚洲欧美无人区乱码 | 国产人妻人伦精品1国产盗摄 | 亚洲a级在线观看 | 国内精品久久久久影院一蜜桃 | 日韩超碰人人爽人人做人人添 | 国产亚洲欧美一区二区 | 亚洲图片在线播放 | 国产第一页在线 | 成人黄网站片免费视频 | 日韩中文字幕观看 | 欧美成人看片黄a免费看 | 日本黄色一级网站 | 国产成人毛片在线视频 | 强奷乱码中文字幕熟女导航 | 狠狠网| 中文字幕日本精品一区二区三区 | 精品蜜臀久久久久99网站 | 69堂成人精品免费视频 | 亚洲午夜免费 | 三区中文字幕 | 91九色视频网站 | 日韩精品二区在线观看 | 另类重口aaa | 日韩不卡在线 | 最新成人av | 国产人与禽zoz0性伦免费 | 99精品欧美一区二区三区视频 | 一卡二卡久久 | 欧美极品少妇×xxxbbb | 亚洲中文字幕av在天堂 | 天天舔天天干 | 深田咏美在线x99av | 日韩高清不卡在线 | 91高清视频在线 | 亚洲免费在线观看 | 欧美成人免费一区二区三区视频 | 国产日韩不卡 | 国产精品久久久久久久久电影网 | 精品视频九九 | 精品午夜视频 | 波多野结衣一区二区三区av免费 | 国产精品久久人妻无码网站一区 | 精品国产乱码久久久久久三级人 | 91香蕉视频黄色 | 欧美一区二区三区四区五区 | 一本一本久久a久久精品牛牛影视 | 在线亚洲+欧美+日本专区 | 亚洲精品拍拍拍在线观看 | 久久国产主播 | 精品国产一区二区三区四区四 | 日产国产欧美视频一区精品 | 六月丁香啪啪 | 亚洲精品成人片在线播放 | 国产午夜精品一区二区三区嫩草 | 日日躁夜夜躁人人揉av五月天 | 欧美 日韩 国产 成人 在线 | 色欲网天天无码av | 欧美黄色大全 | 99久久久久久国产精品 | 国产精品中文久久久久久久 | 日本老头xxxx视频 | 欧美色xxxxx 欧美色插 | 欧美噜噜久久久xxx 欧美噜噜噜 | 欧美一区二区三 | 亚洲精品中文字幕乱码三区 | 一区二视频| 色拍拍在线精品视频 | 亚州视频一区二区三区 | 亚洲日本一区二区一本一道 | 亚洲爱爱av | 欧美一级特黄aa大片 | 国产精品3区 | 精品久久一区二区 | a免费在线 | 97视频人人| 欧美在线免费视频 | 麻豆精品自拍 | 国产免费黄色大片 | 色噜噜亚洲 | 少妇被躁爽到高潮 | 亚洲第一页综合 | 亚洲深夜福利视频 | 青草精品国产福利在线视频 | 欧美激情婷婷 | 亚洲一级黄色大片 | 天天噜夜夜噜 | 人妻人人澡人人添人人爽 | 免费人成在线观看 | 老司机av福利 | 精品国产乱码久久久久久108 | 香蕉成人在线视频 | 亚洲精品熟女国产 | 丝袜 国产 日韩 另类 美女 | 视频福利一区 | 成人免费影片 | 伊甸园成人入口 | 中国丰满少妇熟乱xxxx | 国内自拍av | 国产精品视频yjizz免费 | 91精品91| 色综合免费视频 | 全国最大成人免费视频 | 国产毛茸茸| 国产草逼av | 99热精品在线 | 日日干夜夜撸 | 青青导航 | 自拍三级 | 久草免费福利 | 日韩成人久久 | 91视频在线观看免费 | 无码人妻精品一区二区三区免费 | 在线观看91精品国产入口 | 免费久久久 | 免费一级做a爰片性视频 | 北岛玲在线 | 激情内射人妻1区2区3区 | 色情久久久av熟女人妻网站 | 成人午夜在线观看视频 | 国产婷婷一区二区三区 | 蜜桃免费在线视频 | 国产熟妇与子伦hd | 国产在线国产 | 欧美第一页草草影院 | 日韩av专区片 | 又黄又爽又高潮免费毛片 | 色综合久久久久久久久五月 | 少妇呻吟内裤揉搓水 | 真实国产精品视频400部 | 国产精品免费麻豆入口 | 涩涩涩999| 欧美韩国日本在线 | 狠狠做六月爱婷婷综合aⅴ 狠狠做深爱婷婷综合一区 狠久久 | 成av人电影在线观看 | 大地资源中文第3页 | 国产精品一级无遮挡毛片 | 色臀av | 怡红院毛片 | 黑人干亚洲 | 免费一级特黄3大片视频 | 毛片高清 | 色婷婷久久一区二区三区麻豆 | 亚洲成色在线 | 加勒比久久综合网天天 | 久草在线视频网站 | 久久艹精品| 国产区图片区一区二区三区 | 久久艹免费视频 | 成人羞羞国产免费图片 | 久草成人 | h 吃奶 呻吟 调教h | 中国xxxx性xxxx产国 | 中文成人无码精品久久久不卡 | 久久精品—区二区三区 | 无码人妻精品一区二区三区在线 | 日本中文字幕网站 | 亚洲色欲色欲www在线丝 | 一级高清免费毛片 | 最新中文字幕在线观看视频 | 国产自偷自偷免费一区 | 午夜视频福利在线观看 | 国产精品新婚之夜泄露女同 | 精品人伦一区二区三区蜜桃免费 | 国产日韩欧美二区 | 中文字幕在线观看日韩 | 青青草久草在线 | 激情婷婷综合网 | 狠狠色丁香婷婷久久综合考虑 | 中文字幕人妻无码系列第三区 | 99久久亚洲精品视香蕉蕉v | 国产疯狂伦交大片 | 波多野结衣一区二区三区在线观看 | 欧美福利专区 | 亚洲人成人一区二区在线观看 | 国产中老年妇女精品 | 蜜臀av免费一区二区三区久久乐 | 久久国产精品久久喷水 | 亚洲男人最新版本天堂 | 欧美 亚洲 国产 另类 | av小次郎收藏 | 日本妞一区 | 国产露脸4p交换视频观看 | 日批在线 | 精品一卡二卡三卡 | 99精品人妻少妇一区二区 | 国产有码在线 | 2024av天堂手机在线观看 | 四虎av网站 | 欧美69精品久久久久久不卡 | 久久久久三级 | 秋霞成人午夜鲁丝一区二区三区 | 伊人影院网 | 五月天激情国产综合婷婷婷 | 欧美区一区二区 | 精品少妇人妻av一区二区 | 中文字幕在线网址88第一页 | 在线麻豆视频 | www四虎com| 91丨九色丨国产在线 | 欧美深夜福利 |