linux 文件操作 编程,Linux系统编程------------文件操作(基础)
一.文件操作
1.1 Linux文件系統(tǒng)結(jié)構(gòu)
1.1.1 ?Linux常見系統(tǒng)目錄
/bin??: ?存放普通系統(tǒng)可執(zhí)行的命令(ls wc等)
/sbin ?: ?存放系統(tǒng)管理程序(fsck等)
/boot : ? 存放內(nèi)核和系統(tǒng)啟動時所需的文件
/dev ?: ? 設(shè)備文件(磁盤、光驅(qū))
/proc : ? proc虛擬文件系統(tǒng),可以查看和配置系統(tǒng)運行狀況(/poc/meminfo ?/proc/cpuinfo)
/usr ? : ?存放系統(tǒng)應(yīng)用程序及相關(guān)文件(幫助文檔、說明文件)
/root ?: ?超級用戶root主目錄
/home: ?每個普通用戶在其下有對應(yīng)用戶名的主目錄
/etc ? ?: ?存放系統(tǒng)配置文件(/etc/passwd、/etc/shadow)
/var ? ?: ?存放文件系統(tǒng)中經(jīng)常變化的文件(日志文件、用戶文件)
/tmp ? ?: ?存放臨時文件的目錄
/lib ? ? ?: ? 存放庫文件
1.1.2 ?Linux的文件系統(tǒng)模型
Linux文件系統(tǒng)模型結(jié)構(gòu)圖:
1.對物理磁盤的訪問必須通過設(shè)備驅(qū)動程序進行.
2.存在兩種訪問設(shè)備驅(qū)動的方式:
a.通過設(shè)備驅(qū)動程序提供的接口----設(shè)備API
b.通過虛擬文件系統(tǒng)(VFS)提供給上層應(yīng)用程序的接口----文件API
3.虛擬文件系統(tǒng)(VFS)整合不同的文件系統(tǒng)(EXT2,EXT3,vfat..),為上層應(yīng)用程序提供統(tǒng)一的訪問接口
4.扇區(qū)是對物理磁盤訪問的最小單位(盤面、磁道、扇區(qū)),文件系統(tǒng)由塊組成,塊大小對應(yīng)扇區(qū)大小,取決于文件系統(tǒng)類型
1.1.3 ?Linux文件類型
Linux下有7種文件類型:
1.普通文件(-):包含某種形式的數(shù)據(jù),是文本還是二進制由應(yīng)用決定
2. 目錄文件(d):
3. 字符特殊文件(c):系統(tǒng)中字符類型的設(shè)備(鼠標、鍵盤等)
4. 塊特殊文件(b):系統(tǒng)中塊類型的設(shè)備(磁盤、光驅(qū)等)
5. FIFO:命名管道,用于進程間通信
6. socket:套接字,用于網(wǎng)絡(luò)通信
7. 符號鏈接(symbolic link):另一文件的引用
1.1.4 ?文件訪問權(quán)限控制
mode_t: 32位位碼 ?0-7:設(shè)置權(quán)限位 ?8-15:所有者權(quán)限 ?16-23:組權(quán)限 ?24-31:其他用戶權(quán)限
r-4 w-2 x-1
chmod系統(tǒng)調(diào)用(改變文件權(quán)限):
#include
#include
int chmod(const char* path,mode_t mode);
int fchmod(int filedes,mode_t mode)
mode是以下權(quán)限位的組合: S_IRUSR S_IWUSR S_IXUSR ... ?S_IRGRP.... S_IROTH...S_ISUID S_ISGID S_ISVTX
1.2 ?文件的輸入輸出
1.2.1 ?文件的創(chuàng)建、打開與關(guān)閉
1.2.1.1 創(chuàng)建open
#include
#include
#include
int open(const char* pathname,int flag,mode_t mode);
int open(const char* pathname,int flag);
flag 指定文件打開方式(O_RDONLY O_WRONLY O_RDWR)
O_CREAT:若文件不存在則創(chuàng)建文件
O_EXCL: ?若指定了O_CREAT,則聲明該打開方式會對文件存在進行檢查,若不存在創(chuàng)建,若存在報錯返回
O_TRUNC:若文件存在則清空文件內(nèi)容(以可寫方式打開)
O_SYNC: ?以同步方式打開文件,任何對文件的修改都會阻塞直到物理磁盤上的數(shù)據(jù)同步以后打開
O_NDELAY或O_NONBLOCK:非阻塞操作打開文件 對于open以及后續(xù)對該文件的操作都會立即返回
O_DIRECTORY:打開目錄
O_NOFOLLOW:如果pathname是一個鏈接 ?打開出錯
O_APPEND:寫入的數(shù)據(jù)會以追加的方式加入到文件后面
新創(chuàng)建的文件的存取權(quán)限是 mode&~umask
1.2.1.2 ?創(chuàng)建(creat)
int creat(const char* pathname,mode_t mode);
若文件存在則會被覆蓋
相當于 open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);
1.2.1.3 ? ?關(guān)閉
#include
int close(int fd);
1.2.2 ?文件讀寫
#include
ssize_t read(int fd,void* buf,size_t count);
/*返回0,表示到文件末尾;-1,讀取出錯;返回讀到的字節(jié)數(shù);將讀到的字節(jié)數(shù)與count比較*/
ssize_t write(int fd,const void* buf,size_t count);
1.2.3 ?文件讀寫指針的移動
#include
#include
off_t lseek(int fd,off_t offset,int whence);
/*出錯返回-1;否則返回當前相對于文件開頭的文件讀寫指針偏移量*/
SEEK_END:偏移相對于文件末尾 此時offset為正 則將文件讀寫指針移至文件末尾后
SEEK_SET:設(shè)置相對于文件開頭的偏移量
SEEK_CUR:設(shè)置相對于當前文件讀寫指針的偏移量
lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_CUR);
lseek(fd,0,SEEK_SET);
1.2.4 ? dup,dup2,fcntl,iocel系統(tǒng)調(diào)用
1.2.4.1 dup和dup2(復制文件描述符)
#include
int dup(int oldfd);
int dup2(int oldfd,int newfd);
/*成功:返回最小的未被使用的文件描述符(dup) ?或者返回newfd*/
/*效果:新復制的文件描述符與原文件描述符指向同一個文件,共享所有的鎖定、
文件讀寫指針、各項權(quán)限、標志位*/
1.2.4.2 fcntl函數(shù)(進行各種控制操作以獲取或者設(shè)置已打開文件的屬性)
#include
#include
#include
int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock* lock);
/*根據(jù)cmd,進行控制操作*/
cmd:
F_DUPFD(dup功能)
F_GETFD(獲取fd對應(yīng)的文件的close-on-exec標識)
如果返回值的最后一位為1,則close-on-exec為1,執(zhí)行exec將關(guān)閉該文件
F_SETFD(將fd對應(yīng)文件的close-on-exec標識設(shè)置為arg最后一位)
F_GETFL(獲取fd對應(yīng)的文件的文件打開方式,與open的flag標識相同)
[accmode&O_ACCMODE(3)獲得讀取打開方式,accmode&O_APPEND獲取O_APPEND標識]
F_SETFL(設(shè)置已打開文件的打開方式,只能設(shè)置O_ASYNC O_APPEND O_NONBLOCK標識)
/*文件記錄鎖*/
F_SETLK(對文件特定區(qū)域加鎖,加鎖方式由lock指定)
F_SETLKW(對文件特定區(qū)域加鎖,加鎖方式由lock指定,等待)
F_GETLK(測試能否以lock指定方式對文件加鎖,若可,不執(zhí)行加鎖動作,將lock->l_type置為F_UNLCK,返回;
否則返回一個不能加鎖的加鎖方式至lock所指結(jié)構(gòu))
struct flock
{
short l_type; ? ? ? ? /*鎖類型 F_RDLCK F_WRLCK*/
short l_whence; ? /* SEEK_SET SEEK_END SEEK_CUR*/
off_t ? l_start; ? ? ?/*鎖起始位置*/
off_t ? l_len; ? ? ? ?/*被鎖記錄字節(jié)數(shù)*/
pid_t ?pid; ? ? ? ? ?/*鎖的屬主進程*/
};
若l_len為0,表示鎖的區(qū)域從其起始區(qū)域直至最大可能位置為止.
鎖整個文件 l_whence SEEK_SET;l_start 0;l_len 0
Linux系統(tǒng)的文件記錄鎖是建議性鎖 非強制性鎖.
F_GETOWN:返回當前接收SIGIO或者SIGURG的進程ID或者進程組ID(負數(shù)返回)
F_SETOWN:設(shè)置當前接收SIGIO或者SIGURG的進程ID或者進程組ID(負數(shù)設(shè)置)
F_SETSIG:設(shè)置輸入輸出時發(fā)出的信號
F_GETSIG:返回輸入輸出時收到的信號
1.2.4.3 ?ioctl函數(shù)
#include
int ioctl(int fd,int request,...);
/*獲取或者設(shè)置設(shè)備文件的屬性,第三個參數(shù)一般是char* argp,根據(jù)request不同來決定是get還是set*/
從socket總獲取網(wǎng)卡的硬件地址
1.3 ? 文件屬性操作
ls -l 文件輸出結(jié)果解析:
1.3.1 ? 獲取文件屬性
#include
#include
#include
int stat(const char* file_name,struct stat* buf);
int fstat(int fd,struct stat* buf);
int lstat(const char* file_name,struct stat* buf);
/*將file_name或者fd對應(yīng)文件的文件屬性填充入buf所指結(jié)構(gòu)*/
struct stat
{
dev_t st_dev;
ino_t ?st_ino;
mode_t st_mode;
nlink_t ? ?st_nlink;
uid_t ? ? ?st_uid;
gid_t ? ? ?st_gid;
dev_t ? ? st_rdev;
off_t ? ? ? st_size;
blksize_t ?st_blksize;
blkcnt_t ? st_blocks;
time_t ? ?st_atime;
time_t ? ?st_mtime;
time_t ? ?st_ctime;
};
文件類型測試宏,用于測試st_mode包含的文件信息:
S_ISLINK(st_mode):判斷是否為符號鏈接
S_ISREG:是否為普通文件
S_ISDIR ? S_ISCHR ?S_ISBLK ?S_ISFIFO ?S_ISSOCK
1.3.2 ? 設(shè)置文件屬性
1.3.2.1 ?改變文件訪問權(quán)限
1.3.2.2 ?修改文件的用戶id和群組id(chown fchown lchown)
#include
#include
int chown(const char* path,uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
int lchown(const char* path,uid_t owner,gid_t group);
/*若owne或者group之一為-1,那么文件的用戶id和群組id不會改變*/
/*只有超級用戶才能改變文件所有者,文件所有者只能將文件群組id改為其所屬用戶組中之一*/
/* chown 會清楚文件的set-uid和set-gid位*/
1.3.2.3 ? truncate/funcate改變文件的大小
#include
#include
int truncate(const char* path,off_t length);
int ftruncate(int fd,off_t length);
/*截短或者'\0'填充*/
1.3.2.4 ?utime更新文件的st_mtime和st_atime
#include
#include
int utime(const char* filename,struct utimbuf* buf);
struct utime
{
time_t actime; /*access time*/
time_t modtime; /*modification time*/
};
#include
int utimes(char* filename,struct timeval* tvp);
/*如果buf或者tvp為NULL,則將st_atime和st_mtime更新為當前時間*/
1.3.2.5 umask設(shè)置文件創(chuàng)建屏蔽字
#include
#include
mode_t umask(mode_t mask);
/*返回舊的文件創(chuàng)建屏蔽字 與進程相關(guān) mode&~mask*/
1.4 ? ?文件的移動和刪除
1.4.1 ? 文件的移動
rename系統(tǒng)調(diào)用修改文件名或者文件的位置
#include
int rename(const char* oldpath,const char* newpath);
/*若newpath存在 則會被刪除*/
1.4.2 ? 文件的刪除
unlink刪除文件 remove則既可刪除文件、亦可刪除空目錄(unlink實際上是減少對文件的一個鏈接數(shù))
#include
int unlink(const char* pathname);
int remove(const char* pathname);
/*對文件的鏈接數(shù)為0并且沒有進程打開該文件 才能刪除文件并釋放其磁盤空間*/
1.5 ? 目錄操作
1.5.1 ? ?創(chuàng)建、刪除目錄
#include
#include
#include
int mkdir(const char* pathname,mode_t mode);
int rmdir(const char* pathname);/*只能刪除由pathname指定的空目錄*/
1.5.2 ? ?獲取當前目錄
#include
char* getcwd(char* buf,size_t size);
char* get_current_working_directory(void);
char* getwd(char* buf);
1.5.3 ? ?設(shè)置工作目錄
int chdir(const char* path);
int fchdir(int fd);/*將進程當前工作目錄改為由fd指定的目錄*/
1.5.4 ? ?獲取目錄信息
/*打開目錄,獲取DIR* 目錄流*/
#include
#include
DIR* opendir(const char* name);/*錯誤返回NULL,設(shè)置errno*/
/*讀取目錄*/
struct dirent* readdir(DIR* dir);
/*從dir所指向的目錄中讀取出目錄項信息,返回一個struct dirent結(jié)構(gòu)的指針*/
struct dirent
{
ino_t d_no; ? ?/* inode number*/
off_t d_off; ? /*offset to this dirent*/
unsigned short d_reclen; ?/*length of this d_name*/
char d_name[NAME_MAX+1]'; /*file-name(null-terminated)*/
};
d_off目錄文件開頭至此文件進入點的位移
/*關(guān)閉目錄*/
int closedir(DIR* dir);
總結(jié)
以上是生活随笔為你收集整理的linux 文件操作 编程,Linux系统编程------------文件操作(基础)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php获取循环,PHP循环获取GET和P
- 下一篇: linux 连接文件,Linux 链接文