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

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

UNIX高級(jí)環(huán)境編程(6)標(biāo)準(zhǔn)IO函數(shù)庫

2024-06-28 13:21:46
字體:
供稿:網(wǎng)友
UNIX高級(jí)環(huán)境編程(6)標(biāo)準(zhǔn)IO函數(shù)庫 - 流的概念和操作

標(biāo)準(zhǔn)IO函數(shù)庫隱藏了buffer大小和分配的細(xì)節(jié),使得我們可以不用關(guān)心預(yù)分配的內(nèi)存大小是否正確的問題。

雖然這使得這個(gè)函數(shù)庫很容易用,但是如果我們對(duì)函數(shù)的原理不熟悉的話,也容易遇到很多問題。

?

1 流和FILE實(shí)體(Streams and FILE Objects)

前面的章節(jié)中,IO集中在文件描述符,每一個(gè)打開的文件都對(duì)應(yīng)一個(gè)文件描述符,通過文件描述符對(duì)文件進(jìn)行操作。

現(xiàn)在使用了標(biāo)準(zhǔn)IO庫,討論的重點(diǎn)集中在流(streams)。

簡要了解一下流:

  • 當(dāng)我們打開或創(chuàng)建了一個(gè)文件,我們說我們有一個(gè)流和該文件關(guān)聯(lián)。
  • stream支持單字節(jié)字符集和多字節(jié)字符集。stream的屬性orientation決定使用單字符集還是多字符集。
  • 當(dāng)一個(gè)stream被創(chuàng)建時(shí),沒有指定orientation,這時(shí),當(dāng)使用寬字符集IO函數(shù)時(shí),流的orientation設(shè)置為支持寬字符集;當(dāng)使用單字符集IO函數(shù)時(shí),流的orientation設(shè)置為支持單字符集。

只有兩個(gè)函數(shù)可以修改流的orientation:

  • freopen會(huì)清除流的orientation;
  • fwide用來設(shè)置流的orientation。

fwide函數(shù)聲明:

#include <stdio.h>

#include <wchar.h>

int fwide(FILE* fp, int mode);

函數(shù)返回值:

  • 返回整數(shù)表示支持多字節(jié)字符集;
  • 返回負(fù)數(shù)表示支持單字節(jié)字符集;
  • 返回0表示沒有設(shè)置stream的orientation。

mode取值的不同決定函數(shù)fwide的不同的行為:

  • 如果mode為負(fù)數(shù),fwide試著設(shè)置指定流支持單字節(jié)字符集;
  • 如果mode為整數(shù),fwide試著設(shè)置指定流支持多字節(jié)字符集;
  • 如果mode為0,fwide不會(huì)試著設(shè)置流的orientation,但是會(huì)返回一個(gè)值代表當(dāng)前流的orientation。

當(dāng)我們打開一個(gè)流,函數(shù)fopen返回一個(gè)指向FILE對(duì)象的指針。FILE對(duì)象通常是一個(gè)結(jié)構(gòu)體,包含所有控制流所需要的信息,包括:

  • 實(shí)際IO所用的文件描述符;
  • 一個(gè)指向流所使用的buffer的指針;
  • buffer的大?。?/li>
  • 當(dāng)前在buffer中的字符數(shù);
  • error flag;
  • 等。

?

2 緩存(Buffering)

緩存(buffering)的作用是為了盡可能少地調(diào)用read和write系統(tǒng)調(diào)用。

標(biāo)準(zhǔn)IO庫提供三種類型的buffering:

完全緩存(Fully buffered):在這種緩存機(jī)制中,實(shí)際的IO操作發(fā)生在緩存被寫滿時(shí)。正在寫入硬盤的文件被完全緩存在buffer中。緩存空間往往在第一次IO操作時(shí)通過調(diào)用malloc函數(shù)獲??;

行緩存(Line buffered):在這種緩存機(jī)制中,實(shí)際的IO操作發(fā)生在新的一行字符被讀入或者輸出時(shí),所以允許每一次只輸出一個(gè)字符。行緩存有兩點(diǎn)需要注意:buffer的大小是固定的,所以即使當(dāng)前行沒有讀入或輸出結(jié)束,依然可能發(fā)生實(shí)際的IO,當(dāng)buffer被寫滿時(shí);一旦有輸入(從無緩存流或者行緩存流中輸入)發(fā)生,所以已在buffer中緩存的輸出流都會(huì)被立刻輸出(flush)。

