linux檔案基本操作(2)

2021-07-03 22:50:54 字數 3436 閱讀 8469

8.dup, dup2, fcntl,ioctl 系統呼叫

1)dup和dup2   函式原型:

#include

int dup(int oldfd); 

int dup2(int oldfd , int newfd);

dup用來賦值引數oldfd所指項的檔案描述符。當複製成功時,返回最小的尚未被使用的檔案描述符。出錯返回-1

返回新的檔案描述富和引數oldfd指向同乙個檔案,共享所有鎖定,讀寫指標和各項許可權和標誌位。就是說當利用了lseek()對某個檔案描述符操作時,另乙個檔案描述符的讀寫位置也會隨著改變。

dup 與 dup2 的區別dup2 可以用引數newfd 指定新檔案描述符的數值,若newfd已經被程式所使用,系統就將其關閉以釋放改檔案描述符;若oldfd與newfd相等,則dup2 返回newfd,而不關閉它。dup2呼叫成功返回新的描述符,出錯返回-1。

2)fcntl函式(功能強大)

系統呼叫可以用來對以開的檔案描述符進行各種操作以改變以開啟的檔案的各種屬性。原型:

#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);

fcntl的功能依據cmd值的不同而不同,

(1)f_dupfd 功能與dup一樣,可以賦值fd所指向的檔案描述符,呼叫成功返回新的描述符,失敗返回-1

(2)f_getfd 用來獲取檔案描述符的close-on-exec標誌。呼叫成功返回標誌值,若此值的最後一位是0,則該標誌沒有設定,即意味著執行exec相關函式後檔案描述符依然保持開啟,否則在執行exec相關函式時將關閉檔案描述符。失敗返回-1。(並不是很懂)

(3) f_setfd fcntl函式用來設定檔案描述符的close-on-exec標誌為第三個引數arg的最後一位,成功返回0,失敗返回-1(也不是很懂)

(4)f_getfl 用來獲取檔案的開啟方式。成功返回標誌值,失敗返回-1.標誌值含義同open系統呼叫一樣

。。。。

ioctl: 用來控制特殊裝置檔案的屬性,第乙個引數fd必須是乙個已經開啟的檔案描述符,第三個引數一般為char * argp,它隨著第二個引數request的不同而不同。引數request決定了引數argp是向ioctl傳遞資料還是從ioctl獲取資料。、

9.檔案屬性操作

1.獲取檔案屬性  

stat/fstat/lstat()

#include

#include

int stat(const char * file_name , struct stat * buf); 返回符號連線指向的檔案狀態資訊

int fstat(int filedes , struct stat *buf);

int lstat(const char * file_name , struct stat * buf); 返回符號連線本身狀態

成功返回0,失敗返回-1;引數struct stat * buf 是乙個儲存檔案狀態資訊的結構體

2.設定檔案屬性

chown/fchown/lchown() 用於修改檔案的使用者id和組id,

#include

#include

int chown(const char * path , userid , gruouid);

int fchown(int fd,uid_t owner , gid_t group);

int ichown(const char * path , uid_t owner , gid_t group);

chown會將引數path所指定的檔案所有者id更變為引數owner代表的使用者id

3.truncate/ftruncate()

用於改變檔案的大小,原型:

#include

#include

int truncate(const char * path ,  off_t length);

int ftruncate(int fd, off_t length);  //路徑  , 長度   fd開啟方式必須可寫!!!

如果原來的檔案大小比引數length大,則超過部分會被刪除,如果原來的檔案大小比引數length小,則檔案被擴充套件,檔案擴充套件的部分將以0填充。與sleek呼叫類似。  成功返回0,失敗返回-1.

4.utime()

用與改變任何檔案的st_mtime域 和 st_ctime 域 ,即訪問時間和修改時間。

#include

#include

int utime(const char * filename, struct utimbuf * buf);

#include

int utimes(char * filename, struct timeval * tvp);

struct utimebuf ;

系統呼叫會把第乙個引數filename指定的檔案的訪問時間改為第二個引數buf的actime,把修改時間改為第二個引數buf的modtime,如果buf是乙個空指標,則將訪問時間和就該時間都改為當前時間。成功0,錯誤-1

5.umask()用於是指檔案建立時使用的遮蔽字,並返回以前的值;

#include

#include

mode_t umask(mode_t mask);

三.檔案的移動和刪除

1.int rename(char * old path , char * new path) ;

2.int unlink(char * pathname);

int remove(char * pathname);

四.目錄的建立和刪除

1. int mkdir(char * pathname, mode);

2. int rmdir(char * pathname);

五.獲取當前目錄

char * getcwd (char * buf , size);

char * get_current_dir_name(void);

char * getwd(char * buf);

六.設定工作目錄

int chdir(char * path);

int fchdir(int fd);

七.獲取目錄資訊

1.dir * opendir(char * name);

2.struct dirent readdir(dir * dir);

struct dirent定義如下

3.closedir(dir * dir)

Linux基本操作2

command 1 help command 2使用手冊 man command 3資訊頁 info command 例如 hash 命令 help hash hash 就是用某種特殊演算法提取某個檔案的特徵碼 比如某個人的指紋 就可以直接找到 hits 是指執行次數 快取命中,在快取中找到了 數字...

Linux基本操作2

1 去掉遠端連線時的dns網域名稱解析 vim etc ssh sshd config 修改 usedns no 重啟服務 systemctl restart sshd 由於我的linux沒有用gui,所以沒有vim,只能寫vi 然後輸入命令 usedns 進行查詢 找到後yy複製,p貼上,dw刪除...

Linux檔案基本操作

linux最優秀的地方之一,在於它的多使用者 多工的開發環境。為了讓各使用者具有較安全的管理機制,檔案的許可權管理是很重要的。linux通常將檔案的訪問方式分為3個類別,分別是owner group other,且具有read write excute等許可權 由於mac是基於unix系統的,加上我...