linux C 文件相關函數

linux C 文件相關函數

打開文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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_CREATE 如果文件不存在則創建它,當選用此選項時,第三個參數mode需要同時設定
      O_EXCL 用於確保此次調用是創建文件,需要與O_CREATE同時調用,當文件已經存在會返回錯誤
      O_TRUNC 在打開文件的時候,將文件的長度截爲0,需要與O_RDWR或O_WRONLY一起使用,作爲新文件重新寫入
  • 參數mode只在創建文件時需要,用於指定所創建文件的權限位,同時受到umask環境變量的影響

  • 這個函數正常情況下會返回一個整型的文件描述符,在出錯時會返回-1。linux文件描述符策略永遠選擇最小可用的文件描述符

創建文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char* pathname,mode_t mode);
  • 等價於函數open(pathname,O_WRONLY | O_CREATE | O_TRUNC,mode)

關閉文件

#include <unistd.h>
int close(int fd);
  • close 用於關閉文件描述符

讀取文件

#include <unistd.h>
ssize_t read(int fd,void* buf,size_t count);
  • read嘗試從fd中讀取count個字節到buf中,並返回成功讀取的字節數,同時將文件偏移向前移動相同的字節數。
  • 讀取函數有錯誤發生時,返回值爲-1。
  • 如果在讀取前已經達到文件的末尾,返回0。
  • read有可能讀取比count小的字節數
    • 讀普通文件時,文件中剩餘的字節數不夠請求的字節數
    • 當從中斷設備讀取數據時,其默認長度不夠請求讀取的數據
    • 當從網絡讀取數據時,緩衝區大小可能小於讀取請求的數據大小

寫入文件

#include <unistd.h>
ssize_t write(int fd,const void* buf,size_t count);
  • write嘗試從buf指向的地址,寫入count個字節到文件描述符fd中,並返回成功寫入的字節數,同時將文件偏移向前移動相同的字節數
  • 寫入函數發生錯誤時,返回值爲-1
  • 寫操作的返回值與想寫入的的字節數會存在差異

文件偏移

  • 文件的讀寫操作都是從當前文件的偏移處開始的。這個文件的偏移量保存在文件表中,而每一個進程都有一個文件表。那麼當多個進程同時寫一個文件時,即使對write進行了鎖保護,在進行串行寫操作時,文件依然不可避免的被寫亂。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
  • 參數whence和offset結合使用,whence表示操作模式,offset時偏移的值,offset的值可以是負值

    • whence offset
      SEEK_SET 相對文件開始的值
      SEEK_CUR 相對文件當前位置的值
      SEEK_END 相對文件結尾的值
  • 函數lseek執行成功時返回文件的偏移量,可以用SEEK_CUR模式下偏移0的方式獲得當前的偏移量,由於沒有引起文件的副作用,可以用這種方式測試當前的設備是否支持lseek()函數

    off_t cur_pos=lseek(fd,0,SEEK_CUR);
  • lseek函數允許返回負的偏移量,發生錯誤時,返回-1

文件的元數據

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char* path,struct stat* buf);
int fstat(int fd,struct stat* buf);
int lstat(const char* path,struct stat* buf);
  • 這三個函數都可用於得到文件的基本信息,區別在於stat得到的路經path所指定的文件的基本信息,fstat得到文件描述符fd指定文件的基本信息,而lstat與stat則基本相同,只有當path是一個鏈接文件時,lstat得到的是鏈接文件自己本身信息而不是其指向文件的信息。

  • struct stat各成員含義

    屬性 解釋
    dev_t st_dev 文件所在磁盤的磁盤的ID號
    ino_t st_ino 節點編號
    mode_t st_mode 描述文件的類型和權限
    nlink_t st_nlink 硬鏈接的數量
    uid_t st_uid 文件屬於用戶的ID
    gid_t st_gid 文件所屬用戶組ID
    dev_t st_rdev 如果是設備文件則是設備ID號
    off_t st_size 文件大小
    blksize_t st_blksize 文件內容對應的塊的大小
    blkcnt_t st_blocks 文件內容對應得塊數量
    time_t st_atime 上次訪問時間,訪問文件的操作會改變該值
    time_t st_mtime 上次修改時間
    time_t st_ctime 上次狀態改變的時間,對文件的讀寫將改變該

文件截斷

#include <unistd.h>
#include <sys/types.h>
int truncate(const char* path,off_t length);
int ftruncate(int fd,off_t length);
  • truncate截斷的是路徑path指定的文件,ftruncate截斷的是fd引用的文件
  • 參數length可以大於文件本身的大小,此時文件長度將變爲length的大小,擴充的內容均被填充爲0
  • ftruncate雖然使用的是文件描述符,但不會更新當前文件的偏移量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章