在linux下可以通過相應的檔案i/o函式來完成對檔案的操作,這些函式通常被稱為不帶緩衝的i/o,因為這些函式對檔案的讀寫都是呼叫linux核心的系統呼叫來實現的。基本的函式包括:open read write lseek(設定檔案指標) close等
呼叫格式:
#include#include#includeint open( const char * pathname, intflags);
int open( const char * pathname, int flags,mode_t mode);
如果檔案不存在,則先建立該檔案,然後開啟。如果操作成功則返回該檔案的檔案描述符,操作失敗則返回-1。其中,引數pathname 指向欲開啟的檔案路徑字串;flags用於指定檔案的開啟方式;mode表示檔案的許可權屬性。
關閉檔案時會產生一定的影響:
開啟乙個檔案時,該檔案描述中的引用計數器值加1,而關閉乙個檔案會使得該檔案描述中的引用計數器值減1,當引用計數器值減為0的時候,系統呼叫close函式不僅將釋放該檔案的描述符,而且也將釋放該檔案所占用的描述表項。此外,關閉乙個檔案時也釋放該程序加在該檔案上的所有記錄鎖。
呼叫格式
#include#include#includeint creat(const char * pathname,mode_tmode);
利用命令列引數的第二個引數作為pathname引數來建立檔案
//建立檔案,檔名由argv的第二個引數給出
檔案偏移量就是檔案指標,是乙個非負整數,以度量從檔案開始處計算的位元組數。
#include#includeoff_t lseek(int fildes,off_t offset ,int whence);
例子
#include#includeint main(int argc,char *argv)
fileid=open(*(argv+1),o_rdwr|o_creat|s_irwxu);
temp=write(fileid,buf,sizeof(buf));//寫入資料
seektemp=lseek(fileid,0,seek_cur);//獲得當前的偏移量
read()會把引數fd 所指的檔案傳送count個位元組到buf指標所指的記憶體中。若引數count為0, 則read()不會有作用並返回0。返回值為實際讀取到的位元組數, 如果返回0, 表示已到達檔案尾或是無可讀取的資料, 此外檔案讀寫位置會隨讀取到的位元組移動。
#include#include#include#define perms 0666
#define dummy 0
int main(int argc,char *argv)
if((sourcefileid=open(*(argv+1),o_rdonly,dummy))==-1)
if((targetfileid=open(*(argv+2),o_wronly|o_creat,perms))==-1)
while((readnum=read(sourcefileid,buf,1024))>0)
if((write(targetfileid,buf,readnum))!=readnum)//寫入的資料和讀出的資料不同
上述三個函式用於獲取檔案的屬性結構體,成功返回0,失敗返回-1.如果目標檔案是乙個符號鏈結的時候,lstat返回的是符號鏈結有關的資訊,而stat返回的是符號鏈結所引用的檔案資訊。注:linux下符號鏈結和符號鏈結對應的檔案可以理解成windows下的快捷方式和快捷方式對應的檔案。
utime()用來修改引數filename檔案所屬的inode訪問時間。
在linux系統中,每個檔案都有三個對應的時間資訊,分別對應stat結構體中的3個字段。
unsigned longst_atime;
unsigned longst_mtime;
unsigned longst_ctime;
分別表示檔案最後訪問時間、檔案的最後修改時間、檔案索引結點(inode)的最後修改時間,對應的操作函式分別為read、write、chmod。
結構utimbuf定義如下
struct utimbuf{
time_t actime;
time_t modtime;
如果引數buf為空指標(null), 則該檔案的訪問時間和更改時間全部會設為目前時間。
執行成功則返回0, 失敗返回-1, 錯誤**存於errno
#include#include#includeint main(int argc,char *argv)
{ int i,fd;
struct stat statbuf;
struct utimbuf timebuf;
for(i=1;i利用access函式可以測試檔案的訪問許可權,umask函式檔案建立遮蔽字,chmod和fchmod函式可以修改檔案的許可權。
#include
#include
int chmod(const char * path,mode_t mode);
此外,rename函式可以對檔案重新命名,int rename(const char * oldpath,const char * newpath);
dup和dup2函式可以複製檔案的描述符,fcntl函式可以進一步管理低階檔案描述符,修改開啟檔案的性質、複製檔案描述符、操作檔案鎖等。還有目錄檔案操作函式,mkdir、rmdir、chdir、fchdir和getcwd函式、opendir、closedir、readdir函式等
Linux檔案程式設計
linux中檔案程式設計可以使用兩種方法 1.linux系統呼叫 2.c語言庫函式。系統呼叫是基於linux系統的,它不能跨系統使用。c語言庫函式在各個系統都能使用。a.下面先介紹基於系統呼叫的檔案程式設計 1.檔案的建立.int creat const char filename,mode t m...
Linux檔案程式設計
所謂系統呼叫是指作業系統提供給使用者的一組 特殊 介面,使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的的服務 由於在linux中,為了更好地保護核心空間,將程式的執行空間分為核心空間和使用者空間 也就是常稱的核心態和使用者態 它們分別執行在不同的級別上,在邏輯上是相互隔離的。因此,使用者...
Linux檔案程式設計
一 linux系統呼叫及使用者程式設計介面 1 所謂系統呼叫是指作業系統提供給使用者的一組 特殊 介面,使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的的服務 2 linux一點哲學,一切皆為檔案 在linux中對目錄和裝置的操作都等同於對檔案的操作,都是使用檔案描述符來進行的。linux...