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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX再学习 -- 文件I/O

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX再学习 -- 文件I/O 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇講完文件描述符,接下來進入正題,文件的處理函數

一、函數 open

詳細內容,可自行 man creat 查看 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);

1、參數解析

第一個參數:字符串形式的路徑和文件名 第二個參數:操作標志 O_RDONLY 只讀模式 O_WRONLY 只寫模式 O_RDWR 讀寫模式 O_EXEC 只執行打開 O_SEARCH 只搜索打開(應用于目錄) 上述 5 種標志位是互斥的,也就是不可同時使用,但可與下列的標志位利用 OR(|) 運算符組合。 O_APPEND:每次寫時追加到文件的尾端。 O_CLOEXEC:把FD_CLOEXEC常量設置為文件描述符標志。 O_CREAT:若此文件不存在則創建它。使用此選項時,open函數需同時說明第3個參數mode(openat函數需說明第4個參數mode),用mode指定該新文件的訪問權限位。 O_DIRECTORY:如果path引用的不是目錄,則出錯。 O_EXCL:如果同時指定了O_CREAT,而文件已經存在,則出錯。用此可以測試一個文件是否存在,如果不存在,則創建此文件,這使測試和創建兩者稱為一個原子操作。 O_NOCTTY:如果path引用的是終端設備,則不將該設備分配作為此進程的控制終端。 O_NOFOLLOW:如果path引用的是一個符號鏈接,則出錯。 O_NONBLOCK:如果path引用的是一個FIFO、一個特殊文件或一個字符特殊文件,則此選項為文件的本次打開操作和后序的I/O操作設置非阻塞方式。 O_SYNC :使每次write等待物理I/O操作完成,包括由該write操作引起的文件屬性更新所需的I/O。 O_TRUNC:如果此文件存在,而且為只讀或讀-寫成功打開,則將其長度截斷為0。 O_TTY_INIT:如果打開一個還未打開的終端設備,設置非標準termios參數值,使其符合Single UNIX Specification(以及POSIX.1)中同步輸入和輸出選項的一部分。 O_DSYNC:使每次write要等待物理I/O操作完成,但是如果該寫操作并不影響讀取剛寫入的數據,則不需要等待文件屬性被更新。 O_RSYNC:使每一個以文件描述符作為參數進行的read操作等待,直至所有對文件同一部分掛起的寫操作都完成。 第三個參數:操作模式 僅當創建新文件時才使用,用于指定創建的新文件權限。可以使用宏定義或者八進制文件權限碼。 注:此為Linux2.2以后特有的標志位,以避免一些系統安全問題。參數mode 則有下列數種組合,只有在建立新文件時才會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該為(mode-umaks)。

(1)八進制文件權限碼(常用)

詳解參看:C語言再學習 -- 修改linux文件權限
# ls -la 總用量 20 drwxrwxr-x 2 tarena tarena 4096 Mar 27 14:44 . drwxrwxr-x 4 tarena tarena 4096 Mar 14 11:14 .. -rwxr-xr-x 1 root root 7158 Mar 27 14:44 a.out -rw-r--r-- 1 root root 79 Mar 27 14:44 test.c 以 test.c 為例: - 代表文件類型 rw 代表屬主 r 代表屬組 r 代表其它 1 代表硬鏈接數 root 代表屬主名稱 root 代表屬組名稱 79 代表文件大小 Mar 27 14:44 代表文件最后修改時間 test.c 代表文件名 按照:0 表示沒有權限,1 表示可執行權限,2 表示可寫權限,4 表示可讀權限,然后將其相加。所以數字屬性的格式應為 3 個從 0 到 7 的八進制數,其順序是文件屬主(u)、與文件屬組(g)、其他用戶(o)
因此上面,test.c 的權限為 0644 注:可以在程序中用八進制方式表示數字必須以 0 作為開頭,采用?%o 作為占位符可以把一個整數的八進制表示方式打印在屏幕上?。

(2)宏定義方式

可查看 /usr/include/linux/stat.h 看到具體定義
S_IRWXU, 00700權限,代表該文件所有者具有可讀、可寫及可執行的權限。 S_IRUSR 或 S_IREAD, 00400權限,代表該文件所有者具有可讀取的權限。 S_IWUSR 或 S_IWRITE,00200權限,代表該文件所有者具有可寫入的權限。 S_IXUSR 或 S_IEXEC, 00100權限,代表該文件所有者具有可執行的權限。S_IRWXG 00070權限,代表該文件用戶組具有可讀、可寫及可執行的權限。 S_IRGRP 00040權限,代表該文件用戶組具有可讀的權限。 S_IWGRP 00020權限,代表該文件用戶組具有可寫入的權限。 S_IXGRP 00010權限,代表該文件用戶組具有可執行的權限。S_IRWX O00007權限,代表其他用戶具有可讀、可寫及可執行的權限。 S_IROTH 00004權限,代表其他用戶具有可讀的權限 S_IWOTH 00002權限,代表其他用戶具有可寫入的權限。 S_IXOTH 00001權限,代表其他用戶具有可執行的權限。同八進制方法格式一樣,不過就顯得尤為復雜了,例如:設置權限 0644:S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH

2、返回值:

成功返回一個新的文件描述符,失敗返回 -1。文件描述符就是非負的整數,用于代表一個打開的文件。

3、錯誤代碼

EEXIST 參數pathname 所指的文件已存在, 卻使用了O_CREAT 和O_EXCL 旗標. EACCESS 參數pathname 所指的文件不符合所要求測試的權限. EROFS 欲測試寫入權限的文件存在于只讀文件系統內. EFAULT 參數pathname 指針超出可存取內存空間. EINVAL 參數mode 不正確. ENAMETOOLONG 參數 pathname 太長. ENOTDIR 參數pathname 不是目錄. ENOMEM 核心內存不足. ELOOP 參數pathname 有過多符號連接問題. EIO I/O 存取錯誤.

4、函數功能

打開/創建 一個文件/設備。

5、與 openat 函數區別

可自行 man openat 查看 openat 的詳細內容,在此不多講解了。openat 函數是 POSIX.1 最新版本中新增的一類函數之一,希望解決兩個問題。第一,讓線程可以使用相對路徑名打開目錄中的文件,而不再只能打開當前工作目錄。第二,可以避免time-of-check-to-time-of-use(TOCTTOU錯誤

6、與 creat 函數區別

調用creat函數創建一個新文件。返回值:若成功,返回只寫打開的文件描述符;若出錯,返回-1。此函數等效于:
open (path, O_RDWR | O_CREAT | O_TRUNC, mode);

二、函數 close

#include <unistd.h> int close(int fd);

1、函數功能:

close()關閉一個文件描述符,所以它不再引用任何文件,可以重用。 任何記錄鎖(見fcntl(2))舉行與該進程關聯并擁有的文件被刪除(不管用于獲取的文件描述符)鎖)。
如果 fd 是引用底層打開文件描述的最后一個文件描述符(見open(2)),則與打開的文件描述被釋放; 如果描述符是使用 unlink(2)文件刪除的文件的最后引用被刪除。

2、示例說明

//open 函數和 close 函數的使用 #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h>int main (void) { //文件不存在則創建,存在則打開 // int fd = open ("a.txt", O_RDONLY | O_CREAT, 0644);//文件不存在則創建,存在則創建失敗 // int fd = open ("a.txt", O_RDONLY | O_CREAT | O_EXCL, 0644);//文件存在,且為普通文件,打開方式有寫權限,則清空文件 int fd = open ("a.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (-1 == fd)perror ("open"), exit (-1);printf ("打開文件成功!\n");printf("fd = %d\n", fd);int res = close (fd);if (-1 == res)perror ("cosee"), exit (-1);printf("關閉文件成功!\n");return 0; } 輸出結果: 打開文件成功! fd = 3 關閉文件成功!

三、函數 lseek

可參看:C語言再學習 -- 文件 每個打開文件都有一個與其相關聯的“當前文件偏移量”。它通常是一個非負數,用以度量從文件開始處計算的字節數。通常,讀、寫操作都從當前文件偏移量處開始,并使偏移量增加所讀寫的字節數。按系統默認的情況,當打開一個文件時,除非指定 O_APPEND 選項,否則該偏移量被設置為 0. 可以調用 lseek 顯式地為一個打開文件設置偏移量。 #include <sys/types.h> #include <unistd.h> off_t lseek (int fd, off_t offset, int whence);

1、參數解析

第一個參數:文件描述符 第二個參數:偏移量 第三個參數:從什么地方開始偏移 若whence是SEEK_SET,則將該文件的偏移量設置為距文件開始處offset個字節。?
若whence是SEEK_CUR,則將該文件的偏移量設置為其當前值加offset,offset可為正或負。?
若whence是SEEK_END,則將該文件的偏移量設置為文件長度加offset,offset可正可負。

