open與fopen的區別

2021-10-02 21:19:35 字數 2633 閱讀 1369

當乙個可執行程式執行以後,就變成程序,作業系統會為每個程序分配一定的虛擬記憶體空間,32位作業系統就分配4g。虛擬記憶體空間結構如下圖所示:

1g是核心空間使用,剩餘3g為使用者空間,虛擬記憶體就是當物理記憶體(如記憶體條)不夠時,從磁碟上分配一塊空間。為什麼要虛擬空間了?因為物理記憶體一般都很小,當有多程序要執行時,物理記憶體很快就分配完了,剩餘的程序只有等待前面的程序完成以後才能執行,效率很低。使用虛擬記憶體能夠更高效的分配物理記憶體。

在核心區的程序管理中,有乙個檔案描述符表。乙個程序有乙個程序描述符表,最多可以儲存1024個檔案描述符,每開啟乙個檔案就占用乙個檔案描述符。

前三個檔案描述符被stdin,stdout,stderr占用。

open為系統函式,fopen為標準c庫函式。使用系統函式open返回的是檔案描述符,使用c的標準庫函式fopen,返回的是檔案指標。通過檔案描述符才能找到檔案在磁碟中對應的位置。

常用的系統函式有:

對於標準c庫函式:

返回的是檔案指標,其中封裝了檔案描述符以及緩衝區(在物理記憶體上)。資料時先寫到緩衝區,再寫到磁碟。磁碟是機械裝置,讀寫為毫秒級別,而物理記憶體時電子裝置,讀寫速度為奈米級別。如果對機械硬碟乙個乙個字元進行讀寫,速度較慢,可以先都存入緩衝,然後再一起寫入到磁碟,能夠節省時間,提高執行效率。

通過上面兩張圖可以發現,標準c庫函式先將資料存入buffer中,然後再呼叫系統函式對磁碟進行讀寫操作,標準c庫函式不能直接對磁碟進行讀寫。

標頭檔案:#include #include #include

定義函式:

int open(const char * pathname, int flags);

int open(const char * pathname, int flags, mode_t mode);

函式說明:

引數mode 則有下列數種組合, 只有在建立新檔案時才會生效, 此外真正建檔案時的許可權會受到umask 值所影響, 因此該檔案許可權應該為 (mode-umaks).

s_irwxu00700 許可權, 代表該檔案所有者具有可讀、可寫及可執行的許可權.

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_irwxo 00007 許可權, 代表其他使用者具有可讀、可寫及可執行的許可權.

s_iroth 00004 許可權, 代表其他使用者具有可讀的許可權

s_iwoth 00002 許可權, 代表其他使用者具有可寫入的許可權.

s_ixoth 00001 許可權, 代表其他使用者具有可執行的許可權.

返回值:若所有欲核查的許可權都通過了檢查則返回0 值, 表示成功, 只要有乙個許可權被禁止則返回-1.

錯誤**:

eexist 引數pathname 所指的檔案已存在, 卻使用了o_creat 和o_excl 旗標.

eaccess 引數pathname 所指的檔案不符合所要求測試的許可權.

erofs 欲測試寫入許可權的檔案存在於唯讀檔案系統內.

efault 引數pathname 指標超出可訪問記憶體空間.

einval 引數mode 不正確.

enametoolong 引數 pathname 太長.

enotdir 引數pathname 不是目錄.

enomem 核心記憶體不足.

eloop 引數pathname 有過多符號連線問題.

eio i/o 訪問錯誤.

附加說明:使用 access()作使用者認證方面的判斷要特別小心, 例如在access()後再作open()空檔案可能會造成系統安全上的問題.

例子:

#include #include #include #include main()

執行結果:linux programmer!

fopen與open的區別

open和fopen的區別 1.緩衝檔案系統 緩衝檔案系統的特點是 在記憶體開闢乙個 緩衝區 為程式中的每乙個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體 緩衝區 裝滿後再從記憶體 緩衝區 依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體 緩衝區 待記憶體 緩衝區 裝滿後再...

fopen與open的區別

fopen與open的區別 可以參考 4.6,比較詳細的講解了fopen,open,檔案描述符,檔案指標,以及在父程序與子程序的不同.摘自chinaunix open和fopen的區別 前者屬於低階io,後者是高階io。前者返回乙個檔案描述符 使用者程式區的 後者返回乙個檔案指標。前者無緩衝,後者有...

fopen與open的區別

2011 02 25 14 40 23 分類 c 字型大小訂閱 相同點 都是用來完成檔案開啟操作的函式 不同點 open是系統呼叫,返回的是檔案控制代碼,fopen是庫函式,返回的是乙個指向檔案結構的指標 open與 read,write等配合使用,fopen與 fread,fwrite等配合使用 ...