linux檔案程式設計

2021-08-13 02:37:19 字數 4542 閱讀 7731

一、系統呼叫

所謂系統呼叫是指作業系統提供給使用者的一組「特殊」介面,使用者程式可以通過這組「特殊」介面來獲得作業系統核心提供的的服務。

由於在linux中,為了更好地保護核心空間,將程式的執行空間分為核心空間和使用者空間(也就是常稱的核心態和使用者態),它們分別執行在不同的級別上,在邏輯上是相互隔離的。

因此,使用者程序在通常情況下不允許訪問核心資料,也無法使用核心函式,它們只能在使用者空間操作使用者資料,呼叫使用者空間的函式。

二、使用者程式設計介面(api)

系統呼叫並不是直接與程式設計師進行互動的,它僅僅是乙個通過軟中斷機制向核心提交請求,以獲取核心服務的介面。在實際使用中程式設計師呼叫的通常是使用者程式設計介面—api。

系統命令相對api更高了一層,它實際上乙個可執行程式,它的內部引用了使用者程式設計介面(api)來實現相應的功能。

三、linux 檔案

linux一點哲學,「一切皆為檔案」;在linux中對目錄和裝置的操作都等同於對檔案的操作,都是使用檔案描述符來進行的。

linux檔案可分為:普通檔案,目錄檔案,鏈結檔案,裝置檔案。

四、檔案及檔案描述符

當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符;當需要讀寫檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。

檔案描述符是乙個非負的整數,它是乙個索引值,並指向在核心中每個程序開啟檔案的記錄表。

乙個程序啟動時,都會開啟3個檔案:標準輸入、標準輸出和標準出錯處理。

標準輸入的檔案描述符:0

標準輸出的檔案描述符:1

標準出錯的檔案描述符:2

五、不帶快取的(系統呼叫)-檔案訪問

1.creat(不常用)

int creat(const char *filename, mode_t mode )

filename :建立的檔名(包含路徑,預設為當前路徑)

mode:建立模式

常建立模式:s_irusr(可讀)、s_iwusr(可寫)、s_ixusr(可執行)、s_ixrwu(可讀、可寫、可執行) 除用以上巨集來選擇建立模式,也可以用數字來表示。

#include

#include

#include

#include

#include

int main()

exit(1);

return

0;}

2.open

open可用來開啟檔案或者建立檔案

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

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

pathname:檔名(路徑)

flags:開啟的方式(唯讀、只寫、讀寫)

mode:建立時定義的使用者許可權

返回值:成功返回新分配的檔案描述符,

出錯返回-1並設定errno

操作完成後close ,int close(int fd)

#include 

#include

#include

#include

#include

int main()

close(fd);

return

0;}

3.read

int read(int fd, const void *buf, size_t length)

功能:

從檔案描述符fd所指定的檔案中讀取length個位元組到buf所指向的緩衝區中,返回值為實際讀取的位元組數。

#include 

#include

#include

#include

#include

#include

#include

#include

int main()

; fd = open("hello.txt", o_rdwr | o_creat, s_irwxu);

if(-1 == fd)

ret = read(fd, buf, sizeof(buf));

if(-1 == ret)

printf("read is :%s\n", buf);

close(fd);

return

0;}

4.write

int write(int fd, const void * buf, size_t length)

功能:

把length個位元組從buf指向的緩衝區中寫到檔案描述符fd所指向的檔案中,返回值為實際寫入的位元組數。

#include 

#include

#include

#include

#include

#include

#include

#include

int main()

ret = write(fd, buf, sizeof("hello world!"));

if(-1 == ret)

close(fd);

return

0;}

5.lseek(定位)

int lseek(int fd, offset_t offset, int whence)

功能:

將檔案讀寫指標相對whence移動offset個位元組。操作成功時,返回檔案指標相對於檔案頭的位置。

seek_set:相對檔案開頭

seek_cur:相對檔案讀寫指標的當前位置

seek_end:相對檔案末尾

六、帶快取的(庫函式)- 檔案訪問

在linux系統下帶快取和不帶快取的都可使用,當處理資料較多時,使用帶快取的比較方便。

標準i/o提供快取的目的就是減少呼叫read和write的次數,它對每個i/o流自動進行快取管理(標準i/o函式通常呼叫malloc來分配存)。

2) 行快取。當輸入輸出遇到新行符或快取滿時,才由標準i/o庫執行實際i/o操作。stdin、stdout通常是行快取的。 (如printf就是乙個行快取,遇到換行(\n)才會重新整理快取)。

3) 無快取。相當於read、write了。stderr通常是無快取的,因為它必須盡快輸出。

1.fopen

file *fopen(const char *filename, const char *mode)

filename:開啟的檔名(包含路徑,預設為當前路徑)

r:唯讀 w:只寫

int fclose(file * stream);

#include

#include

int main()

fp=fopen("hello.txt","r+");

if(null==fp)

fclose(fp);

return

0;}

2.fread

size_t fread(void * ptr,size_t size,size_t nmemb, file * stream)

函式說明: fread()用來從檔案流中讀取資料。

引數:stream為已開啟的檔案指標,

ptr: 指向欲存放讀取進來的資料空間,讀取的字元數以引數size*nmemb來決定。

返回值:返回實際讀取到的nmemb數目。

#include

#include

int main()

; size_t ret;

fp=fopen("hello.txt","r");

if(null==fp)

ret=fread(buf,1,sizeof(buf),fp);

if(0==ret)

printf("read from txt:%s\n",buf);

return

0;}

3.fwrite

size_t fwrite(const void * ptr, size_t size, size_t nmemb, file * stream)

函式說明:fwrite()用來將資料寫入檔案流中。

引數:stream:為已開啟的檔案指標,

ptr: 指向欲寫入的資料位址,總共寫入的字元數以引數size*nmemb來決定。

返回值:返回實際寫入的nmemb數目。

#include

#include

#include

int main()

; size_t ret;

scanf("%s",buf);

fp=fopen("hello.txt","w");

if(null==fp)

ret=fwrite(buf,strlen(buf),1,fp);

if(0==ret)

return

0;}

Linux檔案程式設計

在linux下可以通過相應的檔案i o函式來完成對檔案的操作,這些函式通常被稱為不帶緩衝的i o,因為這些函式對檔案的讀寫都是呼叫linux核心的系統呼叫來實現的。基本的函式包括 open read write lseek 設定檔案指標 close等 呼叫格式 include include inc...

Linux檔案程式設計

linux中檔案程式設計可以使用兩種方法 1.linux系統呼叫 2.c語言庫函式。系統呼叫是基於linux系統的,它不能跨系統使用。c語言庫函式在各個系統都能使用。a.下面先介紹基於系統呼叫的檔案程式設計 1.檔案的建立.int creat const char filename,mode t m...

Linux檔案程式設計

所謂系統呼叫是指作業系統提供給使用者的一組 特殊 介面,使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的的服務 由於在linux中,為了更好地保護核心空間,將程式的執行空間分為核心空間和使用者空間 也就是常稱的核心態和使用者態 它們分別執行在不同的級別上,在邏輯上是相互隔離的。因此,使用者...