flush:標(biāo)準(zhǔn)IO緩存中內(nèi)容立刻寫入硬盤或者輸出。在終端設(shè)備中,flush的作用也可能是丟棄緩存中得數(shù)據(jù)。

無緩存(Unbuffered):不緩存輸入或輸出內(nèi)容。例如,如果我們使用fputs函數(shù)輸出15個(gè)字符,那么我們希望這15個(gè)字符盡可能快地被打印出來。如標(biāo)準(zhǔn)錯(cuò)誤輸出就要求是無緩存輸出。

ISO C標(biāo)準(zhǔn)要求下面的緩存特性:

  1. 標(biāo)準(zhǔn)輸入輸出在不關(guān)聯(lián)交互設(shè)備的請款下,使用完全緩存(fully buffered);
  2. 標(biāo)準(zhǔn)錯(cuò)誤輸出不使用完全緩存。

上面的標(biāo)準(zhǔn)顯然沒有具體說明各種情況,一般來說:

  1. 標(biāo)準(zhǔn)錯(cuò)誤輸出不適用緩存;
  2. 其他流,如果關(guān)聯(lián)終端,則使用行緩存,否則使用完全緩存。

我們可以使用函數(shù)setbuf和setvbuf函數(shù)更改流的緩存機(jī)制。

函數(shù)聲明:

#include <stdio.h>

void setbuf(FILE* restrict fp, char* restrict buf);

int servbuf(FILE *restrict fp, char* restrict buf, int mode, size_t size);

函數(shù)返回值:

  • OK:0;
  • Error:非0

這些函數(shù)必須在流打開之后,其他流操作執(zhí)行之前被調(diào)用。

函數(shù)作用:

setbuf可以打開或關(guān)閉緩存,打開緩存時(shí),buf指向一個(gè)大小為BUFSIZ(stdio.h中定義的宏)的buffer,通常打開的時(shí)完全緩存,如果當(dāng)前流關(guān)聯(lián)的是終端設(shè)備,有的系統(tǒng)也會(huì)使用行緩存;

servbuf可以指定打開哪種類型的緩存。mode的參數(shù)可以取如下的值,如果指定為無緩存,則參數(shù)buf和size都會(huì)被忽略。

NewImage

函數(shù)行為總結(jié)如下表所示:

NewImage

通常來說,我們應(yīng)該讓系統(tǒng)自己選擇buffer大小并自動(dòng)分配,這樣標(biāo)準(zhǔn)IO庫會(huì)在關(guān)閉流時(shí)自動(dòng)釋放該內(nèi)存。

?

flush函數(shù)。

函數(shù)聲明:

#include <stdio.h>

int fflush(FILE *fp);

函數(shù)作用:

使得該流的所有緩存中未寫入硬盤的數(shù)據(jù)傳入內(nèi)核中。

一種特殊情況是,如果fp為NULL,fflush會(huì)使得所有緩存的數(shù)據(jù)都被flush。

?

3 打開流(opening a stream)

函數(shù)fopen、freopen和fdopen函數(shù)用來打開一個(gè)標(biāo)準(zhǔn)輸入輸出流。

函數(shù)聲明:

#include <stdio.h>

FILE *fopen(const char *restrict pathname, const char* restrict type);

FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);

FILE *fdopen(int fd, const char *type);

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

  • 函數(shù)fopen打開指定的文件;
  • 函數(shù)freopen函數(shù)打開指定的文件到指定的流上,如果該流已經(jīng)被打開,則先關(guān)閉該流;如果之前已經(jīng)被打開的流設(shè)置了orientation,則清理。函數(shù)freopen通常用來打開文件到預(yù)定義的流上,如標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出;
  • fdopen輸入一個(gè)文件描述符,將描述符關(guān)聯(lián)到一個(gè)標(biāo)準(zhǔn)IO流上。函數(shù)fdopen的作用主要是為了將管道和網(wǎng)絡(luò)連接關(guān)聯(lián)到一個(gè)流上,而這些特殊類型的文件不能使用fopen函數(shù)打開,我們必須先用特定的函數(shù)獲取文件描述符,然后用fdopen函數(shù)關(guān)聯(lián)到一個(gè)流上。

參數(shù)type取值如下表所示,一共有15種取值,有得取值作用相同:

NewImage