偏移起始位置:文件頭0(SEEK_SET),當前位置1(SEEK_CUR),文件尾2(SEEK_END))為基準,偏移offset(指針偏移量)個字節的位置。

2、返回值

若成功,返回新的文件偏移量;若出錯,返回為 -1。為此可以用下列方式確定打開文件的當前偏移量: off_t currpos; currpos = lseek(fd, 0, SEEK_CUR);這種方法也可用來確定所涉及的文件是否可以設置偏移量。如果文件描述符指向的是一個管道、FIFO或網絡套接字,則 lseek 返回 -1,并將 errno 設置為 ESPIPE (Illegal seek)。

3、函數功能

表示調整文件的讀寫位置。

4、示例說明

//示例一 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <sys/stat.h>int main (void) {int fd = open ("a.txt", O_RDWR);if (-1 == fd)perror ("open"), exit (-1);printf ("打開文件成功!\n");printf ("ABCDEFGHIJKLMN\n");char c;//第一次讀 從開頭讀取 Aread (fd, &c, sizeof (char));printf ("c = %c\n", c);//第二次讀,移到下一個 Bread (fd, &c, sizeof (char));printf ("c = %c\n", c);printf ("-------------------\n");//SEEK_CUR 當前位置讀取 (2+0 = 2)(CDE)lseek (fd, 2L, SEEK_CUR);read (fd, &c, sizeof (char));printf ("c = %c\n", c);//SEEK_CUR 當前位置讀取(-2+0 = -2) (DEF)lseek (fd, -2L, SEEK_CUR);read (fd, &c, sizeof (char));printf ("c = %c\n", c);//SEEK_SET 從開頭位置讀取,(3 + 1 = 4)(ABCD)lseek (fd, 3L, SEEK_SET);read (fd, &c, sizeof (char));printf ("c = %c\n", c);//SEEK_SET 從開頭位置讀取,(-5 + 1 = -4)錯誤,指向當前位置lseek (fd, -5L, SEEK_SET);read (fd, &c, sizeof (char));printf ("c = %c\n", c);//從結尾位置讀取,(-3 + 2 = -1) (MN)lseek (fd, -3L, SEEK_END);read (fd, &c, sizeof (char));printf ("c = %c\n", c);close (fd);printf ("關閉文件成功!\n");return 0; } 輸出結果: 打開文件成功! ABCDEFGHIJKLMN c = A c = B ------------------- c = E c = D c = D c = E c = M 關閉文件成功!//示例二 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() {if (lseek (STDIN_FILENO, 0, SEEK_CUR) == -1)printf ("cannot seek\n");else printf ("seek OK\n");return 0; } 使用重定向測試: # ./a.out < /etc/passwd seek OK# cat < /etc/passwd | ./a.out cannot seek# ./a.out < /var/spool/cron/FIFO cannot seek//示例三 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h>int main (void) {int fd = open ("a.txt", O_RDWR | O_APPEND);//nt fd = open ("a.txt", O_RDWR);if (-1 == fd)perror ("open"), exit (-1);printf ("打開文件成功!\n");char c;lseek (fd, 3, SEEK_SET);read (fd, &c, sizeof (char));printf ("c = %c\n", c);char buffer[5] = "1234";if(write(fd,buffer,strlen(buffer)) !=strlen(buffer))perror("write error"), exit(-1);close (fd);return 0; } 查看 a.txt # cat a.txt ABCDEFJHIJKLMN 1234說明: (1)示例一,說明偏移起始位置:文件頭0(SEEK_SET),當前位置1(SEEK_CUR),文件尾2(SEEK_END))為基準,偏移offset(指針偏移量)個字節的位置。lseek()函數允許將文件偏移量設置為超出文件結尾(但不會更改文件的大小)。如果偏移量超出范圍,則打印當前位置。 (2)示例二,說明如果文件描述符指向的是一個管道、FIFO或網絡套接字,則 lseek 返回 -1。比較 lseek 的返回值時,不要測試它是否小于 0,而要測試它是否等于 -1。 (3)示例三,說明按系統默認的情況,當打開一個文件時,除非指定?O_APPEND?選項,否則該偏移量被設置為 0。 O_APPEND的含義是在每次寫之前,都講標志位移動到文件的末端。而?O_APPEND 打開后,是一個原子操作:移動到末端,寫數據,跟位移 lseek 無關。

5、與 fseek 區別

int fseek(FILE *stream, long offset, int fromwhere); off_t lseek (int fd, off_t offset, int whence);

fseek 函數和 lseek 函數類似,但 lseek 返回的是一個 off_t 數值,而 fseek 返回的是一個整型。一個打開的是文件流指針、一個打開的是文件描述符

6、off_t 類型

查看:/usr/include/i386-linux-gnu/sys/types.h?

#ifndef __off_t_defined # ifndef __USE_FILE_OFFSET64 typedef __off_t off_t; # else typedef __off64_t off_t; # endif # define __off_t_defined #endif如果定義了__USE_FILE_OFFSET64 就把 off_t 定義為 __off64_t ,否則定義為 32 位。

使用 gdb 查看:

編譯gdb文件 # gcc -g test.c# gdb a.out GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>... Reading symbols from /home/tarena/project/c_test/a.out...done. (gdb) ptype off_t type = long int

所以,linux中的 off_t 類型默認是 32 位的 long int。

四、函數 read

#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);

1、參數解析

第一個參數:文件描述符第二個參數:緩沖區的首地址第三個參數:讀取的數據大小

2、返回值

成功返回讀取到的數據大小,若已到文件尾,返回 0,失敗返回 -1。
很多種情況可使實際讀到的字節數少于要求讀的字節數:
(1)讀普通文件時,在讀到要求字節數之前已經到達了文件尾端。
(2)當從終端設備讀時,通常一次最多讀一行。
(3)當從網絡讀時,網絡中的緩沖機制可能造成返回值小于所要求讀的字節數。
(4)當從管道或FIFO讀時,如若管道包含的字節少于所需的數量,那么read將只返回實際可用的字節數。
(5)當從某些面向記錄的設別(如磁帶)讀時,一次最多返回一個記錄。
(6)當一信號造成中斷,而已經讀了部分數據量時。

讀操作從文件的當前偏移量處開始,在成功返回之前,該偏移量將增加實際讀到的字節數。

3、函數功能

表示從指定的文件中讀取指定的數據。

4、示例說明

#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h>int main (void) {char buffer[100];int fd = open("a.txt", O_RDWR);lseek (fd, 2L, SEEK_SET);int size = read (fd, buffer, sizeof (buffer));printf ("buffer = %ssize = %d\n", buffer, size);close (fd);return 0; } 輸出結果: buffer = CDEFJHIJKLMN size = 13 說明:讀操作從文件的當前偏移量處開始,在成功返回之前,該偏移量將增加實際讀到的字節數。

五、函數 write

#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);

1、參數解析

第一個參數:文件描述符第二個參數:緩沖區首地址第三個參數:數據的大小

2、返回值

成功返回寫入的數據大小,失敗返回 -1。
其返回值通常與 count 的值相同,否則表示出錯。write 出錯的一個常見原因是磁盤已寫滿,或者超過了一個給定進程的文件長度限制對于普通文件,寫操作從文件的當前偏移量處開始。如果在打開文件時,指定了O_APPEND選項,則在每次寫操作之前,將文件偏移量設置在文件的當前結尾處。在一次成功寫之后,該文件偏移量增加實際寫的字節數。

3、函數功能

表示向指定的文件中寫入指定的數據

4、示例說明

#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h>int main (void) {//int fd = open ("a.txt", O_RDWR | O_APPEND);int fd = open ("a.txt", O_RDWR);if (-1 == fd)perror ("open"), exit (-1);lseek (fd, 3, SEEK_SET);char buffer[5] = "1234";int size = write(fd,buffer,strlen(buffer));printf ("size = %d\n", size);close (fd);return 0; } 輸出結果: size = 4查看 a.txt # cat a.txt ABC1234HIJKLMN 說明:對于普通文件,寫操作從文件的當前偏移量處開始。如果在打開文件時,指定了O_APPEND選項,則在每次寫操作之前,將文件偏移量設置在文件的當前結尾處。在一次成功寫之后,該文件偏移量增加實際寫的字節數。

六、I/O的效率

