2017 12 05 Linux檔案程式設計

2021-08-13 02:52:14 字數 2909 閱讀 9841

linux檔案程式設計:

1. linux系統呼叫及使用者程式設計介面(api)

2. linux中檔案及檔案描述符概述

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

4.帶快取的(庫函式)- 檔案訪問

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

由於在linux中,為了更好地保護核心空間,將程式的執行空間分為核心空間和使用者空間(也就是常稱的核心態和使用者態),它們分別執行在不同的級別上,在邏輯上是相互隔離的。因此,使用者程序在通常情況下不允許訪問核心資料,也無法使用核心函式,它們只能在使用者空間操作使用者資料,呼叫使用者空間的函式。

使用者程式設計介面(api):系統呼叫並不是直接與程式設計師進行互動的,它僅僅是乙個通過軟中斷機制向核心提交請求,以獲取核心服務的介面。在實際使用中程式設計師呼叫的通常是使用者程式設計介面—api。系統命令相對api更高了一層,它實際上乙個可執行程式,它的內部引用了使用者程式設計介面(api)來實現相應的功能。

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

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

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

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

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

系統呼叫creat:int creat(const char *filename, mode_t mode ) 

filename :建立的檔名

(包含路徑,預設為當前路徑)

mode:建立模式

常建立模式:

s_irusr      可讀

s_iwusr     可寫

s_ixusr      可執行

s_ixrwu     可讀、可寫、可執行

除用以上巨集來選擇建立模式,也可以用數字來表示

系統呼叫open:open函式是用於開啟或建立檔案,在開啟或建立檔案時可以指定檔案的屬性及使用者的許可權等各種引數。

#include

#include

#include

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

int open(const char *pathname,    int flags, 

mode_t mode); 

引數含義:引數:

pathname是要開啟或建立的檔案的名字

flags引數可用來說明此函式的多個選擇項

mode對於open函式而言,僅當建立新檔案時才使用第三個引數

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

出錯返回-1並設定errno

flags:以下可選項可以同時指定0個或多個, 和必選項按位或起來作為flags引數。

o_creat 若此檔案不存在則建立它。使用此選擇項時,需同時說明第三個引數mode,用其說明該新檔案的訪問許可權。

o_nonblock 如果pathname指的是乙個塊特殊檔案或乙個字元特殊檔案,則此選擇項為此檔案的本次開啟操作和後續的i / o操作設定非阻塞方式。

mode引數:以下三個常數中必須指定乙個,且僅允許指定乙個(這些常數定義在標頭檔案中)

o_rdonly   唯讀開啟

o_wronly   只寫開啟

o_rdwr     讀、寫開啟

系統呼叫:讀:int read(int fd, const void *buf, size_t   length)

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

系統呼叫:寫:int write(int fd, const void * buf,  size_t length)

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

系統呼叫:定位:int lseek(int fd, offset_t offset,  int whence)

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

標準庫函式:

不帶快取的i/o對是檔案描述符操作,帶快取的i/o是針對流的。

標準i/o庫就是帶快取的i/o,它由ansi c標準說明。當然,標準i/o最終都會呼叫上面的i/o例程。

標準i/o庫代替使用者處理很多細節,比如快取分配、以優化長度執行i/o等。

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

它提供了三種型別的快取:    1) 全快取。當填滿標準i/o快取後才執行i/o操作。磁碟上的檔案通常是全快取的。    2) 行快取。當輸入輸出遇到新行符或快取滿時,才由標準i/o庫執行實際i/o操作。stdin、stdout通常是行快取的。    3) 無快取。相當於read、write了。stderr通常是無快取的,因為它必須盡快輸出。

一般而言,由系統選擇快取的長度,並自動分配。標準i/o庫在關閉流的時候自動釋放快取。

在標準i/o庫中,乙個不足之處是需要複製的資料量。

當每次使用函式fgets和fputs時,通常需要複製兩次資料:

第一次是在核心和標準i/o快取之間(當呼叫read和write時),

第二次是在標準i/o快取(通常系統分配和管理)和使用者程式中的行快取(fgets的引數就需要乙個使用者行快取指標)之間。

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

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

mode:    開啟模式

Linux檔案 檔案IO概述

posix portable operating system inte ce,可移植作業系統介面規範 標準最初由ieee institute of electrical and electronics engineers,電氣和電子工程師協會,是目前最大的全球性非營利性專業技術學會 制定,目的是提...

linux檔案與檔案許可權

命令 功能引數 示例find 查詢檔案 name指定名稱 find name gunicorn在所有檔案中查詢名字為gunicorn的檔案 tail 檢視檔案末尾 n指定行數 f迴圈讀取 即實時監控檔案 tail n 10 f file.log mkdir 建立資料夾 p 遞迴建立 若已存在不會覆蓋...

Linux對Linux傳檔案

玩了這麼久的linux,居然沒有發現有這個功能!上傳檔案經過了測試,可行!如下 linux對linux傳檔案 上傳 scp wrong.php bha 187.136.5.1 這時會問你密碼,輸入密碼吧。說明 scp是指令 wrong.php是本地端的檔名 bha 187.136.5.1是遠端的使用...