表格說明:

  • 參數(shù)中的b字符為了讓標(biāo)準(zhǔn)IO系統(tǒng)區(qū)分文本文件(text file)和二進(jìn)制文件(binary file),因?yàn)閮?nèi)核并不區(qū)分文件文件和二進(jìn)制文件,所以b字符并不影響內(nèi)核的行為。
  • 函數(shù)fdopen的參數(shù)type和其他的稍有不同。因?yàn)槲募枋龇呀?jīng)被打開,所以打開文件流并不截?cái)辔募灵L度為0。
  • 標(biāo)準(zhǔn)IO庫函數(shù)的append模式不可以用來創(chuàng)建新文件,因?yàn)橐玫揭粋€(gè)文件描述符,必須先打開一個(gè)存在的文件。
  • 同樣支持多進(jìn)程同時(shí)以append模式寫同一個(gè)文件。

當(dāng)打開一個(gè)流對(duì)文件進(jìn)行讀寫時(shí),有兩個(gè)限制:

  • 輸入后,如果不調(diào)用函數(shù)fflush, fseek, fsetpos或rewind的話,不可以緊接著進(jìn)行輸出。
  • 輸出后,如果不調(diào)用該函數(shù)fseek, fsetpos或rewind的話,不可以緊接著進(jìn)行輸入。

六種方式打開一個(gè)流總結(jié)如下表所示:

NewImage

需要注意的一點(diǎn)是,當(dāng)以w和a模式創(chuàng)建一個(gè)新文件時(shí),并不能像open或create函數(shù)一樣指定文件的權(quán)限標(biāo)志位。

一種解決方法是通過調(diào)整我們的umask。

打開的流默認(rèn)的是完全緩存,如果該流關(guān)聯(lián)的是終端設(shè)備,則是行緩存。

像之前提到的那樣,我們打開了一個(gè)流,并在其他操作之前,可以調(diào)用setbuf或setvbuf函數(shù)修改緩存方式。

關(guān)閉流

函數(shù)聲明:

#include <stdio.h>

int fclose(FILE* fp);

函數(shù)細(xì)節(jié),關(guān)閉流之前:

  • 所有緩存待輸出的數(shù)據(jù)都會(huì)被輸出;
  • 所有緩存帶輸入的數(shù)據(jù)都會(huì)被丟棄;
  • 如果流使用的緩存是由標(biāo)準(zhǔn)IO庫分配,則緩存會(huì)被釋放;
  • 如果進(jìn)程正常終止,則所有緩存數(shù)據(jù)都會(huì)被flush(輸出或者寫入硬盤),并且所有打開的流都會(huì)被關(guān)閉。
4 讀寫一個(gè)流(Reading and Writing a Stream)?

當(dāng)我們打開一個(gè)流,我們有三種讀寫方式可供選擇:

  • 一次一個(gè)字符讀寫
  • 一次一行讀寫:使用函數(shù)fgets和fputs
  • 直接讀寫:每次讀寫固定長度的數(shù)據(jù),使用函數(shù)fread和fwrite。
輸入函數(shù)

函數(shù)聲明:

#include <stdio.h>

int getc(FILE* fp);

int fgetc(FILE* fp);

int getchar(void);

函數(shù)返回值:

  • ok:下一個(gè)字符
  • EOF:文件結(jié)尾,一般為-1
  • error:負(fù)數(shù)

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

  • getchar和getc不同的地方在于:前者一定實(shí)現(xiàn)為函數(shù),而后者可以被實(shí)現(xiàn)為一個(gè)宏;
  • 函數(shù)返回值將unsigned char轉(zhuǎn)型為int,這里,unsigned是為了轉(zhuǎn)型為int時(shí)不會(huì)是負(fù)數(shù)。返回整數(shù)的目的是為了讓所有可能的值都可以返回,包括錯(cuò)誤碼和文件結(jié)尾;
  • 文件結(jié)尾符EOF往往定義為負(fù)數(shù),而錯(cuò)誤碼也是負(fù)數(shù),因此我們無法從返回值上判斷是到達(dá)了文件結(jié)尾還是報(bào)錯(cuò)。
  • 為了區(qū)分上面的兩種情況,我們需要調(diào)用函數(shù)ferror或者feof。

?

函數(shù)聲明:

#include <stdio.h>

int ferror(FILE* fp);

