日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 文件操作 编程,Linux系统编程------------文件操作(基础)

發(fā)布時(shí)間:2025/4/16 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 文件操作 编程,Linux系统编程------------文件操作(基础) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.文件操作

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)啟動(dòng)時(shí)所需的文件

/dev ?: ? 設(shè)備文件(磁盤、光驅(qū))

/proc : ? proc虛擬文件系統(tǒng),可以查看和配置系統(tǒng)運(yùn)行狀況(/poc/meminfo ?/proc/cpuinfo)

/usr ? : ?存放系統(tǒng)應(yīng)用程序及相關(guān)文件(幫助文檔、說明文件)

/root ?: ?超級(jí)用戶root主目錄

/home: ?每個(gè)普通用戶在其下有對(duì)應(yīng)用戶名的主目錄

/etc ? ?: ?存放系統(tǒng)配置文件(/etc/passwd、/etc/shadow)

/var ? ?: ?存放文件系統(tǒng)中經(jīng)常變化的文件(日志文件、用戶文件)

/tmp ? ?: ?存放臨時(shí)文件的目錄

/lib ? ? ?: ? 存放庫文件

1.1.2 ?Linux的文件系統(tǒng)模型

Linux文件系統(tǒng)模型結(jié)構(gòu)圖:

1.對(duì)物理磁盤的訪問必須通過設(shè)備驅(qū)動(dòng)程序進(jìn)行.

2.存在兩種訪問設(shè)備驅(qū)動(dòng)的方式:

a.通過設(shè)備驅(qū)動(dòng)程序提供的接口----設(shè)備API

b.通過虛擬文件系統(tǒng)(VFS)提供給上層應(yīng)用程序的接口----文件API

3.虛擬文件系統(tǒng)(VFS)整合不同的文件系統(tǒng)(EXT2,EXT3,vfat..),為上層應(yīng)用程序提供統(tǒng)一的訪問接口

4.扇區(qū)是對(duì)物理磁盤訪問的最小單位(盤面、磁道、扇區(qū)),文件系統(tǒng)由塊組成,塊大小對(duì)應(yīng)扇區(qū)大小,取決于文件系統(tǒng)類型

1.1.3 ?Linux文件類型

Linux下有7種文件類型:

1.普通文件(-):包含某種形式的數(shù)據(jù),是文本還是二進(jìn)制由應(yīng)用決定

2. 目錄文件(d):

3. 字符特殊文件(c):系統(tǒng)中字符類型的設(shè)備(鼠標(biāo)、鍵盤等)

4. 塊特殊文件(b):系統(tǒng)中塊類型的設(shè)備(磁盤、光驅(qū)等)

5. FIFO:命名管道,用于進(jìn)程間通信

6. socket:套接字,用于網(wǎng)絡(luò)通信

