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

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