linux文件編程(1)

linux中文件編程可以使用兩種方法:1.Linux系統調用     2.C語言庫函數。系統調用是基於linux系統的,它不能跨系統使用。c語言庫函數在各個系統都能使用。下面先介紹基於系統調用的文件編程。

1.文件的創建.

int creat(const char *filename,mode_t mode)
filename:要創建的文件名(包含路徑,缺省爲當前路徑)
mode:創建模式

常見創建模式:
S_IRUSR 可讀
S_IWUSR 可寫
S_IXUSR 可執行
S_IRWXU可讀、寫、執行

這幾個模式怎麼記憶呢?可以按照它的英文全稱記憶。如S_IRUSR: Set ID Read ,這是設置用戶的操作模式,後面再加一個USR。l

除了可以使用上述宏以外,還可以直接使用數字來表示文件的訪問權限:
可執行 -> 1
可寫 -> 2
可讀 -> 4

上述值的和,如可寫可讀 -> 6
無任何權限 -> 0

各自權限分別對應了二進制的不同位數。由左到右(高位到低位)對應的順序爲  讀--寫--執行,我們可以把它理解爲修改一個程序代碼的過程記憶,即先閱讀代碼(讀),改代碼(寫),運行代碼(執行)。

實例代碼:

#include <stdio.h> 
#include <stdlib.h> 

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void  create_file(char *filename){ 
	
    if(creat(filename,0755)<0){ 
        printf("create file %s failure!\n",filename); 
        exit(EXIT_FAILURE); 
    }else{ 
        printf("create file %s success!\n",filename); 
    } 
} 

int main(int argc,char *argv[]){ 
    int i; 
    if(argc<2){ 
        perror("you haven't input the filename,please try again!\n"); 
        exit(EXIT_FAILURE); 
    } 

    for(i=1;i<argc;i++){ 
        create_file(argv[i]);    
    } 

    exit(EXIT_SUCCESS); 
}

在Linux系統中,所有打開的文件都對應一個文件描述符。文件描述符的本質是一個非負整數。當打開一個文件時,該整數由系統來分配。文件描述符的範圍是0 ~OPEN_MAX 。早期的UNIX版本OPEN_MAX =19,即允許每個進程同時打開20個文件,現在很多系統則將其增加至1024。

2.文件打開

int open(const char *pathname, int flags)
int open(const char *pathname, int flags,mode_t mode)
pathname:要打開的文件名(包含路徑,缺省爲當前路徑)
flags:打開標誌

常見的打開標誌:
O_RDONLY 只讀方式打開
O_WRONLY 只寫方式打開
O_RDWR 讀寫方式打開
O_APPEND 追加方式打開
O_CREAT 創建一個文件
O_NOBLOCK 非阻塞方式打開

如果使用了O_CREATE標誌,則使用的函數是:
int open(const char *pathname,int flags,mode_t mode);
這時需要指定mode來表示文件的訪問權限。

當我們操作完文件以後,需要關閉文
件:
int close(int fd)

fd爲文件描述符,來自與creat或者open函數的返回值。

系統調用-讀
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個字節。操作成功時,返回文件指針相對於文件頭的位置。

whence可使用下述值:
SEEK_SET:相對文件開頭
SEEK_CUR:相對文件讀寫指針的當前位置
SEEK_END:相對文件末尾
offset可取負值,表示向前移動。例如下述調用
可將文件指針相對當前位置向前移動5個字節:
lseek(fd, -5, SEEK_CUR)

由於lseek函數的返回值爲文件指針相對於文件頭的位置,因此下面調用的返回值就是文件的長度:
lseek(fd, 0, SEEK_END)

有時我們需要判斷文件是否可以進行某種操作(讀,寫等),這時可以使用access函數:
int access(const char*pathname,int mode)
pathname:文件名稱
mode:要判斷的訪問權限。可以取以下值或者是他們的組合。

R_OK:文件可讀,W_OK:文件可寫,
X_OK:文件可執行,F_OK文件存在。
返回值:當我們測試成功時,函數返回0,否則如果一個條件不符時,返回-1。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章