linux_c 網絡開發日記(3)系統調用方式訪問文件

系統調用方式訪問文件

文件編程
linux文件編程可以使用兩種方法:
1、linux系統調用
2、c語言庫函數
前者依賴於linux系統,後者與操作系統是獨立的,在任何操作系統下,使用c語言庫函數操作文件的方法都是相同的。


系統調用——創建

int creat(const char *fileanme , mode_t mode)
filename:要創建的文件名(包含路徑,缺省爲當前路徑)
mode:創建模式(rwx)
常見創建模式:
S_IRUSER 可讀(4)
S_IWUSER 可寫(2)
S_IXUSER 可執行(1)
S_IRWXU 可讀、寫、執行
無任何權限爲0
argc:參數的個數
argv:參數的值保存在argv這個字符串數組裏

文件描述

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


系統調用-打開(兩種模式)

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


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


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

系統調用-關閉

當我們操作完文件以後,需要關閉文件:
int close(int fd)
fd:文件描述符,(系統分佈從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可取負值,表示向前移動。
例如:lseek(fd,-5,SEEK_CUR)表示可將文件指針相對當前位置向前移動5個字節。


系統調用-訪問判斷

有時候我們需要判斷文件是否可以進行哪種操作(rwx)這時候我們可以使用access函數:
iint access(const shar*pathname,int mode)
pathname:文件名
mode:要判斷訪問權限。可以取一下值或者是他們的組合。R_OK:文件可讀,W_OK:文件可寫,X_OK:文件可執行,F_OK文件存在。
返回值:當測試成功時返回0,否則一個條件不符時,返回-1.

下面我們將以一個程序的運行來具體說明如何應用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFER_SIZE 1024

/*
 * 程序入口
 * */
int main(int argc,char **argv)
{
    int from_fd, to_fd;
    long file_len=0;
    int ret=1;
    char buffer[BUFFER_SIZE];
    char *ptr;

    /*判斷入參*/
    if(argc!=3)
    {
        printf("Usage:%s fromfile tofile\n",argv[0]);
        exit(1);
    } 

    /*打開原文件*/
    if((from_fd=open(argv[1], O_RDONLY|O_CREAT))==-1) 
    { 
        printf("Open %s Error\n",argv[1]); 
        exit(1); 
    } 

    /*創建目標文件*/
    if((to_fd=open(argv[2], O_WRONLY|O_CREAT))==-1) 
    { 
        printf("Open %s Error\n",argv[2]); 
        exit(1); 
    } 

    /*測的文件大小*/
    file_len= lseek(from_fd,0L,SEEK_END);
    lseek(from_fd,0L,SEEK_SET);
    printf("form file size is %d\n",file_len);

    /*進行文件拷貝*/
    while(ret) 
    { 
        ret= read(from_fd, buffer, BUFFER_SIZE);
        if(ret==-1)
        {
            printf("read Error\n"); 
            exit(1);		
        }
        write(to_fd, buffer, ret);
        file_len-=ret;
        bzero(buffer,BUFFER_SIZE);
    } 
    printf("there are %d byte(s) data left without copy\n", file_len);
    close(from_fd); 
    close(to_fd); 
    exit(0); 
}


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