文件描述符
文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。
啟動一個進程之后,內核 PCB 的文件描述符表中就已經分配了三個文件描述符。默認支持打開的最大文件數為 1024。
三個特殊的文件描述符
- 標準輸入文件
- 標準輸出文件
- 標準錯誤輸出文件
#define STDIN_FILENO 0 // 標準輸入文件
#define STDOUT_FILENO 1 // 標準輸出文件
#define STDERR_FILENO 2 // 標準錯誤輸出文件
系統調用
由操作系統實現提供的所有系統調用所構成的集合即程序接口或應用編程接口(Application Programming Interface,API)。是應用程序同系統之間的接口。
Linux系統調用是應用程序與Linux內核進行交互的接口,可以請求內核對其提供服務。這些服務包括文件操作、進程管理、內存管理、網絡通信等。系統調用可以實現訪問系統資源的安全方式,因為它確保了用戶空間和內核空間之間的隔離。在Linux系統中,系統調用以C庫函數的形式提供給應用程序,而C庫函數會調用相應的匯編指令來觸發軟中斷,將控制權轉交給內核進行相應的處理。Linux系統調用的調用號通過eax寄存器傳遞給內核,不同的系統調用有不同的調用號。
creat
函數
函數原型:
int creat(const char *pathname, mode_t mode);
參數說明:
pathname
:文件路徑名,可以是相對路徑或絕對路徑。mode
:文件創建模式,用于指定文件的權限、所有權等屬性。mode_t是一個無符號整型數據類型。
函數返回值:
- 如果文件創建成功,返回文件的描述符;
- 如果文件創建失敗,返回-1。
creat函數的作用如下:
- 檢查文件路徑名是否合法;
- 創建一個新的文件;
- 設置文件的權限、所有權等屬性;
- 返回文件的描述符,以便后續進行讀寫操作。
在使用時,需要包含以下頭文件:
#include <sys/types.h> // 包含基本系統數據類型
#include <sys/stat.h> // 包含文件數據結構信息
#include <fcntl.h> // 定義了很多宏和open等函數原型
例如,創建一個其他用戶可以讀、寫的文件"lab.kk"。
#include <sys/types.h> // 包含基本系統數據類型
#include <sys/stat.h> // 包含文件數據結構信息
#include <fcntl.h> // 定義了很多宏和open等函數原型int main()
{creat("lab.kk", S_IROTH | S_IWOTH);return 0;
}
也可以用八進制表示:
#include <sys/types.h> // 包含基本系統數據類型
#include <sys/stat.h> // 包含文件數據結構信息
#include <fcntl.h> // 定義了很多宏和open等函數原型int main()
{creat("lab.kk", 0006 );return 0;
}
open
函數
open
函數用于打開一個文件,并返回一個文件描述符,以便后續對文件進行讀寫操作。它有兩種形式的原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
參數說明:
pathname
:文件路徑名,可以是相對路徑或絕對路徑。flags
:打開文件時的標志,用于指定打開文件的方式(如只讀、只寫、追加等)。
mode
:如果需要創建新文件,需要指定文件的創建模式(包括文件權限、所有權等屬性),此參數僅在第二種形式中使用。
函數返回值:
- 成功打開文件,返回文件描述符;
- 打開文件失敗,返回-1。
open函數的作用是用于打開文件或者創建文件。
例如,
int fd1 = open("lab.kk", O_RDONLY); // 以只讀方式打開文件lab.kk
int fd2 = open("lab.kk", O_WRONLY | O_CREAT, 0644); // 以只寫方式打開文件,如果文件不存在則創建,設置權限為0644
一、Linux文件編程—open 和創建文件creat函數的使用介紹、文件描述符的概述、linux文件編程的一般步驟、linux文件管理的描述
h