寒假里學(xué)了點linux程序設(shè)計,作了一些筆記
linux中的一切東西都可以看成是文件
目錄也是文件,但它是一種特殊類型的文件
目錄是用于保存其他文件的節(jié)點號和名字的文件。目錄文件中的每個數(shù)據(jù)項都是指向某個文件節(jié)點的鏈接,刪除文件名就等于刪除與之對應(yīng)的鏈接(文件的節(jié)點號可以用ln -i查看)ln命令在不同文件中創(chuàng)建指向同一個文件的鏈接
刪除一個文件是,實際上是刪除了該文件對應(yīng)的目錄項,同時指向該文件的鏈接數(shù)減一。
/dev/console 系統(tǒng)控制臺,錯誤信息和診斷信息會被發(fā)往這個設(shè)備。
/dev/tty
/dev/null 空設(shè)備,所有寫向這個設(shè)備的輸出都將被丟棄,而讀這個設(shè)備會立即返回一個文件尾標(biāo)志,因此,在cp命令里可以把它用作復(fù)制空文件的源文件,人們常把不需要的輸出重定向到/dev/null
設(shè)備包括字符設(shè)備,塊設(shè)備,硬盤是典型的塊設(shè)備
系統(tǒng)調(diào)用和設(shè)備驅(qū)動程序
open:打開文件或設(shè)備
read:從打開的文件或設(shè)備里讀取數(shù)據(jù)
write:向文件或設(shè)備寫如數(shù)據(jù)
close:關(guān)閉文件或設(shè)備
ioctl:把控制信息傳遞給設(shè)備驅(qū)動程序 ioctl不需要具備可移植性,用法隨設(shè)備的不同而不同
底層文件的訪問
當(dāng)一個程序打開時,它一般會有3個已經(jīng)打開的文件描述符
0:標(biāo)準(zhǔn)輸入
1:標(biāo)準(zhǔn)輸出
2:標(biāo)準(zhǔn)錯誤
write系統(tǒng)調(diào)用
#include<unistd.h>
size_t write(int fildes,const void *buf ,size_t nbytes);
把緩沖區(qū)buf的前nbytes個字節(jié)寫入與文件描述符fildes關(guān)聯(lián)的文件中。它返回實際寫入的字節(jié)數(shù)。如果文件描述符有錯或者底層的設(shè)備驅(qū)動程序?qū)?shù)據(jù)塊的長度比較敏感該返回值可能會小于nbytes,如果返回值為0,表示未寫入任何數(shù)據(jù)如果返回的是-1表示在系統(tǒng)調(diào)用中出現(xiàn)了錯誤,錯誤代碼保存在全局變量errno中
read系統(tǒng)調(diào)用
#include<unistd.h>
size_t read(int fildes,void *buf,size_t nbytes);
從與文件描述符fildes相關(guān)的文件里讀取nbytes個字節(jié)的數(shù)據(jù),并把它們放到數(shù)據(jù)區(qū)buf中,它返回實際讀入的字節(jié)數(shù),這可能會小于請求的字節(jié)數(shù),如果read調(diào)用返回0,表示未讀入任何數(shù)據(jù),已到達了文件尾。同樣,如果返回的是-1,就表示出現(xiàn)了錯誤
open系統(tǒng)調(diào)用
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int open(const char *path,int oflags);
int open與(const char *path,int oflags,mode_t mode);
open建立了一條到文件或設(shè)備的訪問路徑。如果調(diào)用成功,它將返回一個可以被read,write和其他系統(tǒng)調(diào)用使用的文件描述符。這個文件描述符是唯一的它不會與任何其他運行中的進程共享。如果兩個程序同時打開同一個文件,他們會得到兩個不同的文件描述符。如果他們都對文件進行寫操作,那么他們會個寫個的,分別接著上次離開的位置繼續(xù)往下寫。數(shù)據(jù)不會交織在一起,而是彼此相互覆蓋。兩個程序?qū)ξ募淖x寫位置不同。可以通過鎖功能來防止沖突
path路徑
oflags打開文件所指定的動作
O_RDONLY 以只讀方式打開
O_WRONLY 以只寫方式打開
O_RDWR 以讀寫方式打開
oflags參數(shù)下列可選模式( 按位或)
O_APPEND?? 把寫入數(shù)據(jù)追加在文件的末尾
O_TRUNC? 把文件長度置為零,丟棄已有的內(nèi)容
O_CREAT? 如果需要,就按參數(shù)mode中給出的訪問模式創(chuàng)建文件
O_EXCL? 與O_CREAT一起使用,確保調(diào)用者創(chuàng)建文件。open調(diào)用是一個原子操作,即他只執(zhí)行一個函數(shù)調(diào)用。使用這個可選模式可以防止兩個程序同時創(chuàng)建同一個文件。如果文件存在,open將調(diào)用失敗
open調(diào)用成功返回一個新的文件描述符(非負(fù)整數(shù))。在失敗時返回負(fù)一,并設(shè)置全局變量errno來指明失敗的原因,新文件描述符總是使用未用文件描述符的最小值
。例如一個文件關(guān)閉了他的標(biāo)準(zhǔn)輸出,然后再次調(diào)用open,文件描述符1就會被重新使用,并且標(biāo)準(zhǔn)輸出將被有效的重定向到另一個文件或設(shè)備
當(dāng)使用O_CREAT標(biāo)志的open調(diào)用來創(chuàng)建文件時,必須使用有3個參數(shù)格式的open調(diào)用。
第3個參數(shù)mode是幾個標(biāo)志位按位或后得到的,這些標(biāo)志在頭文件sys/stat.h中定義
S_IRUSR 讀權(quán)限,文件屬主
S_IWUSR 寫權(quán)限,文件屬主
S_IXUSR 執(zhí)行權(quán)限,文件屬主
S_IRGRP 讀權(quán)限,文件所屬組
S_IWGRP 寫權(quán)限,文件所屬組
S_IXGRP 執(zhí)行權(quán)限,文件所屬組
S_IROTH 讀權(quán)限,其他用戶
S_IWOTH 寫權(quán)限,其他用戶
S_IXOTH 執(zhí)行權(quán)限,其他用戶
例子
open(“myfile”,O_CREAT,S_IRUSR|S_IXUSR)
創(chuàng)建一個名為myfile的文件,文件屬主擁有讀權(quán)限,其他用戶擁有執(zhí)行權(quán)限,且只設(shè)置了這些權(quán)限
close系統(tǒng)調(diào)用
#include<unistd.h>
int close(int fildes);
close 調(diào)用成功返回0,出錯返回-1
ioctl系統(tǒng)調(diào)用
#include<unistd.h>
int ioctl(int fildes,int cmd, .....);
ioctl對描述符fildes引用的對象執(zhí)行cmd參數(shù)中給出的操作。根據(jù)設(shè)備所支持操作的不同,他可能會有一個可選的第三參數(shù)
例子
在linux系統(tǒng)上對ioctl的如下調(diào)用將打開鍵盤上的led燈
ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR);
其他與文件有關(guān)的系統(tǒng)調(diào)用
lseek系統(tǒng)調(diào)用
對文件描述符fildes的讀寫指針進行設(shè)置。可以用它來設(shè)置文件的下一個讀寫位置。讀寫指針既可以被設(shè)置為文件的某個絕對位置,也可以設(shè)置為相對于當(dāng)前位置或文件尾的某個相對位置
#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);
off_set參數(shù)用來制定位置,而whence參數(shù)定義該偏移值的用法。
whence可以取下列值
SEEK_SET:offset是一個絕對位置
SEEK_CUR:offset是相對于當(dāng)前位置的一個相對位置
SEEK_END:offset是相對于文件尾的一個相對位置
lseek返回從文件到文件指針被設(shè)置處的字節(jié)偏移,失敗時返回-1.參數(shù)offset的類型off_t是一個與具體實現(xiàn)有關(guān)的整數(shù)類型,它定義在sys/types.h中
fstat,stat和lstat的系統(tǒng)調(diào)用
fstat系統(tǒng)調(diào)用返回與打開的文件描述符相關(guān)的文件的狀態(tài)信息,該信息將會寫到一個buf結(jié)構(gòu)中,buf的地址以參數(shù)形式傳遞給fstat
原型
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
int fstat(int fildes,struct stat *buf);
int stat(const char *path,struct stat *buf);
int lstat(const char *path,struct stat *buf);
頭文件sys/types.h是可選的
stat和lstat返回的是通過文件名查到的狀態(tài)信息。他們產(chǎn)生相同的結(jié)果,但當(dāng)文件是一個符號鏈接時,lstat返回的是符號鏈接本身的信息,而stat返回的是該鏈接指向的文件信息
st_mode 文件權(quán)限和文件類型信息
st_ino 與該文件關(guān)聯(lián)的inode
st_dev? 保存文件的設(shè)備
st_uid 文件屬主的UID號
st_gid 文件屬主的GID號
st_atime 文件上一次被訪問的時間
st_ctime文件的權(quán)限,屬主,組或內(nèi)容上一次被修改的時間
st_mtime 文件的內(nèi)容上一次被修改的時間
st_nlink 該文件上硬鏈接的個數(shù)
dup和dup2系統(tǒng)調(diào)用
dup系統(tǒng)調(diào)用提供了一種復(fù)制文件描述符的方法,使我們能夠通過兩個或更多個不同的文件描述來訪問同一個文件,這可以用在文件的不同位置對數(shù)據(jù)進行讀寫。dup系統(tǒng)調(diào)用復(fù)制文件描述符fildes,返回一個新的文件描述符。dup2系統(tǒng)調(diào)用則是通過明確指定描述符來把一個文件描述符復(fù)制為另一個文件描述符
原型如下:
#include<unistd.h>
int dup(int fildes);
int dup2(int fildes,int fildes2);
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
