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...