7. 符號(hào)鏈接(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,則聲明該打開方式會(huì)對(duì)文件存在進(jìn)行檢查,若不存在創(chuàng)建,若存在報(bào)錯(cuò)返回

O_TRUNC:若文件存在則清空文件內(nèi)容(以可寫方式打開)

O_SYNC: ?以同步方式打開文件,任何對(duì)文件的修改都會(huì)阻塞直到物理磁盤上的數(shù)據(jù)同步以后打開

O_NDELAY或O_NONBLOCK:非阻塞操作打開文件 對(duì)于open以及后續(xù)對(duì)該文件的操作都會(huì)立即返回

O_DIRECTORY:打開目錄

O_NOFOLLOW:如果pathname是一個(gè)鏈接 ?打開出錯(cuò)

O_APPEND:寫入的數(shù)據(jù)會(huì)以追加的方式加入到文件后面

新創(chuàng)建的文件的存取權(quán)限是 mode&~umask

1.2.1.2 ?創(chuàng)建(creat)

int creat(const char* pathname,mode_t mode);

若文件存在則會(huì)被覆蓋

相當(dāng)于 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,讀取出錯(cuò);返回讀到的字節(jié)數(shù);將讀到的字節(jié)數(shù)與count比較*/

ssize_t write(int fd,const void* buf,size_t count);

1.2.3 ?文件讀寫指針的移動(dòng)

#include

#include

off_t lseek(int fd,off_t offset,int whence);

/*出錯(cuò)返回-1;否則返回當(dāng)前相對(duì)于文件開頭的文件讀寫指針偏移量*/

SEEK_END:偏移相對(duì)于文件末尾 此時(shí)offset為正 則將文件讀寫指針移至文件末尾后

SEEK_SET:設(shè)置相對(duì)于文件開頭的偏移量

SEEK_CUR:設(shè)置相對(duì)于當(dāng)前文件讀寫指針的偏移量

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(復(fù)制文件描述符)

#include

int dup(int oldfd);

int dup2(int oldfd,int newfd);

/*成功:返回最小的未被使用的文件描述符(dup) ?或者返回newfd*/

/*效果:新復(fù)制的文件描述符與原文件描述符指向同一個(gè)文件,共享所有的鎖定、

文件讀寫指針、各項(xiàng)權(quán)限、標(biāo)志位*/

1.2.4.2 fcntl函數(shù)(進(jìn)行各種控制操作以獲取或者設(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,進(jìn)行控制操作*/

cmd:

F_DUPFD(dup功能)

F_GETFD(獲取fd對(duì)應(yīng)的文件的close-on-exec標(biāo)識(shí))

如果返回值的最后一位為1,則close-on-exec為1,執(zhí)行exec將關(guān)閉該文件

F_SETFD(將fd對(duì)應(yīng)文件的close-on-exec標(biāo)識(shí)設(shè)置為arg最后一位)

F_GETFL(獲取fd對(duì)應(yīng)的文件的文件打開方式,與open的flag標(biāo)識(shí)相同)

[accmode&O_ACCMODE(3)獲得讀取打開方式,accmode&O_APPEND獲取O_APPEND標(biāo)識(shí)]

F_SETFL(設(shè)置已打開文件的打開方式,只能設(shè)置O_ASYNC O_APPEND O_NONBLOCK標(biāo)識(shí))

/*文件記錄鎖*/

F_SETLK(對(duì)文件特定區(qū)域加鎖,加鎖方式由lock指定)

F_SETLKW(對(duì)文件特定區(qū)域加鎖,加鎖方式由lock指定,等待)

F_GETLK(測(cè)試能否以lock指定方式對(duì)文件加鎖,若可,不執(zhí)行加鎖動(dòng)作,將lock->l_type置為F_UNLCK,返回;

否則返回一個(gè)不能加鎖的加鎖方式至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; ? ? ? ? ?/*鎖的屬主進(jìn)程*/

};

若l_len為0,表示鎖的區(qū)域從其起始區(qū)域直至最大可能位置為止.

鎖整個(gè)文件 l_whence SEEK_SET;l_start 0;l_len 0

Linux系統(tǒng)的文件記錄鎖是建議性鎖 非強(qiáng)制性鎖.

F_GETOWN:返回當(dāng)前接收SIGIO或者SIGURG的進(jìn)程ID或者進(jìn)程組ID(負(fù)數(shù)返回)

F_SETOWN:設(shè)置當(dāng)前接收SIGIO或者SIGURG的進(jìn)程ID或者進(jìn)程組ID(負(fù)數(shù)設(shè)置)

F_SETSIG:設(shè)置輸入輸出時(shí)發(fā)出的信號(hào)

F_GETSIG:返回輸入輸出時(shí)收到的信號(hào)

1.2.4.3 ?ioctl函數(shù)

#include

int ioctl(int fd,int request,...);

/*獲取或者設(shè)置設(shè)備文件的屬性,第三個(gè)參數(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對(duì)應(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;

};

文件類型測(cè)試宏,用于測(cè)試st_mode包含的文件信息:

S_ISLINK(st_mode):判斷是否為符號(hào)鏈接

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不會(huì)改變*/

/*只有超級(jí)用戶才能改變文件所有者,文件所有者只能將文件群組id改為其所屬用戶組中之一*/

/* chown 會(huì)清楚文件的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更新為當(dāng)前時(shí)間*/

1.3.2.5 umask設(shè)置文件創(chuàng)建屏蔽字

#include

#include

mode_t umask(mode_t mask);

/*返回舊的文件創(chuàng)建屏蔽字 與進(jìn)程相關(guān) mode&~mask*/

1.4 ? ?文件的移動(dòng)和刪除

1.4.1 ? 文件的移動(dòng)

rename系統(tǒng)調(diào)用修改文件名或者文件的位置

#include

int rename(const char* oldpath,const char* newpath);

/*若newpath存在 則會(huì)被刪除*/

1.4.2 ? 文件的刪除

unlink刪除文件 remove則既可刪除文件、亦可刪除空目錄(unlink實(shí)際上是減少對(duì)文件的一個(gè)鏈接數(shù))

#include

int unlink(const char* pathname);

int remove(const char* pathname);

/*對(duì)文件的鏈接數(shù)為0并且沒有進(jìn)程打開該文件 才能刪除文件并釋放其磁盤空間*/

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 ? ?獲取當(dāng)前目錄

#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);/*將進(jìn)程當(dāng)前工作目錄改為由fd指定的目錄*/

1.5.4 ? ?獲取目錄信息

/*打開目錄,獲取DIR* 目錄流*/

#include

#include

DIR* opendir(const char* name);/*錯(cuò)誤返回NULL,設(shè)置errno*/

/*讀取目錄*/

struct dirent* readdir(DIR* dir);

/*從dir所指向的目錄中讀取出目錄項(xiàng)信息,返回一個(gè)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目錄文件開頭至此文件進(jìn)入點(diǎn)的位移

/*關(guān)閉目錄*/

int closedir(DIR* dir);

總結(jié)

以上是生活随笔為你收集整理的linux 文件操作 编程,Linux系统编程------------文件操作(基础)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。