int feof(FILE* fp); ? ?// Both return: nonzero(true) if condition is true, 0(false) otherwise

void clearerr(FILE* fp);

在大多的實(shí)現(xiàn)中,F(xiàn)ILE對(duì)象中會(huì)維護(hù)兩個(gè)flag:

  • 一個(gè)error flag
  • 一個(gè)文件結(jié)尾符flag

這兩個(gè)flag都可以通過調(diào)用clearerr清空。

?

讀取一個(gè)流后,我們可以調(diào)用函數(shù)ungetc壓回讀出來的字符。

函數(shù)聲明:

#include <stdio.h>

int ungetc(int c, FILE* fp);

函數(shù)返回值:c if OK, EOF on error

函數(shù)細(xì)節(jié):只支持單個(gè)個(gè)字符的壓回。

使用場景:

壓回操作常使用在下面的場景:對(duì)于一個(gè)輸入流,我們需要根據(jù)下一個(gè)字符來判斷該如何處理當(dāng)前的字符。

?

輸出函數(shù)

輸出函數(shù)和我們討論過的輸入函數(shù)一一對(duì)應(yīng),不再贅述。

函數(shù)聲明:

#include <stdio.h>

int putc(int c, FILE* fp);

int fputc(int c, FILE* fp);

int putchar(int c);

?

5 逐行輸入輸出操作(Line-at-a-Time IO)

函數(shù)fgets和gets提供了逐行輸入功能。

函數(shù)聲明:

#include <stdio.h>

char *fgets(char* restrict buf, int n, FILE* restrict fp);

char *gets(char* buf);

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

  • 兩個(gè)函數(shù)都是讀取一行數(shù)據(jù)至buffer中。
  • 函數(shù)gets從標(biāo)準(zhǔn)輸入流中讀取,fgets從指定的輸入流中讀取。
  • fgets需要我們指定緩沖區(qū)大小,讀入的一行數(shù)據(jù)不得多于n-1個(gè)字符,以NULL結(jié)尾。如果fgets讀取該行數(shù)據(jù)長度大于n,則該次只讀取n-1個(gè)字符,并以null結(jié)尾,剩余的字符在下次調(diào)用fgets時(shí)讀入。
  • gets函數(shù)不推薦使用,因?yàn)樗蛔鲈浇鐧z查。

函數(shù)fputs和puts提供了逐行輸出的功能。

函數(shù)聲明:

#include <stdio.h>

int fputs(const char* restrict str, FILE* restrict fp);

int puts(const char* str);

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

  • fputs函數(shù)將一個(gè)以null結(jié)尾的字符串輸出到指定流中,最后的null byte并不輸出;
  • puts函數(shù)同樣會(huì)輸出一個(gè)以null結(jié)尾的字符串到標(biāo)準(zhǔn)輸出,最后的null byte并不輸出,輸出結(jié)束后會(huì)輸出一個(gè)換行符;
  • 所以我們也不推薦使用puts函數(shù),防止自動(dòng)輸出一個(gè)換行符,但是我們在使用fputs時(shí)要記得在必要的時(shí)候自己處理換行符。

?

6 標(biāo)準(zhǔn)輸入輸出效率分析

比較標(biāo)準(zhǔn):

將一定量的數(shù)據(jù)從標(biāo)準(zhǔn)輸入拷貝到標(biāo)準(zhǔn)輸出,計(jì)算這一過程所需要的

  • 用戶CPU時(shí)間(User CPU)
  • 系統(tǒng)CPU時(shí)間(System CPU)
  • Clock time
  • 程序文本大小

Code:

使用getc和putc的版本:

#include "apue.h"

?

int

main(void)

{

? ? int ? ? c;

?

? ? while ((c = getc(stdin)) != EOF)

? ? ? ? if (putc(c, stdout) == EOF)

? ? ? ? ? ? err_sys("output error");

?

? ? if (ferror(stdin))

? ? ? ? err_sys("input error");

?

? ? exit(0);

}

使用fgets和fputs的版本:

#include "apue.h"

?

int

main(void)

{

? ? char? ? buf[MAXLINE];

?

? ? while (fgets(buf, MAXLINE, stdin) != NULL)

? ? ? ? if (fputs(buf, stdout) == EOF)

? ? ? ? ? ? err_sys("output error");

?

? ? if (ferror(stdin))

? ? ? ? err_sys("input error");

?

? ? exit(0);

}