UNIX環境高級編程書上示例位置在?apue.3e/figlinks?比如本例的 fig3.5 #include "apue.h"#define BUFFSIZE 4096int main(void) {int n;char buf[BUFFSIZE];while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)if (write(STDOUT_FILENO, buf, n) != n)err_sys("write error");if (n < 0)err_sys("read error");exit(0); } 重定向操作:標準輸入 # ./a.out < 1.txt? 12345678重定向操作:標準輸出 # ./a.out > 2.txt? ABCDEF ^C 查看2.txt: # cat 2.txt? ABCDEF 上篇講文件描述符時講過,POSIX 定義了?STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 來代替 0、1、2這三個符號常量的定義位于頭文件?<unistd.h> 查看 /usr/include/unistd.h /* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */

1、問題來了,STDIN_FILENO與 stdin的區別?

參看:UNIX下STDIN_FILENO與stdin區別

(1)數據類型不一致

stdin 等類型為 FILE *
STDIN_FILENO 等類型為 int
使用 stdin 的函數主要有:fread、fwrite、fclose等,基本上都以 f 開頭
使用 STDIN_FILENO 的函數有:read、write、close等

(2)層次不一致

stdin 等屬于標準I/O,高級的輸入輸出函數。在<stdio.h>。
STDIN_FILENO 等是文件描述符,是非負整數,一般定義為 0, 1, 2,直接調用系統調用,在<unistd.h>。
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
stdin等屬于標準庫處理的輸入流,其聲明為 FILE 型的,對應的函數前面都有f開頭,如fopen/fread/fwrite/fclose 標準庫調用等
STDIN_FILENO等屬于系統API接口庫,其聲明為 int 型,是一個打開文件句柄,對應的函數主要包括 open/read/write/close 等系統級調用。

2、兩者關系

對于 stdin 等可以使用 fileno() 函數(用來取得參數 stream 指定的文件流所使用的文件描述符)來取得該文件流對應的文件描述符。
fileno(stdin) = STDIN_FILENO = 0
fileno(stdout) = STDOUT_FILENO = 1
fileno(stderr) = STDERR_FILENO = 2
例如:#include "apue.h"#define BUFFSIZE 4096int main(void) {int n;char buf[BUFFSIZE];while ((n = read(fileno(stdin), buf, BUFFSIZE)) > 0)if (write(fileno(stdout), buf, n) != n)err_sys("write error");if (n < 0)err_sys("read error");exit(0); }

七、文件共享

UNIX系統支持在不同進程間共享打開文件。
內核使用3種數據結構表示打開文件,它們之間的關系決定了在文件共享方面一個進程對另一個進程可能產生的影響。
1)每個進程在進程表中都有一個記錄項,記錄項中包含一張打開文件描述符表,可將其視為一個矢量,每個描述符占用一項。與每個文件描述符相關聯的是:?
? ? 文件描述符標志;?
? ? 指向一個文件表項的指針。
2)內核為所有打開文件維持一張文件表。每個文件表項包含:?
? ? 文件狀態標志(讀、寫、添寫、同步和非阻塞等);?
? ? 當前文件偏移量;?
? ? 指向該文件v節點表項的指針。
3)每個打開文件(或設備)都有一個v節點(v-node)結構。v節點包含了文件類型和對此文件進行各種操作函數的指針。對于大多數文件,v節點還包含了該文件的i節點(i-node,索引節點)。這些信息是打開文件時從磁盤上讀入內存的,所以,文件的所有相關信息都是隨時可用的。如i節點包含了文件的所有者、文件長度、指向文件實際數據塊在磁盤上所在位置的指針等。?
例如:一個進程有兩個不同的打開文件:一個文件從標準輸入打開(文件描述符為 0),另一個從標準輸出打開(文件描述符為 1)。#include "apue.h" #define BUFFSIZE 4096 int main(void) { int n; char buf[BUFFSIZE]; while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) if (write(STDOUT_FILENO, buf, n) != n) err_sys("write error"); if (n < 0) err_sys("read error"); exit(0); } 執行: # ./a.out < 1.txt > 2.txt # cat 1.txt 12345678 # cat 2.txt 12345678該進程對應的 3 張表之間的關系:

再如:兩個進程各自打開了同一個文件,這部分參看:Linux中的文件描述符與打開文件之間的關系對于以上數據結構,其相關操作的說明如下:在完成每個 write 后,在文件表項中的當前文件偏移量即增加所寫入的字節數。如果這導致當前文件偏移量超出了當前文件長度,則將 i 節點表項中的當前文件長度設置為當前文件偏移量(即該文件增加了);
如果用 O_APPEND 標志打開一個文件,則相應標志也被設置到文件表項的文件狀態標志中。每次對這種具有追加寫標志的文件執行寫操作時,文件表現中的當前文件偏移量首先會被設置為 i 節點表現中的文件長度。這就使得每次寫入的數據都追加到文件的當前尾端處;
若一個文件用 lseek 定位到文件當前的尾端,則文件表項中的當前文件偏移量被設置為 i 節點表項中的當前文件長度;
lseek函數只修改文件表項中的當前文件偏移量,不進行任何I/O操作。

八、函數 dup 和 dup2

1、函數 dup

#include <unistd.h> int dup(int oldfd);函數功能: 表示根據參數指定的文件描述符進行拷貝, 返回值: 成功返回新的文件描述符,失敗返回 -1。 注意:
文件描述符的復制本質上就是讓多個文件描述符對應同一個文件表,也就是對應同一個文件。
由 dup 返回的心的文件描述符一定是當前可用文件描述符中的最小數值。 示例: #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main (void) {int newfd = dup (STDOUT_FILENO);if (-1 == newfd)perror ("Fail to dup"), exit (-1);printf ("newfd = %d\n", newfd);write (newfd, "hello world\n", 12);return 0; } 輸出結果: newfd = 3 hello world

2、函數 dup2

#include <unistd.h> int dup2(int oldfd, int newfd);函數功能:
表示將 newfd 作為參數 oldfd 的拷貝,如果 newfd 已經打開,則先將其關閉;如若 oldfd 等于 newfd,則 dup2 返回 newfd,而不關閉它。否則,newfd 的 FD_CLOEXEC 文件描述符標志被清除,這樣 newfd 在進程調用 exec 時是打開狀態。
返回值: 成功返回新描述符,也就是 newfd,失敗返回 -1。 示例: //dup/dup2函數的使用 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main(void) {//1.打開/創建一個文件int fd = open("d.txt",O_RDWR|O_CREAT/*|O_EXCL*/,0644);if(-1 == fd){perror("open"),exit(-1);}printf("fd = %d\n",fd);//3//2.使用dup函數復制文件描述符// int fd2 = fd;int fd2 = dup(fd);if(-1 == fd2){perror("dup"),exit(-1);}printf("fd2 = %d\n",fd2);//4//3.針對不同的描述符進行處理write(fd,"A",1);write(fd2,"a",1);//打開/創建一個新文件int fd3 = open("e.txt",O_RDWR|O_CREAT,0644);if(-1 == fd3){perror("open"),exit(-1);}printf("fd3 = %d\n",fd3);//5//使用dup2函數進行描述符的拷貝// fd 到 fd3的拷貝 fd3 和 fd4相等int fd4 = dup2(fd,fd3);printf("fd3 = %d,fd4 = %d\n",fd3,fd4);// 5 5 write(fd3,"1",1); //d.txtwrite(fd4,"2",1); //d.txtwrite(fd,"3",1); //d.txt//4.關閉所有描述符close(fd);close(fd2);close(fd3);return 0; }輸出結果: fd = 3 fd2 = 4 fd3 = 5 fd3 = 5,fd4 = 5查看:d.txt 和 e.txt # cat d.txt Aa123 # cat e.txt 為空od 命令查看 # od -c d.txt? 0000000 ? A ? a ? 1 ? 2 ? 3 0000005 擴展:使用 od 命令觀察文件的實際內容。命令行中的 -c 標志表示以字符方式打印文件內容 參看:od 命令

九、函數 fcntl?

#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ );

1、參數解析

第一個參數:文件描述符 第二個參數:操作的命令 ? ? F_DUPFD/F_DUPFD_CLOEXEC??復制文件描述符的功能,尋找最小的有效的大于等于第三個參數 arg 的描述符作為新的描述符。 ? ? ? ? 與 dup2 函數有所不同的是,不會強制關閉已經被占用的描述符。 ? ? F_GETFD/F_SETFD ?獲取/設置文件描述符的標志 ? ? F_GETFL/F_SETFL ?獲取/設置文件狀態的標志 ???F_GETOWN/F_SETOWN??獲取/設置異步 I/O 所有權
? ? F_SETLK/F_GETLK ?加鎖/解鎖/測試鎖是否存在 第三個參數:可變長參數 參數是否需要,主要取決于參數 cmd

2、返回值

F_DUPFD ?成功返回新的文件描述符 F_GETFD ?成功返回文件描述符的標志值 F_GETFL ?成功返回文件狀態的標志值 F_GETOWN ?成功返回異步 I/O 所有權 其他操作成功返回 0, 所有的操作失敗返回 -1

