檔案描述符操作

2021-05-02 03:40:26 字數 1634 閱讀 5965

1.複製檔案描述符

使用如下函式:

#include

int dup(int filedes);

int dup2(int filedes,int filedes2);

dup()用來複製引數oldfd所指的檔案描述詞,並將它返回。此新的檔案描述詞和引數oldfd指的是同乙個檔案,共享所有的鎖定、讀寫位置和各項許可權或旗標。例如,當利用lseek()對某個檔案描述詞作用時,另乙個檔案描述詞的讀寫位置也會隨著改變。不過,檔案描述詞之間並不共享close-on-exec旗標。

返回值 當複製成功時,則返回最小及尚未使用的檔案描述詞。若有錯誤則返回-1,errno會存放錯誤**。錯誤**ebadf引數fd非有效的文

件描述詞,或該檔案已關閉。

dup2()用來複製引數oldfd所指的檔案描述詞,並將它拷貝至引數newfd後一塊返回。若引數newfd為一已開啟的檔案描述詞,則newfd所指的檔案會先被關閉。dup2()所複製的檔案描述詞,與原來的檔案描述詞共享各種檔案狀態,詳情可參考dup()。

返回值 當複製成功時,則返回最小及尚未使用的檔案描述詞。若有錯誤則返回-1,errno會存放錯誤**。

附加說明 dup2()相當於呼叫fcntl(oldfd,f_dupfd,newfd);請參考fcntl()。

錯誤** ebadf 引數fd 非有效的檔案描述詞,或該檔案已關閉

判斷當前程序第乙個可用的檔案描述符是多少:

錯誤做法:

#include

int  func()

int fd;

fd=dup(0);//複製已開啟的任意乙個檔案的描述符,標準輸入幾乎總會被開啟

close(fd);

return fd;//fd返回了當前可用的第乙個可用的檔案描述符,但是它被測試檔案占用了,關閉測試檔案使它再次變為可用。

改程式錯在關閉fd的同時,標準輸入也被關閉了。因為兩者共用乙個檔案表項。

正確做法:

#include

int  func()

int fd;

fd=ppen(……);//開啟乙個肯定存在的檔案,open肯定會返回最小的哪個可用的檔案描述符

close(fd);

return fd;//fd返回了當前可用的第乙個可用的檔案描述符,但是它被測試檔案占用了,關閉測試檔案使它再次變為可用。

使用dup2時,要注意如下情況:

fd=dup2(fd1,fd1);

先關閉fd1所代表的檔案,又將fd1複製過來,這是很危險的。因此,要有如下判斷:

if(fd1!=fd1)

fd=dup2(fd1,fd2);

2.i/o重定向

即使用乙個檔案代替系統預設的標準輸入,輸出,出錯。

>filename表示輸出重定向,程式將將內容輸出到檔案filename中,而不輸出在螢幕上。

程式編寫時,與正常情況下一樣。執行時重定向即可。

eg:./example out.txt

3.控制檔案

當需要對乙個開啟的檔案的屬性進行修改,或得到檔案的某些屬性時,可以使用fcntl函式。

#include

下例先開啟乙個檔案,之後用fcntl函式將檔案的狀態標誌修改為追加寫。

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...

檔案描述符

作業系統程序表中存放各個檔案進行檔案描述 核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。目錄檔案描述符概述 如何建立檔案描述符 使用的好處 缺點...