測試數(shù)據(jù):95.8M 3百萬行

測試結(jié)果(和第三章中的數(shù)據(jù)進(jìn)行了對(duì)比,之前跳過了該章節(jié),可以自行查看一下):

NewImage

結(jié)果說明:

  • 可以發(fā)現(xiàn)標(biāo)準(zhǔn)IO庫函數(shù)User CPU時(shí)間都比read版本的最好時(shí)間要大,因?yàn)橹鹱址x寫需要執(zhí)行100million次循環(huán),逐行讀寫需要執(zhí)行3百萬次循環(huán),而第一行使用的read的最有版本執(zhí)行了25224次循環(huán);
  • clock time的差異原因在于用戶態(tài)時(shí)間的差異和等待IO完成的時(shí)間上的差異;
  • System CPU時(shí)間基本和之前版本的相同,因?yàn)閮?nèi)核請求數(shù)基本相同。因此,在不關(guān)心buffer大小和分配,或者只需要關(guān)心一行buffer大小的使用下,獲取了幾乎最優(yōu)的buffer選擇。
  • 最后一列顯示了編譯器編譯后生成的匯編文件的大小。
  • 逐行讀寫比逐字符讀寫快得多,因?yàn)閒gets和fputs是用memccpy實(shí)現(xiàn),memccpy函數(shù)用匯編來實(shí)現(xiàn),效率更高。
  • fgetc版本比read版本的最差時(shí)間(BUFFSIZE=1)要快得多,原因在于read版本會(huì)執(zhí)行200million次函數(shù)調(diào)用,由于無緩存機(jī)制,所以相應(yīng)的也會(huì)執(zhí)行200million次系統(tǒng)調(diào)用,而fgetc版本也會(huì)執(zhí)行200million次函數(shù)調(diào)用,但是由于緩存機(jī)制,只需要執(zhí)行25224次系統(tǒng)調(diào)用。我們知道,系統(tǒng)調(diào)用的開銷要比函數(shù)調(diào)用大得多。

?

?

7 小結(jié)

標(biāo)準(zhǔn)IO函數(shù)庫分為兩篇來介紹,本篇是第一篇,主要介紹了

  • 流的基本概念
  • 流的基本操作,包括打開、關(guān)閉、讀寫
  • 對(duì)比了使用標(biāo)準(zhǔn)IO庫的讀寫效率

?

?

參考資料:

《Advanced PRogramming in the UNIX Envinronment 3rd》?

