這一周以來一直與linux的檔案操作相關系統呼叫打交道,其與c語言中的檔案操作函式有些許相似但又千差萬別.尤其是open()函式的引數,相當複雜,因此作以記錄便於查閱.
對於用linux系統呼叫進行檔案的常用操作作以總結
主要是關於open()系統呼叫的各個引數做記錄.
簡述:open是unix系統(包括linux、mac等)的系統呼叫函式,區別於c語言庫函式fopen。
#include
int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_tmode);
返回值:成功則返回檔案描述符,否則返回-1
對於open函式來說,第三個引數僅當建立新檔案時(即 使用了o_creat 時)才使用,用於指定檔案的訪問許可權位(access permission bits)。pathname 是待開啟/建立檔案的posix路徑名(如/home/user/a.cpp);flags 用於指定檔案的開啟/建立模式,這個引數可由以下常量(定義於fcntl.h)通過邏輯位或邏輯構成。
o_rdonly唯讀模式
o_wronly只寫模式
o_rdwr讀寫模式
開啟/建立檔案時,至少得使用上述三個常量中的乙個。以下常量是選用的:
o_creat如果指定檔案不存在,則建立這個檔案
o_excl如果要建立的檔案已存在,則返回-1,並且修改errno的值
o_trunc如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容(即將其長度截短為0)
o_noctty如果路徑名指向終端裝置,不要把這個裝置用作控制終端。
o_nonblock如果路徑名指向fifo/塊檔案/字元檔案,則把檔案的開啟和後繼i/o
設定為非阻塞模式
(nonblockingmode)
以下三個常量同樣是選用的,它們用於同步輸入輸出
o_dsync等待物理i/o結束後再write。在不影響讀取新寫入的資料的前提下,不等待檔案屬性更新。
o_rsyncread等待所有寫入同一區域的寫操作完成後再進行
o_sync等待物理i/o結束後再write,包括更新檔案屬性的i/o
以下是簡單的乙個建立/開啟並寫入和讀取檔案的例子
#include
#include
#include
#include
#include
/* *以上兩個標頭檔案包含了open(),close()等
*函式的宣告,以及相關的一些巨集
*/#include
void my_err(const
char *err_string , int line)
int my_read(int fd)
if((len=lseek(fd,0,seek_cur)) == -1)
if(lseek(fd,0,seek_set) == -1)
printf("檔案長度: %d\n",len);
if((ret=read(fd,read_buf,sizeof(read_buf))) == -1)
for(int i=0;iprintf("%c",read_buf[i]);
}printf("\n");
return ret;
}int main()else
if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf))
my_read(fd);
}
Linux C 檔案操作
系統呼叫比標準庫移植性差 不同os介面不一定一致 系統呼叫會進入核心態,對程式執行的開銷較大.預設檔案描述符 0 標準輸入 1 標準輸出 2 標準錯誤輸出 include include include include include define maxline 80 void if error ...
Linux C 檔案操作
linux 檔案操作 1 linux檔案操作 1.1 系統呼叫 系統呼叫發生核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫來進行檔案操作,會有使用者空間到核心空間的開銷。但通過系統呼叫來訪問檔案是最直接的方式,系統呼叫函式直接作用於作業系統核心的裝置驅動程式從而實現檔案訪問。檔案描述符f...
linux c檔案相關操作
1,操作檔案,需要檔案控制代碼 標頭檔案 include 若用fgets函式讀取檔案內容,需要注意fgets函式的使用。函式宣告 char fgets char str,int n,file stream 引數 str 這是指向乙個字元陣列的指標,該陣列儲存了要讀取的字串。n 這是要讀取的最大字元數...