檔案操作IO

2021-10-06 15:11:01 字數 2363 閱讀 5373

dup(oldfd)和dup2(oldfd, newfd)這兩個函式我們可以用來複製檔案描述符。

(1) 其中oldfd和newfd分別是複製前檔案描述符和複製後的檔案描述符。

(2) 這兩個函式的呼叫都將複製檔案描述符oldfd,且他們的返回值都為新的檔案描述符。

(3) 不同點是dup()的返回值是最小的未用檔案描述符;dup2()的返回值是預先制定的檔案描述符newfd。

(4) 對於dup2(),如果檔案描述符newfd正在被使用,則先關閉newfd;如果newfd同oldfd,則不關閉該檔案正常返回。

實現重定位:

檔案描述符1->列印到螢幕

int fd1 = 0;

int fd2 = 0;

fd1 = open("./file.txt", o_rdwr|o_trunc);

if (-1 == fd1) print_err("open fail.");

close(1); // 關閉標準輸出檔案描述符

//printf("hello world\n"); //此時不會列印到螢幕

fd2 = dup(fd1); // fd2 = 1,因為1被關閉了,dup會找到最小的未使用的檔案描述符

printf("hello world\n"); //此時列印到file.txt了

或者使用dup2

int fd1 = 0;

int fd2 = 0;

fd1 = open("./file.txt", o_rdwr|o_trunc);

if (-1 == fd1) print_err("open fail.");

dup(fd1, 1); // newfd若被開啟,則將其關閉;若newfd=oldfd,則不會將其關閉,直接返回

printf("hello world\n"); //此時列印到file.txt了

重定位命令 > 就是呼叫dup和dup2實現的。

ls > file.txt 就會將ls的結果輸出到file.txt中。

檔案的共享操作:

(1)單一程序多次open同一檔案,實現共享操作

同一程序的檔案描述符表操作不同的檔案表,但是v節點指標指向同乙個v節點

(2)多個程序多次open,共享操作同一檔案

不同程序有各自的檔案描述符表,指向自己的檔案表,但是v節點指標指向同乙個v節點。

(3)在單個程序中,使用dup和dup2實現檔案共享操作。

fcntl函式

#include #include int fcntl(int fd, int cmd, ... /* arg */ );
fcntl()針對(檔案)描述符提供控制。

fcntl函式有5種功能:

複製乙個現有的描述符(cmd=f_dupfd).

獲得/設定檔案描述符標記(cmd=f_getfd或f_setfd).

獲得/設定檔案狀態標記(cmd=f_getfl或f_setfl).

獲得/設定非同步i/o所有權(cmd=f_getown或f_setown).

獲得/設定記錄鎖(cmd=f_getlk , f_setlk或f_setlkw).

int fd = 0;

fd = open("./file.txt", o_rdwr|o_trunc);

if (-1 == fd) print_err("open fail.");

//模擬dup

//close(1);

//dup(fd);

fcntl(fd, f_dupfd, 0);

printf("hello world!");

//模擬dup2

//dup2(fd, 1);

close(1);//fcntl沒有自動關閉檔案描述符的功能

fcntl(fd, f_dupfd, 1);

void print_err(char *str) 

int open_func1(void)

int open_func2(void)

int main()

system("pause");

return 0;

}

int open_func1(void) 

int open_func2(void)

int main()

system("pause");

return 0;

}

檔案IO操作

在對乙個檔案或者裝置進行讀寫之前,都需要先開啟,以獲得該檔案或者裝置的操作指標,也就是檔案描述符。有了檔案描述符,後續就可以進行讀取,修改操作了。標頭檔案函式宣告 int open const char pathname,int flags,mode t mode 返回值成功 返回檔案描述符 失敗 ...

IO操作 檔案IO

一 系統呼叫 系統呼叫實際上是作業系統 核心 提供的供使用者使用的介面函式。二 標準io函式和檔案io函式的關係 標準io是c庫內定義的函式,是凌駕於系統之上的,適用於任何的作業系統 檔案io是由linux系統提供的,只能在linux系統中使用,而不可以在其它作業系統中使用。標準io函式可以呼叫檔案...

檔案IO操作讀寫檔案

寫操作對應的有 put write等。寫操作的型別 ascii碼型別的可知字串 put put只能寫入一兩個字元,多了寫不了 include using namespace std intmain int args,char ar 二進位制型別寫檔案 write include using name...