3、函數功能

主要表示根據文件描述符對文件執行的操作 (1)復制文件描述符 (2)獲取/設置文件描述符的標志 (3)獲取/設置文件狀態的標志 (4)獲取/設置異步 I/O 所有權 (5)實現文件鎖的功能

4、功能講解

(1)F_DUPFD?

復制文件描述符 fd。新的文件描述符作為函數值返回。它是尚未打開的各描述符中大于或等于第 3 參數值中各值的最小值。新描述符與 fd 共享同一文件表項。但是,新描述符有它自己的一套文件描述符,其中 FD_CLOEXEC 文件描述符標志被消除(這表示該描述符在 exec 時仍保持有效)。
實際上:調用 dup (fd); ?等效于 fcntl (fd, F_DUPFD, 0); 調用 dup2 (fd, fd2); ?等效于 close (fd2); ?fcntl (fd, F_DUPFD, fd2); 在后一種情況下,dup2 并不完全等同于 close 加上 fcntl。它們之間的區別具體如下: --dup2 是一個原子操作,而 close 和 fcntl 包括兩個函數調用。有可能在 close 和 fcntl 之間調用了信號捕獲函數,它可能修改文件描述符。如果不同的線程改變了文件描述符的話也會出現相同的問題。 --dup2 和 fcntl 有不同的 errno。 示例說明:? //示例一 #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h>int main (void) {int fd = fcntl (STDOUT_FILENO, F_DUPFD, 0);if (-1 == fd)perror ("Fail to fcntl"), exit (-1);printf ("fd = %d\n", fd);write (fd, "hell world\n", 12);return 0; } 輸出結果: fd = 3 hell world //示例二 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main(void) {//1.打開/創建一個文件int fd = open("d.txt",O_RDWR|O_CREAT/*|O_EXCL*/,0644);if(-1 == fd){perror("open"),exit(-1);}printf("fd = %d\n",fd);//3//2.使用dup函數復制文件描述符// int fd2 = fd;int fd2 = dup(fd);if(-1 == fd2){perror("dup"),exit(-1);}printf("fd2 = %d\n",fd2);//4//3.針對不同的描述符進行處理write(fd,"A",1);write(fd2,"a",1);//打開/創建一個新文件int fd3 = open("e.txt",O_RDWR|O_CREAT,0644);if(-1 == fd3){perror("open"),exit(-1);}printf("fd3 = %d\n",fd3);//5close (fd3);//使用fcntl函數進行描述符的拷貝// fd 到 fd3的拷貝 fd3 和 fd4相等int fd4 = fcntl (fd, F_DUPFD, fd3);printf("fd3 = %d,fd4 = %d\n",fd3,fd4);// 5 5 write(fd3,"1",1); //d.txtwrite(fd4,"2",1); //d.txtwrite(fd,"3",1); //d.txt//4.關閉所有描述符close(fd);close(fd2);close(fd3);return 0; } 輸出結果: fd = 3 fd2 = 4 fd3 = 5 fd3 = 5,fd4 = 5od命令查看: # od -c d.txt 0000000 A a 1 2 3 0000005

(2)F_DUPFD_CLOEXEC

復制文件描述符,設置與新描述符關聯的 FD_CLOEXEC 文件描述符標志的值,返回新文件描述符。

(3)F_GETFD

對應于 fd 的文件描述符標志作為函數值返回。當前只定義了一個文件描述符標志 FD_CLOEXEC。

1)上面出現了好幾次 FD_CLOEXEC 文件描述符標志,需要對它了解一下:

參看:執行時關閉標識位 FD_CLOEXEC 的作用 FD_CLOEXEC 是“文件描述符”的標志,用來設置文件的 close-on-exec 狀態。
此標志用來控制在執行 exec 后,是否關閉對應的文件描述符(關閉文件描述符即不能對文件描述符指向的文件進行任何操作)

2)這里又有個新概念 exec :

exec 應該是指 exec系列函數,在此只了解其中的 execl 函數: #include <unistd.h> int execl(const char *path, const char *arg, ...);execl() 其中后綴 "l" 代表 list 也就是參數列表的意思,第一參數path字符指針所指向要執行的文件路徑, 接下來的參數代表執行該文件時傳遞的參數列表:argv[0],argv[1]... 最后一個參數須用空指針NULL作結束
返回值:如果執行成功則函數不會返回, 執行失敗則直接返回-1, 失敗原因存于errno 中. 函數功能:主要用于實現跳轉的功能
示例: #include <unistd.h> int main (void) {// 執行/bin目錄下的ls, 第一參數為程序名ls, 第二個參數為"-al", 第三個參數為"/etc/passwd"execl("/bin/ls", "ls", "-al", "/etc/passwd", NULL);return 0; } 輸出結果: -rw-r--r-- 1 root root 1918 Dec 1 10:28 /etc/passwd

3)FD_CLOEXEC 標志使用

第一、此標志用來控制在執行 exec 后,是否關閉對應的文件描述符
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h>int main (int argc, char *argv[]) {if (argc > 1){int flags = fcntl (STDOUT_FILENO, F_GETFD);if (-1 == flags)perror ("fail to F_GETFD"), exit (-1);flags |= FD_CLOEXEC;if (fcntl (STDOUT_FILENO, F_SETFD, flags) == -1)perror ("fail to F_SETFD"), exit (-1);}execl("/bin/ls", "ls", "-al", "/etc/passwd", NULL);return 0; } 輸出結果: 不含有FD_CLOEXEC標志,未關閉對應的文件描述符 STDOUT_FILENO # ./a.out -rw-r--r-- 1 root root 1918 Dec 1 10:28 /etc/passwd含有FD_CLOEXEC標志,關閉了對應的文件描述符 STDOUT_FILENO # ./a.out 1 ls: 寫入錯誤: 錯誤的文件描述符
第二、在使用fork調用的子進程中,此描述符并不關閉,仍可使用。(驗證失敗)
//vfork函數和execl函數的使用 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h>int main (int argc, char *argv[]) {if (argc > 1){int flags = fcntl (STDOUT_FILENO, F_GETFD);if (-1 == flags)perror ("fail to F_GETFD"), exit (-1);flags |= FD_CLOEXEC;if (fcntl (STDOUT_FILENO, F_SETFD, flags) == -1)perror ("fail to F_SETFD"), exit (-1);}//1.使用vfork函數創建子進程pid_t pid = vfork();if(-1 == pid)perror("vfork"),exit(-1);//2.子進程調用execl函數跳轉if(0 == pid) //子進程{printf("子進程%d開始運行\n",getpid());sleep(2);//調用execl函數進行跳轉execl("/bin/ls", "ls", "-al", "/etc/passwd", NULL);//執行不到printf("子進程結束\n");}sleep (2);//3.父進程執行printf("父進程%d開始執行\n",getpid());printf("父進程結束\n");return 0; } 不含有FD_CLOEXEC標志,未關閉對應的文件描述符 STDOUT_FILENO # ./a.out 子進程3488開始運行 -rw-r--r-- 1 root root 1918 Dec 1 10:28 /etc/passwd 父進程3487開始執行 父進程結束含有FD_CLOEXEC標志,關閉了對應的文件描述符 STDOUT_FILENO # ./a.out 1 子進程3550開始運行 ls: 寫入錯誤: 錯誤的文件描述符 父進程3549開始執行 父進程結束

4)總結:

FD_CLOEXEC 用來設置文件的 close-on-exec 狀態標準。在 exec() 調用后,close-on-exec 標志為0的情況,此文件不被關閉。非零則在 exec() 后被關閉。默認close-on-exec狀態為 0,需要通過FD_CLOEXEC設置 看見有這句話,“在使用fork調用的子進程中,此描述符并不關閉,仍可使用。”但是我驗證了下,在子進程中也是可以關閉的。 (不過還是不太確認,如果哪位看到這里,可以告訴我一下,這句話是否正確)。

(4)F_SETFD

對于 fd 設置文件描述符標志。新標志值按第 3 個參數(取為整型值)設置。
示例同上。

(5)F_GETFL