?


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
天天想你在线观看完整版电影免费| 无码国产色欲xxxx视频| av成人午夜| 欧美黄色激情视频| 亚洲图片小说综合| 欧美亚洲一区二区三区四区| 国产成人精品一区二区免费视频| 成人免费va视频| 噜噜噜天天躁狠狠躁夜夜精品| 大菠萝精品导航| 亚洲视频一区| 四季av综合网站| 性欧美精品中出| 无码国产色欲xxxx视频| 日韩精品一区二区三区在线| 日韩一区二区三区三四区视频在线观看| 国产强被迫伦姧在线观看无码| 夜色资源站国产www在线视频| 久久久久久久中文字幕| 欧美私模裸体表演在线观看| 精品少妇一区二区三区日产乱码| 三级视频在线| 欧美aaaa视频| 亚洲av无码一区二区三区人| 日韩在线第七页| 欧美激情免费看| 激情文学综合丁香| 高清在线一区二区| av在线三区| 2019国产精品自在线拍国产不卡| 高清乱码毛片入口| 电影av一区| 国产欧美日韩在线视频| 116极品美女视频在线观看| 欧美一级色片| 一区二区三区 在线观看视| 久久久女人电视剧免费播放下载| 欧美18—19性高清hd4k| 成人免费网站视频www| 午夜宅男久久久| 99国产欧美另类久久久精品| 亚洲精品无码久久久久久久| 日韩av字幕| 日韩高清第一页| 国内福利写真片视频在线| 亚洲成年人电影在线观看| 亚洲欧美日韩国产成人综合一二三区| 中文字幕亚洲欧美日韩| 日本免费久久高清视频| 色在线视频观看| 欧美不卡高清| 国内精品免费视频精选在线观看| 免费一区二区视频| 欧美一卡二卡三卡四卡| 日韩精品免费一区二区三区| 中文字字幕一区二区三区四区五区| 欧美日韩国产激情| 精品入口蜜桃| 欧美日韩一区二区三区不卡| 手机在线理论电影| 日韩a视频在线观看| 欧美亚洲视频一区| 亚洲区一区二| 成av人片一区二区| 大尺度做爰床戏呻吟舒畅| 成人综合婷婷国产精品久久| 老司机一区二区| 久色视频在线| 一区免费观看视频| 中文字幕在线2018| 污污美女网站| 久久密一区二区三区| 在线看的片片片免费| 风流老熟女一区二区三区| 色婷婷在线视频观看| 欧美丝袜第一区| 在线影视一区二区三区| 久久99精品久久久久久噜噜| 岳毛多又紧做起爽| 中文字幕综合| 国产最新网站| 国产精品熟女一区二区不卡| 日韩一区欧美一区| 亚洲人妖在线| 福利小视频在线观看| 久久99精品久久久久久动态图| 亚洲人成绝费网站色www| 日本一区精品| 欧美情侣性视频| 免费人成黄页在线观看忧物| 国产色综合网| 蜜桃传媒一区二区| 天堂中文在线官网| 日韩精品一区二区三区| 久久精品偷拍视频| 亚洲激情欧美激情| 久久久国产精品成人免费| 色婷婷av久久久久久久| xfplay5566色资源网站| 成人a免费在线看| 欧美成人免费va影院高清| 一区二区中文字幕| 亚洲精品成人a| 亚洲精品国产手机| 黄色的毛片免费| 欧美激情综合亚洲一二区| 亚洲丝袜美腿一区| 亚洲黄色片在线观看| 久久9热精品视频| 欧美日韩一级片在线观看| 成年免费在线观看| 成年人免费在线视频网站| 一级毛片免费播放| 四虎视频在线精品免费网址| 欧美在线亚洲在线| 国产91精品久久久久久久| 婷婷成人综合| 在线播放一区| 成人亚洲在线观看| 欧美日韩成人综合| 99免费精品在线| 欧美日产国产精品| av小次郎在线| 色综合久久九月婷婷色综合| 最近看过的日韩成人| 黑人极品ⅴideos精品欧美棵| 久久伊人精品视频| 婷婷伊人综合| 在线看片成人| 国产精品99久久免费观看| 色婷婷久久一区二区| www在线观看播放免费视频日本| 精品成人免费视频| 久草中文视频| 97人人澡人人爽91综合色| 污视频网站免费看| 激情六月婷婷综合| 日本免费观看网站| 色成人综合网| 在线看的网站你懂| 色一色在线观看视频网站| 在线视频欧美日韩精品| 免费在线色视频| 亚洲精品一区二区三区蜜桃下载| 成人免费一区二区三区视频网站| 2019中文字幕在线| 69国产精品视频| aaa免费看大片| 日本不卡视频一区二区| 成人区一区二区| 亚洲福利视频一区二区| 激情综合一区二区三区| 亚洲国产精品久久久久秋霞蜜臀| av成人综合| 久久91超碰青草是什么| 精品久久久999| 99国精产品一二二线| 亚洲国产欧美日韩另类综合| 麻豆精品在线| 日韩欧美在线观看免费| 亚洲色图视频网站| gogo大尺度成人免费视频| 自拍视频在线观看一区二区| 免费网站在线高清观看| 色哟哟日韩精品| 日本在线视频播放| 成人精品久久久| 国产成人综合亚洲91猫咪| www视频在线| 欧美日韩国产不卡| 裸体丰满少妇做受久久99精品| 在线观看免费国产成人软件| 亚洲 自拍 另类 欧美 丝袜| 天天艹天天操| 午夜精彩国产免费不卡不顿大片| 国产日韩欧美综合精品| 中文字幕人妻熟女在线| 欧美大片免费观看在线观看网站推荐| 中文字幕无码人妻少妇免费| 亚洲高清av一区二区三区| 亚洲国产综合视频在线观看| 50度灰在线| 麻豆精品在线| 午夜精产品一区二区在线观看的| 伊人开心综合网| 亚洲毛片aa| 日韩免费av片在线观看| 日产精品久久久一区二区福利| 97精品人妻一区二区三区| 69av一区二区三区| 久久精品第九区免费观看| 香港三级日本三级| 深爱激情综合| 欧美黑人欧美精品刺激| 亚洲最大激情中文字幕| 欧美情侣性视频| 国产精品456露脸| 超碰色偷偷男人的天堂| av高清在线| 国语对白精品一区二区| 欧美激情综合五月色丁香小说| 欧美国产精品日韩| 欧美成a人片免费观看久久五月天| 欧美亚洲爱爱另类综合| 国产一二区视频| 久久久久美女| 不卡av电影在线| 国产精品成av人在线视午夜片| 在线成人直播| 午夜一区在线观看| 国产一区二区日韩精品欧美精品| 国产高清中文字幕| 97国产精品久久| 亚洲欧洲av色图| 热久久一区二区| 91精品国产综合久久精品性色| 国产综合色产在线精品| 日本精品一区二区三区在线播放| 日韩欧美字幕| 中文字幕黄色av| 日本不卡一区二区三区四区| 91一区二区三区在线播放| 亚洲免费专区| 在线观看成人动漫| 亚洲精品午夜视频| 色喇叭免费久久综合| 日韩精品成人一区二区在线| 国产日本欧美一区| 国产原创视频在线观看| v天堂中文在线| 巨胸喷奶水www久久久免费动漫| 欧洲一区二区av| 牛牛在线精品视频| 一本色道久久加勒比88综合| 黄色免费视频网站| 亚洲国产成人va在线观看麻豆| 中文字幕一区视频| 97视频在线观看网址| 久久久91精品国产一区二区三区| 国产精品视频免费看| 精品自拍一区| 国产日韩在线观看视频| 久9re热视频这里只有精品| 99在线视频免费| 羞羞视频在线免费国产| 日韩午夜在线观看视频| 日韩欧美黄色| 欧美高清无遮挡| 俺来俺也去www色在线观看| √天堂中文www官网| 给个网站可以在线观看你懂的| 黄动漫视频高清在线| 免费黄频在线观看| 精品999在线播放| 亚洲成a人片在线不卡一二三区| 国产成人综合欧美精品久久| 国产中文欧美日韩在线| 亚洲综合精品一区二区| 91九色02白丝porn| 亚洲精品国产动漫| eeuss一区| 国产99久久精品| 91香蕉网站| 欧美精品一区二区在线播放| 97精品国产97久久久久久久久久久久| 亚洲精品之草原avav久久| 国产精品久久久久免费| 九九九国产视频| 韩国三级在线观看久| 日本www高清| 国产女主播视频一区二区| 国产拍欧美日韩视频二区| 精品久久久一区二区| 成人全视频在线观看在线播放高清| 91人人澡人人爽人人精品| 国产亚洲精品久久久久久777| 尤物视频在线观看网站| 久久久国产精品一区二区三区| 色视频欧美一区二区三区| 久久久久久久久一| 国产素人视频在线观看| 国产又黄又爽又猛免费app| 狠狠狠色丁香婷婷综合久久五月| 国产精品初高中害羞小美女文| 紧缚捆绑精品一区二区| 成人免费短视频| 国语自产精品视频在线看一大j8| 国产黄视频网站| 不卡av电影院| 国产噜噜噜噜久久久久久久久| 国产成人无码aa精品一区| 黄一区二区三区| 国产福利91精品一区二区三区| 黄色网一区二区| 天天干天天操天天干天天操| 男人打飞机网站| wwwwxxxx日韩| 日韩av不卡播放| 国产精品麻豆一区二区三区| 4444kk在线观看| xfplay资源站夜色先锋| 国产精品久久久久久久久久久久久久久久久久| 2019中文字幕免费视频| 国产精品第一国产精品| 91视视频在线观看入口直接观看www| www婷婷av久久久影片| 黄色一级片免费在线观看| 欧美性xxxx图片| 蜜臀av粉嫩av懂色av| 欧美精品亚洲精品| 黄色电影免费在线看| 中文字幕av免费专区久久| 国产曰肥老太婆无遮挡| 亚洲国产成人精品电影| 丁香视频免费观看| 天堂中文av在线| 国产精品99久久不卡二区| 久久精品偷拍视频| 久久久久高清| 欧美日韩亚洲国内综合网俺| 中文字幕一区二区视频| 1卡2卡3卡精品视频| 成人黄色免费网站在线观看| 天堂a√在线| 亚洲欧美日韩国产另类专区| 日韩尤物视频| 亚洲美女视频在线免费观看| aaa欧美色吧激情视频|