Linux下的檔案操作總結

2021-05-05 03:34:29 字數 4441 閱讀 4151

"in linux, everything is a file."    ---  <>

3個主要的檔案描述符:

0: 標準輸入

1: 標準輸出

2: 標準錯誤

基本檔案操作

write:

函式宣告:ssize_t write(int fildes, const void *buf, size_t nbytes);

函式功能:把從buf開始的nbytes個位元組寫入描述符為fildes所關聯的檔案中。

返回值:   返回實際寫入的位元組數。返回值可能小於nbytes。如果返回0則

沒有資料寫入;如果返回-1則表示有錯誤發生。

read:

函式宣告:ssize_t read(int fildes, void *buf, size_t nbytes);

函式功能:把描述符為fildes所關聯的檔案中的nbytes個位元組寫入buf中。

返回值:   返回實際讀入的位元組數,可能小於nbytes。如果返回0則表示

沒有資料讀入;如果返回-1則表示有錯誤發生。

open:

函式宣告:int close(int fildes);

函式功能:關閉檔案描述符。

返回值:   0表示成功,-1表示失敗。

ioctl:

函式宣告:int ioctl(int fildes, int cmd, ...);

函式功能:向裝置寫入控制資訊。

返回值:  -1表示出錯。

例子:lseek:

函式宣告:off_t lseek(int fildes, off_t offset, int whence);

函式功能:對檔案描述符fildes設定讀寫位置。offset設定讀寫位置,

whence設定offset如何用。whence可以為如下值:

seek_set   offset為絕對位置(檔案開始的相對位置)

seek_cur   offset為當前位置的相對位置

seek_end   offset為檔案結尾的相對位置

返回值:   檔案指標相對於檔案開始的位置。

fstat, stat, and lstat:

函式宣告:int fstat(int fildes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

函式功能:fstat返回檔案描述符fildes所關聯檔案的資訊;stat、lstat

返回已命名檔案的資訊;如果是符號鏈結,lstat返回符號

鏈結本身的資訊,而stat則返回符號鏈結所引用檔案的資訊。

所返回的檔案資訊儲存在結構體指標buf所指向的空間中。

關於結構體stat的資訊請參閱man 2 stat。

返回值:  如果成功則返回0,否則返回-1。

dup and dup2:

函式宣告:int dup(int fildes);

int dup2(int fildes, int fildes2);

函式功能:返回不同的檔案描述符訪問同乙個檔案。dup返回fildes

所關聯檔案的乙個新檔案描述符;dup2建立fildes的乙個

副本。它們通常用於讀寫同乙個檔案的不同位置,也用於

多個程序通過管道進行通訊。

返回值:   如果出錯則返回-1。

標準i/o庫

參見c語言教程。

檔案流和檔案描述符

每乙個檔案流都和底層的乙個檔案描述符相關聯,你能混合使用它們。

int fileno(file *stream);

file *fdopen(int fildes, const char *mode);

fileno返回檔案檔案流stream的檔案描述符,如果出錯則返回-1;

fdopen為檔案描述符fildes建立檔案流。fildes必須為已開啟的。

fdopen和fopen除了第乙個引數不一樣,其他都一樣。

檔案和目錄的維護

改變許可權:int chmod(const char *path, mode_t mode);

改變所有者:int chown(const char *path, uid_t owner, gid_t group);

unlink, link, and symlink:

函式宣告:int unlink(const char *path);

int link(const char *path1, const char *path2);

int symlink(const char *path1, const char *path2);

函式功能:unlink刪除目錄下的檔案,如果是硬鏈結則還將鏈結數減1.

link建立path2,path2為path1的硬鏈結。

symlink建立path2,path2為path1的軟鏈結。

返回值:   成功返回0,失敗返回-1。

mkdir and rmdir:

函式宣告:int mkdir(const char *path, mode_t mode);

int rmdir(const char *path);

函式功能:mkdir建立許可權為mode的目錄。

rmdir刪除目錄,只有當path為空目錄時才能刪除。

返回值:   成功返回0,失敗返回-1。

chdir and getcwd:

函式宣告:int chdir(const char *path);

char *getcwd(char *buf, size_t size);

函式功能:chdir改變程式執行的的當前目錄。

把程式執行的當前目錄寫入buf,目錄名的長度不能超過size。

返回值:   成功返回0,失敗返回-1。

掃瞄目錄

用dir結構對目錄操作,dir*稱為目錄流(如同file*稱為檔案流一樣)

opendir

函式宣告:dir *opendir(const char *name);

函式功能:opendir開啟乙個目錄。

返回值:   成功則返回乙個dir結構的指標,失敗返回null。

readir

函式宣告:struct dirent *readdir(dir *dirp);

函式功能:在dirp中返回下乙個目錄入口。

返回值:   目錄入口資訊(man dirent)。如果出錯或到達目錄結尾,

則返回null。

telldir

函式宣告:long telldir(dir *dirp);

函式功能:返回目錄流dirp中的當前位置。

返回值:  

seekdir

函式宣告:void seekdir(dir *dirp, long loc);

函式功能:設定dirp中的目錄入口指標,loc表示指標的位置。

返回值:   無

closedir

函式宣告:int closedir(dir *dirp);

函式功能:關閉目錄流。

返回值:   成功返回0,失敗返回-1。

例子:高階話題

記憶體對映函式(mmap)設定一段記憶體空間,這段空間可以被多個程式讀寫。

mmap也可以用來操作檔案,它可以使檔案的整個內容看起來像記憶體中的陣列一樣。

函式宣告:void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);

函式功能:(man mmap)fildes為檔案描述符;off指定對映的檔案的起始位置;len指定要

對映的長度(也就是記憶體段的長度);prot指定這段記憶體的

訪問許可權,prot可為以下值(可以用or連線):

prot_read   可讀

prot_write  可寫

prot_exec   可執行

prot_none   該記憶體段不能訪問

flags設定這段記憶體的控制資訊,map_private為私有的,map_shared為共享的。

map_shared可以使對這段記憶體的修改反映到檔案中。addr指定這段記憶體空間的

起始位址,如果為0則由系統自動分配(推薦)。

返回值:   如果成功則返回這段記憶體空間的其實位址,失敗返回map_failed。

linux下的檔案操作

徹底刪除檔案 rm rf 檔案目錄 可相對可絕對 是徹底刪除而且linux無 站 建立檔案 touch 檔名 建立資料夾 mkdir 資料夾名 檔案提權 chmod 777 filename 記錄在linux下寫乙個python檔案的過程 1.vim filename py 沒有檔案會自行建立,有就...

linux檔案操作總結

分類 linux 2014 07 31 20 02 13人閱讀收藏 舉報 linux 系統呼叫 標準io庫 檔案操作總結 一 系統呼叫 open open a file or device read read from an open file or device write write to a ...

總結之linux下的操作

在ubuntu下訪問windows的資源。1 unbuntu上連線上網路 2 在windows上共享乙個資料夾,然後在ubuntu上掛載。搜了一下,通過mount來訪問的windows共享目錄下的c 的時候,容易出現這個問題,後面加nounix,noserverino就搞定 mount home c...