對應于 fd 的文件狀態標志作為函數值返回。下面是 open 函數時描述的文件狀態標志。
文件狀態標志說明
O_RDONLY只讀打開
O_WRONLY只寫打開
O_RDWR讀、寫打開
O_EXEC只執行打開
O_SEARCH只搜索打開目錄
O_APPEND追加寫
O_NONBLOCK非阻塞模式
O_SYNC等待寫完成(數據和屬性)
O_DSYNC等待寫完成(僅數據)
O_RSYNC同步讀和寫
O_FSYNC等待寫完成(僅FreeBSD和Mac OS X)
O_ASYNC異步I/O(僅FreeBSD和Mac OS X)
不過,5 個訪問方式標志(O_RDONLY、O_WRONLY、O_RDWR、O_EXEC以及O_SEARCH)并不各占1位。因此首先必須用屏蔽字 O_ACCMODE 取得訪問方式位,然后將結果與這5個值的每一個相比較。 通過下面的宏定義可以看出: O_RDONLY、O_WRONLY、O_RDWR這3種標志的值各是0 , 1和2,由于歷史原因,這 5 種值互斥 ,?一個文件的訪問只能有這 5 個值之一 示例說明: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main (void) { //1.打開/創建一個文件 int fd = open ("a.txt", O_WRONLY); if (-1 == fd) perror("open"),exit(-1); int flags = fcntl (fd, F_GETFL, 0);printf ("flags = %d\n", flags);close(fd); return 0; } 輸出結果: flags = 1 對應的函數值查看/usr/include/asm-generic/fcntl.h? 最前面有 0 可以看出數值為八進制,打印轉化為十進制,擴展:進制轉換器 #define O_ACCMODE 00000003 #define O_RDONLY 00000000 #define O_WRONLY 00000001 #define O_RDWR 00000002 #ifndef O_CREAT #define O_CREAT 00000100 /* not fcntl */ #endif #ifndef O_EXCL #define O_EXCL 00000200 /* not fcntl */ #endif #ifndef O_NOCTTY #define O_NOCTTY 00000400 /* not fcntl */ #endif #ifndef O_TRUNC #define O_TRUNC 00001000 /* not fcntl */ #endif #ifndef O_APPEND #define O_APPEND 00002000 #endif #ifndef O_NONBLOCK #define O_NONBLOCK 00004000 #endif #ifndef O_DSYNC #define O_DSYNC 00010000 /* used to be O_SYNC, see below */ #endif后面還有一個更好玩的,現在講的功能都可用數字表示的: #define F_DUPFD 0 /* dup */ #define F_GETFD 1 /* get close_on_exec */ #define F_SETFD 2 /* set/clear close_on_exec */ #define F_GETFL 3 /* get file->f_flags */ #define F_SETFL 4 /* set file->f_flags */ #ifndef F_GETLK #define F_GETLK 5 #define F_SETLK 6 #define F_SETLKW 7 #endif #ifndef F_SETOWN #define F_SETOWN 8 /* for sockets. */ #define F_GETOWN 9 /* for sockets. */ #endif #ifndef F_SETSIG #define F_SETSIG 10 /* for sockets. */ #define F_GETSIG 11 /* for sockets. */ #endif

(6)F_SETFL

將文件狀態標志設置為第 3 個參數的值(取為整型值)。可以更改的幾個標志是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC、O_FSYNC和 O_ASYNC。 以 O_NONBLOCK 為例: //示例一 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main (void) { //1.打開/創建一個文件 int fd = open ("a.txt", O_RDONLY | O_NONBLOCK); if (-1 == fd) perror("open"),exit(-1); int flags = fcntl (fd, F_GETFL, 0); printf ("flags = %d\n", flags); //將其設為非阻塞 flags &= ~O_NONBLOCK;fcntl (fd, F_SETFL, flags);int flags1 = fcntl (fd, F_GETFL, 0); printf ("flags1 = %d\n", flags1); close(fd); return 0; } 輸出結果: flags = 2048 flags1 = 0 //示例二 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main (void) { //1.打開/創建一個文件 int fd = open ("a.txt", O_RDONLY); if (-1 == fd) perror("open"),exit(-1); int flags = fcntl (fd, F_GETFL, 0); printf ("flags = %d\n", flags); flags |= O_NONBLOCK;fcntl (fd, F_SETFL, flags);int flags1 = fcntl (fd, F_GETFL, 0); printf ("flags1 = %d\n", flags1); close(fd); return 0; } 輸出結果: flags = 0 flags1 = 2048

示例說明:

示例一:取消文件的某個flags,比如文件是非阻塞的,想設置成為阻塞:
flags = fcntl(fd,F_GETFL,0); flags &= ~O_NONBLOCK; fcntl(fd,F_SETFL,flags);示例二:增加文件的某個flags,比如文件是阻塞的,想設置成非阻塞:
flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags);

(7)F_GETOWN

獲取當前接收 SIGIO 和 SIGURG 信號的進程 ID 或進程組 ID。(示例以后寫)

(8)F_SETOWN

設置接收 SIGIO 和 SIGURG 信號的進程 ID 或進程組 IF。正的 arg 指定一個進程 ID,負的 arg 表示等于 arg 絕對值的一個進程組 ID。

十、總結

文件I/O這一章講完,不過有幾處沒有搞懂和沒有講到的地方。 首先,進程表、文件表、v節點表這部分沒有搞明白;原子操作沒有講到;函數 sync、fsync和fdatasync沒有講;函數 fcntl 文件鎖部分沒有講;函數 ioctl沒有講;/dev/fd 沒有講。 這些在以后的總結中會涉及到,到時再詳細講吧。

總結

