日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

linux文件操作

系統(tǒng) 2147 0

寒假里學了點linux程序設計,作了一些筆記

linux中的一切東西都可以看成是文件
目錄也是文件,但它是一種特殊類型的文件
目錄是用于保存其他文件的節(jié)點號和名字的文件。目錄文件中的每個數(shù)據(jù)項都是指向某個文件節(jié)點的鏈接,刪除文件名就等于刪除與之對應的鏈接(文件的節(jié)點號可以用ln -i查看)ln命令在不同文件中創(chuàng)建指向同一個文件的鏈接
刪除一個文件是,實際上是刪除了該文件對應的目錄項,同時指向該文件的鏈接數(shù)減一。
/dev/console 系統(tǒng)控制臺,錯誤信息和診斷信息會被發(fā)往這個設備。
/dev/tty
/dev/null 空設備,所有寫向這個設備的輸出都將被丟棄,而讀這個設備會立即返回一個文件尾標志,因此,在cp命令里可以把它用作復制空文件的源文件,人們常把不需要的輸出重定向到/dev/null
設備包括字符設備,塊設備,硬盤是典型的塊設備



系統(tǒng)調(diào)用和設備驅(qū)動程序
open:打開文件或設備
read:從打開的文件或設備里讀取數(shù)據(jù)
write:向文件或設備寫如數(shù)據(jù)
close:關閉文件或設備
ioctl:把控制信息傳遞給設備驅(qū)動程序 ioctl不需要具備可移植性,用法隨設備的不同而不同



底層文件的訪問

當一個程序打開時,它一般會有3個已經(jīng)打開的文件描述符
0:標準輸入
1:標準輸出
2:標準錯誤


write系統(tǒng)調(diào)用
#include<unistd.h>
size_t write(int fildes,const void *buf ,size_t nbytes);
把緩沖區(qū)buf的前nbytes個字節(jié)寫入與文件描述符fildes關聯(lián)的文件中。它返回實際寫入的字節(jié)數(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相關的文件里讀取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建立了一條到文件或設備的訪問路徑。如果調(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)用成功返回一個新的文件描述符(非負整數(shù))。在失敗時返回負一,并設置全局變量errno來指明失敗的原因,新文件描述符總是使用未用文件描述符的最小值
。例如一個文件關閉了他的標準輸出,然后再次調(diào)用open,文件描述符1就會被重新使用,并且標準輸出將被有效的重定向到另一個文件或設備

當使用O_CREAT標志的open調(diào)用來創(chuàng)建文件時,必須使用有3個參數(shù)格式的open調(diào)用。
第3個參數(shù)mode是幾個標志位按位或后得到的,這些標志在頭文件sys/stat.h中定義

S_IRUSR 讀權限,文件屬主
S_IWUSR 寫權限,文件屬主
S_IXUSR 執(zhí)行權限,文件屬主
S_IRGRP 讀權限,文件所屬組
S_IWGRP 寫權限,文件所屬組
S_IXGRP 執(zhí)行權限,文件所屬組
S_IROTH 讀權限,其他用戶
S_IWOTH 寫權限,其他用戶
S_IXOTH 執(zhí)行權限,其他用戶

例子
open(“myfile”,O_CREAT,S_IRUSR|S_IXUSR)
創(chuàng)建一個名為myfile的文件,文件屬主擁有讀權限,其他用戶擁有執(zhí)行權限,且只設置了這些權限


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ù)


例子
在linux系統(tǒng)上對ioctl的如下調(diào)用將打開鍵盤上的led燈
ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR);


其他與文件有關的系統(tǒng)調(diào)用

lseek系統(tǒng)調(diào)用
對文件描述符fildes的讀寫指針進行設置。可以用它來設置文件的下一個讀寫位置。讀寫指針既可以被設置為文件的某個絕對位置,也可以設置為相對于當前位置或文件尾的某個相對位置
#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是相對于當前位置的一個相對位置
SEEK_END:offset是相對于文件尾的一個相對位置
lseek返回從文件到文件指針被設置處的字節(jié)偏移,失敗時返回-1.參數(shù)offset的類型off_t是一個與具體實現(xiàn)有關的整數(shù)類型,它定義在sys/types.h中


fstat,stat和lstat的系統(tǒng)調(diào)用
fstat系統(tǒng)調(diào)用返回與打開的文件描述符相關的文件的狀態(tài)信息,該信息將會寫到一個buf結構中,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)生相同的結果,但當文件是一個符號鏈接時,lstat返回的是符號鏈接本身的信息,而stat返回的是該鏈接指向的文件信息

st_mode 文件權限和文件類型信息
st_ino 與該文件關聯(lián)的inode
st_dev? 保存文件的設備
st_uid 文件屬主的UID號
st_gid 文件屬主的GID號
st_atime 文件上一次被訪問的時間
st_ctime文件的權限,屬主,組或內(nèi)容上一次被修改的時間
st_mtime 文件的內(nèi)容上一次被修改的時間
st_nlink 該文件上硬鏈接的個數(shù)


dup和dup2系統(tǒng)調(diào)用

dup系統(tǒng)調(diào)用提供了一種復制文件描述符的方法,使我們能夠通過兩個或更多個不同的文件描述來訪問同一個文件,這可以用在文件的不同位置對數(shù)據(jù)進行讀寫。dup系統(tǒng)調(diào)用復制文件描述符fildes,返回一個新的文件描述符。dup2系統(tǒng)調(diào)用則是通過明確指定描述符來把一個文件描述符復制為另一個文件描述符
原型如下:
#include<unistd.h>
int dup(int fildes);
int dup2(int fildes,int fildes2);

linux文件操作


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 云霄县| 资阳市| 玉田县| 宜宾县| 久治县| 长武县| 清新县| 涟源市| 寿光市| 芒康县| 平山县| 东源县| 新建县| 浙江省| 上饶县| 格尔木市| 大城县| 定陶县| 泸西县| 积石山| 双鸭山市| 蚌埠市| 遂川县| 丰县| 浦东新区| 太原市| 沁源县| 渭南市| 灵川县| 桦甸市| 门头沟区| 洛隆县| 偃师市| 阳原县| 北碚区| 林口县| 碌曲县| 涟水县| 卓尼县| 浦江县| 临沧市|