以上是生活随笔為你收集整理的UNIX再学习 -- 文件I/O的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美性色网站 | 射九九| 日韩精选在线观看 | 国产资源在线免费观看 | 在线视频婷婷 | 久草在线观看视频免费 | 久久久久久久影视 | 日本少妇视频 | 天天躁天天躁天天躁婷 | 久久久午夜视频 | 毛片888 | 在线视频 91 | 成人黄色电影免费观看 | 免费看搞黄视频网站 | 国产中文在线视频 | 久久久久久国产精品 | 天天干天天搞天天射 | 久久艹影院 | 国产小视频在线播放 | 国产精品女人久久久 | 天天操夜夜曰 | 亚洲视频观看 | www.天天色 | 成年人在线免费看片 | 久久久久国产精品一区 | 国产精品国产三级国产 | 欧美一区免费观看 | 91九色网站 | 久久综合九色欧美综合狠狠 | 五月婷婷av | 中文字幕亚洲欧美日韩2019 | 五月婷香蕉久色在线看 | 成人小视频免费在线观看 | 又粗又长又大又爽又黄少妇毛片 | 中文字幕一区二区三区四区久久 | 国产一二三在线视频 | 亚一亚二国产专区 | 91视频一8mav | 手机av在线网站 | 亚洲黄色在线免费观看 | 欧美国产一区二区 | 在线视频 精品 | 69精品 | 麻豆久久久 | 亚洲综合色视频 | 91久久久久久久一区二区 | 亚洲免费在线看 | 国产二区视频在线 | 欧美色图88 | 亚洲国产剧情av | 97超视频免费观看 | 色综合久久久网 | 五月天久久久久 | 国产字幕av | 欧美日韩一二三四区 | 91男人影院 | 波多野结衣视频网址 | 99在线热播精品免费 | 久久久片 | 欧美一级特黄aaaaaa大片在线观看 | 色综合久久五月天 | 免费视频成人 | 国产精品精品国产婷婷这里av | 狠狠操精品 | 国产在线97 | 奇米导航 | 欧美一区三区四区 | 中文字幕在线观看国产 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 天天爱天天操 | 日韩电影在线看 | 久久国产精品二国产精品中国洋人 | 午夜精品麻豆 | 国产一级片网站 | 色com网| 国产免费又爽又刺激在线观看 | 99精品在线看 | 热久久电影 | 日韩中文字幕免费 | 国产欧美在线一区二区三区 | 日韩资源在线观看 | 香蕉在线观看视频 | 超碰人在线| 久综合网 | 亚洲欧美日韩国产精品一区午夜 | 在线观看一区二区精品 | 日日夜夜天天人人 | 国产精品久久99综合免费观看尤物 | 国产精品视频免费在线观看 | 国产一级视屏 | 91视频高清完整版 | 欧美a免费 | 国产午夜视频在线观看 | 久草资源在线 | 午夜视频在线观看一区二区三区 | 波多野结依在线观看 | 91在线视频观看免费 | 激情视频网页 | 国产高清成人在线 | 91在线观看欧美日韩 | 91 在线视频播放 | 激情久久伊人 | 日韩欧美国产免费播放 | 久久大片 | 在线观看视频一区二区 | 欧美色图狠狠干 | 成人h电影在线观看 | 婷婷九月激情 | 高清av在线免费观看 | av中文在线影视 | 四虎在线永久免费观看 | 国产aa免费视频 | 国产欧美精品xxxx另类 | 色成人亚洲 | www色 | va视频在线| 五月天激情视频 | 欧美韩国在线 | 久久精品视频在线看 | 91精品在线免费 | 最近中文字幕视频完整版 | 91成人免费观看视频 | 激情网站网址 | 国语自产偷拍精品视频偷 | 久久高清视频免费 | 天天射天天爽 | 亚洲国产日韩在线 | 久久亚洲成人网 | 91精品国产92久久久久 | 日韩精品中文字幕在线不卡尤物 | 91色国产| 97视频免费在线观看 | 九九久久婷婷 | 天无日天天操天天干 | 亚洲精品女人 | 亚洲欧美视频在线播放 | 中国成人一区 | 久久99精品久久久久久久久久久久 | 久草电影免费在线观看 | 免费 在线 中文 日本 | 精品国产网址 | 亚洲精品456在线播放 | 9热精品| 四虎免费在线观看视频 | 久久成人欧美 | 国外调教视频网站 | 天天爽天天爽天天爽 | 久久精品最新 | 99精品国产在热久久 | 成人黄色av网站 | 国产视频999 | 96亚洲精品久久 | 91看片淫黄大片在线播放 | 久久久久久草 | 久福利 | 中文字幕视频网站 | 亚洲亚洲精品在线观看 | 91av99| 欧美日产在线观看 | 国产精品亚州 | 日日婷婷夜日日天干 | 国产一区免费 | 国产精品久久电影观看 | 草久在线 | 国产香蕉97碰碰久久人人 | 激情视频91| 不卡av在线 | 中文字幕国内精品 | 青青五月天 | 99情趣网视频 | 久久久精品影视 | 91网站免费观看 | 国产美女精品久久久 | 最近日本字幕mv免费观看在线 | 国产手机av在线 | 一级成人在线 | 日韩试看 | japanesexxxhd奶水| 国产精品一区二区三区免费视频 | 欧美视频国产视频 | 欧美性生活小视频 | 国产黄大片| 精品国产美女在线 | 亚洲 精品在线视频 | 久久久久国产一区二区 | 国产高清不卡一区二区三区 | 在线看成人av | 国产亚洲在线视频 | 91超碰免费在线 | 国产精品白浆视频 | 久久精品视频在线看 | 国产亚洲精品av | 一区二区三区免费在线观看视频 | 九九久久视频 | 91经典在线 | 精品久久美女 | 欧美一区二视频在线免费观看 | 日韩有码在线播放 | 99久久精品日本一区二区免费 | 天天操天天干天天爱 | 亚洲视频免费 | av在线一级| 最近中文字幕高清字幕在线视频 | 久久久久久久久久久福利 | 黄网站免费看 | 免费在线成人av | 超碰国产人人 | 亚洲3级 | 在线视频福利 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | av不卡免费看 | 亚洲美女免费精品视频在线观看 | 探花视频免费观看 | 女人魂免费观看 | 在线观看国产高清视频 | 欧美 亚洲 另类 激情 另类 | 中文字幕视频免费观看 | 成人午夜免费福利 | 精品一区二区在线免费观看 | 欧美亚洲一级片 | 亚洲精品欧美成人 | 99久精品视频 | 久久久久免费精品国产小说色大师 | 国产一级做a爱片久久毛片a | 天天操操 | 国产在线精品一区 | 天天操月月操 | 欧美最猛性xxxxx亚洲精品 | 天天天天射| 日日爽夜夜操 | 97精品一区二区三区 | 日韩午夜网站 | 精品伦理一区二区三区 | 久久久国际精品 | 国产视频亚洲精品 | 午夜精品久久久久久 | 丁香 久久 综合 | 黄色资源在线观看 | 亚洲欧美偷拍另类 | 欧美精品一区二区免费 | 超碰免费观看 | 国产一卡二卡在线 | 国产精品久久久久久久免费大片 | 精品久久网站 | 在线免费视频a | 91精品视频观看 | 天天爱av导航 | 97电影网站 | 99国产一区二区三精品乱码 | 中文字幕一区在线观看视频 | 国产女做a爱免费视频 | 日本三级中文字幕在线观看 | 香蕉视频亚洲 | 久久精品成人热国产成 | 日韩免费一区二区三区 | 免费高清在线视频一区· | 日本资源中文字幕在线 | 久久高视频 | 性色av免费看| 欧美亚洲精品一区 | 一级一级一片免费 | 一级黄色片毛片 | 国产一区免费在线观看 | 狠狠干天天射 | 成人av在线一区二区 | 国产精品久久久久久99 | 国产成人三级三级三级97 | 亚洲成人网在线 | 午夜视频99| 超碰在线94| 密桃av在线 | 欧美日韩在线播放 | 欧美天天综合 | 亚洲成人欧美 | 国产一二区免费视频 | 免费国产在线视频 | 免费av在线播放 | 成人免费视频网址 | 日韩免费看的电影 | 丁香婷婷激情国产高清秒播 | 久久无码av一区二区三区电影网 | 成年人在线看片 | 欧美日韩高清在线观看 | 国产资源网站 | 久久九九影视 | 久久久久久国产精品999 | 精品国产一区二区三区久久久 | 亚洲一区二区三区在线看 | 国产无限资源在线观看 | 久久久久亚洲国产精品 | 国产经典av | 欧洲激情综合 | 亚洲视频网站在线观看 | 四虎影视精品成人 | 人人爽人人爽人人爽学生一级 | 国产精品中文 | 毛片888 | 丰满少妇高潮在线观看 | 国产精品涩涩屋www在线观看 | 狠狠五月天 | www.五月天 | 天天爽综合网 | 免费亚洲黄色 | 国产资源av | 黄色网www | 久久精品欧美视频 | 九九视频免费在线观看 | 五月开心色| 久久久www成人免费精品张筱雨 | 久久久久色 | 国产伦精品一区二区三区四区视频 | 久久九九影视 | 亚洲黄色成人网 | 久久精品中文视频 | 四虎在线免费观看视频 | 国产精品久久久久久一区二区 | 国产清纯在线 | 97日日 | www.色五月.com | 99久久精品免费 | 日韩免费视频播放 | 91在线观看黄 | 成人午夜免费剧场 | 国产成人久 | 免费看污污视频的网站 | 亚洲一区二区三区四区在线视频 | 日日夜夜91 | 欧美精品久久久久久久 | 一区二区视频播放 | 国产手机视频精品 | 91成人午夜 | 99免费在线 | 亚洲专区 国产精品 | 久久久久久久久久久黄色 | 婷婷六月综合网 | 国产精品亚州 | 精品久久久久久久久久国产 | 国产黄色资源 | 免费看的av片 | 五月开心六月伊人色婷婷 | 国产午夜三级 | 欧美国产日韩久久 | 中文字幕日韩国产 | 成年人视频免费在线播放 | 久久综合9988久久爱 | 中文视频在线 | 中文字幕国产精品 | 激情久久久久久久久久久久久久久久 | 亚洲久草在线视频 | 久久久精品 | 久久精品导航 | 免费在线观看黄网站 | 国产99久久久精品 | 日韩欧美99 | 狠狠伊人 | 综合久久五月天 | 免费视频一二三 | 精品字幕| 激情五月av | 久久视频免费 | 亚洲mv大片欧洲mv大片免费 | 人人澡人 | 夜夜干夜夜 | 天天射综合网站 | 9999精品| 操操操日日日干干干 | 欧美伊人网 | 福利视频午夜 | 色在线最新 | 日韩试看 | www.天天成人国产电影 | 福利视频| 日韩视频www | 人人要人人澡人人爽人人dvd | 人人爽人人爽人人片av | 日本三级吹潮在线 | 国产成人av一区二区三区在线观看 | 91丨九色丨丝袜 | 久久人人爽视频 | 午夜精品中文字幕 | 亚洲精品综合久久 | 欧美性猛片,| 国产精品久久久久影院日本 | 国产乱码精品一区二区蜜臀 | 三级免费黄 | 91精品久久久久久综合五月天 | 欧美日韩成人一区 | 亚洲精品乱码 | 美女黄频在线观看 | 中文字幕资源站 | 香蕉影视 | 91传媒激情理伦片 | 国产成人精品综合久久久 | 91精品亚洲影视在线观看 | 97在线观看视频国产 | 国产精品2018| 九九免费在线看完整版 | 成人av免费看 | 精品国产人成亚洲区 | 特级xxxxx欧美 | 国产中文字幕免费 | 在线视频第一页 | 中国一区二区视频 | 亚洲国产精品视频 | 天天天天天天干 | 在线观看国产日韩欧美 | 成人久久毛片 | 97超视频在线观看 | 五月亚洲婷婷 | 国产精品视频地址 | 国产精品99久久99久久久二8 | 美女免费视频一区 | 欧美一级电影 | 午夜精品婷婷 | 亚洲电影久久 | 日韩av免费一区 | 午夜三级福利 | 久久激情片 | 欧美网址在线观看 | 99免费在线播放99久久免费 | 成人a级大片| 国产亚洲精品美女 | 91在线在线观看 | 在线观看一级视频 | 日av免费| 在线免费观看国产视频 | 精品播放 | 国产午夜精品一区二区三区在线观看 | 香蕉视频国产在线观看 | 亚洲欧美偷拍另类 | 色干干| 日韩欧美视频一区 | 日韩免费电影在线观看 | 久久精品91久久久久久再现 | 久久香蕉国产精品麻豆粉嫩av | 成年人在线观看网站 | 欧美高清成人 | 亚洲成免费 | www日韩精品 | 国产乱对白刺激视频在线观看女王 | 成人一区在线观看 | 中文字幕第一页av | 超碰午夜| 美女视频黄的免费的 | 国产精品久久在线 | 国产黄色大全 | 日韩成人免费在线观看 | 久久伦理电影网 | av免费在线免费观看 | 在线小视频你懂得 | 婷婷丁香综合 | 亚洲精品国久久99热 | 麻豆91精品 | 国产在线视频在线观看 | 久久免费国产精品 | 国产精品99蜜臀久久不卡二区 | 黄色aaa毛片 | 国产流白浆高潮在线观看 | 狠狠操操| 精品亚洲在线 | 天天视频色 | 国产精品高清免费在线观看 | 成人福利在线播放 | 成年人在线看片 | 一区二区三区高清不卡 | 色网址99 | 久热电影 | 黄色片亚洲 | 五月婷婷视频在线观看 | 一区二区亚洲精品 | 亚洲在线高清 | 国产一区二区日本 | 亚洲aⅴ乱码精品成人区 | 8x成人免费视频 | 久久久久久综合 | 性色av免费观看 | 成年人黄色在线观看 | 天天se天天cao天天干 | 在线视频亚洲 | 丰满少妇在线观看网站 | 狠狠色丁香婷婷综合久小说久 | 婷婷伊人综合亚洲综合网 | 成人av一级片 | 超碰人在线 | 久久99久久99精品免视看婷婷 | 又黄又爽又刺激的视频 | 亚洲精品黄色在线观看 | av黄色亚洲 | 奇米影音四色 | 色噜噜在线观看 | 三级黄色免费片 | 又爽又黄又刺激的视频 | 久久五月天婷婷 | www.夜夜夜 | 在线观看福利网站 | 91精品对白一区国产伦 | 国产美女视频一区 | 粉嫩av一区二区三区入口 | 国产视频高清 | 成人国产精品电影 | 蜜臀一区二区三区精品免费视频 | 久久综合九色综合欧美狠狠 | 国产涩涩在线观看 | 日韩在线免费观看视频 | 777久久久 | www.婷婷色 | 天天操狠狠操网站 | 日日夜日日干 | 久久精品中文视频 | 国产精品va在线播放 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产精品电影一区二区 | av中文资源在线 | 久久久人| 五月婷婷在线观看视频 | 欧美天天综合 | 在线视频中文字幕一区 | 欧美日韩一区二区在线观看 | avhd高清在线谜片 | 97视频在线观看网址 | av日韩不卡 | 欧美成年人在线视频 | 亚洲va欧美va人人爽 | 日韩av中文在线观看 | 五月天亚洲婷婷 | 欧美日韩国产一二三区 | av一级在线 | 国产精品久久久av | 国产在线观看你懂得 | 天天骚夜夜操 | www免费网站在线观看 | 日韩videos | 国产精品午夜久久 | 狠狠狠色丁香综合久久天下网 | 最近乱久中文字幕 | 欧美一级日韩三级 | 999电影免费在线观看 | 99re中文字幕 | 免费观看性生活大片 | 97色在线观看免费视频 | 国产精品第一页在线观看 | 亚洲闷骚少妇在线观看网站 | 91福利社在线观看 | 久久夜视频 | 五月激情丁香图片 | 在线免费黄网站 | 91精选在线 | 日本精品久久 | 一区二区三区高清在线观看 | 永久av免费在线观看 | 午夜视频导航 | 国产成人一区二区三区在线观看 | 日韩欧美一区二区三区免费观看 | 亚洲首页 | 国产精品久久久久久久久久三级 | 免费高清在线观看电视网站 | 欧美精品一二三 | 天天干,天天射,天天操,天天摸 | 国产三级精品三级在线观看 | 97小视频| 国产成人在线网站 | 一级性av | 日韩欧美在线播放 | 国产成人区 | 全黄色一级片 | 精品99视频| 国产精品永久免费视频 | 视频国产在线观看18 | 色婷婷婷 | 97精品在线观看 | 欧美日韩在线电影 | 激情综合网在线观看 | 碰天天操天天 | 国产美女精彩久久 | 国产精品自在线 | 一区二区三区韩国免费中文网站 | 日日草视频| 夜夜操网站 | 免费福利视频网站 | 欧美在线aa| 欧美看片| 97在线观看免费观看 | 色网站免费在线看 | 久久久久久蜜桃一区二区 | 日韩.com | 国产精品va在线观看入 | 久久综合综合久久综合 | 国产丝袜一区二区三区 | 综合av在线 | 在线观看小视频 | 麻豆成人精品视频 | 久久成人久久 | 亚洲精品中文在线 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美日韩在线观看不卡 | 99久久免费看 | 视频一区二区免费 | 四虎在线观看网址 | 免费在线观看a v | 日本中文一级片 | 黄色性av| 久久久久久久久久影院 | 欧美污网站 | 狠狠干在线| 九九国产精品视频 | 99在线免费观看视频 | 欧美亚洲一区二区在线 | 精品国产亚洲一区二区麻豆 | 国产精品永久免费 | 最近在线中文字幕 | 视频国产在线观看18 | 国产精品久久久久一区二区三区共 | 黄色午夜网站 | 国产资源av | 国产亚洲精品bv在线观看 | 久草免费在线视频观看 | 成人在线免费小视频 | 超碰免费97 | 国内外成人免费在线视频 | 久久麻豆视频 | 丝袜美腿亚洲 | 激情婷婷在线观看 | 麻豆久久 | 国产黄色精品 | 国产伦精品一区二区三区高清 | 欧美日韩精品影院 | 最新日本中文字幕 | 午夜电影av | 天天操网 | 成 人 黄 色 片 在线播放 | 国产视频在 | 夜夜狠狠 | 91chinesexxx | 国产精品久久久久久久久久 | 久久96国产精品久久99软件 | 欧美久久久久久久久 | 国产经典av | 久久成人在线 | 亚洲精品免费在线播放 | 国产无套精品久久久久久 | 一区二区影院 | 国产黄色av | 中文字幕日韩高清 | 天天综合亚洲 | 色综合久久88色综合天天6 | 三级av在线免费观看 | 久久影视一区二区 | 亚洲伦理一区 | 国精产品999国精产品视频 | 久久久久福利视频 | 免费午夜av | 亚洲不卡在线 | 精品免费观看 | a黄色一级| 国产丝袜制服在线 | 丁香婷婷久久 | 一区二三国产 | 久久激情小视频 | 精品字幕在线 | 成人免费在线视频 | 欧美日韩破处 | 在线国产小视频 | 日韩一区二区三区视频在线 | 久久婷婷视频 | av电影在线免费观看 | 色综合久久88色综合天天人守婷 | 日韩中文字幕在线观看 | 天天爽天天爽 | 丁香久久激情 | 在线视频 影院 | 国产在线一区二区 | 色综合久久88色综合天天 | 国产美女视频网站 | 日韩精品一区二区三区丰满 | 999久久久| 日韩在线视频网址 | 97在线观看免费观看高清 | 成人国产精品久久久久久亚洲 | 国产不卡在线视频 | a级免费观看 | 五月婷婷播播 | 国产精品欧美久久久久无广告 | 五月婷婷视频 | 天天干天天干天天射 | 国产一区在线视频观看 | 久久爽久久爽久久av东京爽 | 国产一区二区在线观看视频 | 国产高清精品在线 | 国产一级片一区二区三区 | 日韩免费观看一区二区 | 最近日本字幕mv免费观看在线 | 一区二区视频在线看 | 日韩av一区二区在线 | 久久爱影视i | 九九精品视频在线看 | 国产亚洲精品久久久久久无几年桃 | 国内久久看 | 麻豆一区在线观看 | 天天干天天做天天爱 | 亚洲日本中文字幕在线观看 | 黄色免费视频在线观看 | 久久久久久久久久毛片 | 免费看黄的 | 在线播放你懂 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | a在线免费 | 免费观看一区二区 | 日韩理论在线 | a v在线观看 | 日韩在线免费 | 精品国产一二三四区 | 亚洲精品在线观看av | 中文字幕亚洲综合久久五月天色无吗'' | 91视频在线网址 | 黄色1级大片 | 在线成人欧美 | 六月激情 | www黄在线 | 九九在线高清精品视频 | 狠狠色丁香婷婷综合橹88 | 一本之道乱码区 | 亚洲在线视频免费观看 | 色婷婷六月天 | 99视频在线免费播放 | 国产一区二区精品久久91 | 国产成视频在线观看 | 日韩一区二区三 | 国产午夜精品福利视频 | 日韩欧美在线一区 | 午夜.dj高清免费观看视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | av线上看| 九九热精品视频在线播放 | 狠狠色丁香婷婷综合欧美 | 黄色大片日本 | 91在线影视 | 色婷婷激情电影 | 国产高清专区 | 中日韩在线视频 | 国产一级免费观看 | 亚洲国产福利视频 | 中文字幕在线观看视频一区 | 91成人天堂久久成人 | 久久视频免费在线 | 四虎在线永久免费观看 | 中文免费观看 | www.干| 亚洲va天堂va欧美ⅴa在线 | av888.com | 在线观看中文字幕2021 | 黄色av免费在线 | 欧美精品久久人人躁人人爽 | 亚洲欧美偷拍另类 | 精品日韩在线一区 | 在线看v片| 精品一二| 丝袜美腿亚洲综合 | 精品国产电影一区二区 | 精品a视频 | 天天操导航 | 成人免费视频网址 | 国产精品字幕 | 国产精品18久久久久久vr | 国产精品日韩在线播放 | 最新午夜| 三级a视频 | 综合色中色| 久久精品一区八戒影视 | 亚洲国产精品va在线看黑人 | 国产精品第一 | 日韩三级免费 | 伊人婷婷 | 亚洲欧美经典 | 欧美一级裸体视频 | 2018好看的中文在线观看 | 亚洲国产成人精品久久 | 亚洲一二三区精品 | 国产高清视频网 | 国产 在线 高清 精品 | 亚洲精品玖玖玖av在线看 | 日韩av在线看 | 亚洲va天堂va欧美ⅴa在线 | 欧美国产大片 | 欧美日韩精品区 | 视频三区在线 | 91在线观看黄 | 中文字幕免费一区 | 国产一级三级 | 一区二区 久久 | 国产精品久久久 | 91精品国自产拍天天拍 | 99热99| 91亚洲欧美| 欧美xxxxx在线视频 | www.在线看片.com | 久久精品美女视频网站 | 欧美精品免费在线观看 | 99久久精品国产免费看不卡 | 久久综合精品一区 | 久久综合99| 91亚洲狠狠婷婷综合久久久 | 亚洲欧美乱综合图片区小说区 | 丝袜制服天堂 | 一级片免费观看视频 | 精品在线亚洲视频 | 成 人 黄 色 免费播放 | 亚洲国产精品久久久 | 成在人线av | 九九热视频在线播放 | 亚洲aⅴ一区二区三区 | 综合网伊人 | 精品国产精品久久一区免费式 | 欧美另类交人妖 | 一区免费观看 | 啪啪免费试看 | 色噜噜狠狠狠狠色综合久不 | 国产一区福利在线 | 99亚洲精品在线 | 在线中文字幕一区二区 | 黄色特级片 | freejavvideo日本免费| 婷婷激情综合五月天 | 日本精品二区 | 97人人模人人爽人人少妇 | 免费高清在线视频一区· | 视频一区亚洲 | 成人一区在线观看 | 色在线免费观看 | 亚洲 综合 国产 精品 | 亚洲精品乱码久久久久久 | 精品久久久久久电影 | 中文字幕123区 | 成人黄色电影视频 | 色诱亚洲精品久久久久久 | 色综合天天综合 | 在线免费视频 你懂得 | 深爱激情综合网 | 欧美激情精品久久久 | 亚洲午夜久久久久久久久电影网 | 91日韩精品 | 亚洲精品视频在线观看视频 | 欧美成年人在线观看 | 久久久久久综合 | 国产原厂视频在线观看 | 毛片一级免费一级 | 97超碰站| 久久精品999 | 日韩精品视频在线观看网址 | 欧美怡红院视频 | 九色视频自拍 | 婷婷丁香激情五月 | 国产一区黄色 | 免费观看黄 | 福利区在线观看 | 免费av观看 | 欧美日韩一区二区三区在线免费观看 | 91欧美日韩国产 | 国产乱对白刺激视频在线观看女王 | 欧美在线一级片 | 日本99干网 | 国产高清无av久久 | 天堂在线一区 | 91视频首页 | 97韩国电影 | 欧美色图视频一区 | 五月婷婷在线综合 | 精品国产1区 | 欧美在线观看视频 | 久草在线免费资源站 | 中文av字幕在线观看 | 久久精品屋| 色婷婷五| 特级免费毛片 | av看片在线 | 免费97视频 | 成人夜晚看av | 97av视频| 国产一级片免费视频 | 久久久久成人精品免费播放动漫 | av中文天堂在线 | 人人爽久久久噜噜噜电影 | 亚洲精品乱码 | 最近久乱中文字幕 | www.国产在线观看 | 国产精品一区欧美 | 永久免费精品视频 | 久久精品视频免费 | 激情在线网址 | 国产一区二区三区黄 | 狠狠狠色丁香婷婷综合久久五月 | 色视频网页| 亚洲精品国产精品国自产观看 | 亚洲成a人片综合在线 | 日日操天天操狠狠操 | 色噜噜日韩精品欧美一区二区 | 亚洲一级片在线观看 | 亚洲欧洲中文日韩久久av乱码 | 亚洲成人精品 | 午夜在线免费观看视频 | www.啪啪.com | 精品久久久久久久久久久院品网 | 久久一区二区免费视频 | 麻豆视频免费播放 | 欧美aaa视频| 日韩在线短视频 | 黄色大全在线观看 | 亚洲精品三级 | 色午夜 | 亚洲日本成人网 | 国产区免费| 中文字幕一区二区三区在线视频 | 国产高清视频在线播放一区 | 国产女人18毛片水真多18精品 | 久久不射电影院 | 久久久久久久久久久久久9999 | 中文字幕欧美日韩va免费视频 | 国产精品日韩在线观看 | 麻豆国产露脸在线观看 | www.com黄 | 日韩在线视频网址 | 免费看污的网站 | 国产又粗又猛又爽又黄的视频免费 | 人人玩人人添人人澡97 | 在线观看午夜av | 国产一级免费视频 | 日韩中文在线观看 | 欧美最新大片在线看 | 77国产精品 | 亚洲国产精品影院 | 人人爽影院 | 91精品日韩| 久久久久久久福利 | 欧美一二区视频 | 欧美a级一区二区 | 狠狠躁日日躁狂躁夜夜躁 | 天天看天天干天天操 | 免费在线观看一区二区三区 | 日本在线视频一区二区三区 | 青青视频一区 | 婷婷日 | 色在线视频 | 国产黄色av网站 | 一本大道久久精品懂色aⅴ 五月婷社区 | 天天爽夜夜爽精品视频婷婷 | 在线免费看黄色 | 黄色91免费观看 | 人人爽人人香蕉 | 在线观看黄网站 | 久久五月天婷婷 | 麻豆免费观看视频 | 国产正在播放 | 在线观看日韩av | 色天天| av大全在线| 亚洲欧美精品一区二区 | 久久96| 国产精品video爽爽爽爽 | 91入口在线观看 | 亚洲jizzjizz日本少妇 | av丝袜在线 | www色网站 | 国产精品自产拍在线观看网站 | 色吧久久 | 美女一区网站 | 人人爽人人 | 亚洲国产精品成人va在线观看 | 欧美三级高清 | 香蕉视频18 | 久久精品直播 | 国产精品日韩精品 | 亚洲免费观看视频 | 天天干天天干天天干天天干天天干天天干 | 97香蕉视频 | 中文在线字幕观看电影 | 成人黄色在线看 | 亚洲区视频在线观看 | 超碰在线个人 | 国产日韩欧美在线观看视频 | 999热视频| 婷婷丁香花五月天 | 四虎国产免费 | 久草网在线观看 | 精品黄色在线观看 | 日本在线精品视频 | 国产精品一区二区久久久 | 久久国产精品99久久久久久老狼 | 国产精品黄色影片导航在线观看 | 精品成人在线 | 成人午夜剧场在线观看 | 波多野结衣电影一区二区 | 亚洲精品在线观看网站 | bbbbb女女女女女bbbbb国产 | 99精品视频在线 | 91社区国产高清 | 国产精品久久久久久久久久ktv | 亚洲精品久久视频 | 天天综合久久 | 久草免费在线视频 |