1:I/o操作函數
每一個進程在啓動的時候會打開三個文件,分別是stdout,stdin,stderr,他們的文件描述符號分別是0,1,2 open,read,write,close函數是文件操作函數unix中的低級調用,他們使用文件描述符作爲藉口
open函數,打開文件#include <sys/types.h>
#include <sys/stat.h>
#include <fcnt1.h>
int open(const char *pathname,int flags);返回值是一個整數類型,表示一個文件的描述符
其中flags能使用的標誌如下:1:O_RDONLY,以至讀的方式打開
2:O_WRONLY 以只寫的方式打開
3:O_RDWR 以讀寫的方式打開
其中還有很多和flag相組合的一些方式,中間用OR連接,可以上網查一查
2:close函數,關閉文件,當使用萬文件後,則要使用close()關閉該文件,close()會讓數據寫回磁盤,並且釋放該文件所佔用的資源
#include <unistd.h>
int close (int fd);
調用此函數發生錯誤的情況——fd是一個無效的描述符————再調用該函數的時候收到中斷信號————文件i。o放生錯誤
3:read函數,此函數會把參數fd所指的文件傳送count個字節到buf指針所指的內存中,若參數count爲0則read不會起作用並且返回0,文件會隨讀取到的字節而移動,read函數的原型爲
#include <unistd.h>
ssize_t read (int fd,void *buf,size_t count);其中fd表示用open,creat所返回的一個文件描述符
此函數的返回值是所讀取的字節數,如果是0就表示到達文件末尾或者是沒有文件可讀,如果發生錯誤時就返回-1,錯誤代碼存入errno中,而文件讀寫位置無法預期,可以吧返回值和count比較,如果字節少了,則有可能出現讀到文件尾,從管道pipe或終端機讀取或者read被信號中毒了讀取動作
4:write 函數,寫文件,會把以參數buf爲起始的內存中的count個字節寫入到參數fd所指的文件中,文件讀寫位置會隨之移動
#include <unistd.h>
ssize_t write (int fd ,const void *buf.size_t count);
函數返回值,如果成功,函數會返回實際寫入字節數,黨有錯誤反生時候則返回-1,錯誤代碼存入errno中,對於一個普通文件返回0沒有影響
5:iseek函數,文件定位
#include <sys/types.h>
#inlcude <unistd.h>
off_t lseek (int fildes,off_t offset.int whence)
其中,filds表示已經打開的文件描述符,第一個爲根據whence參數來移動偏移量。第三個參數有SEEK_SET ,SEEK_CUR,SEEK_END,當調用成功的時候返回當前文件讀寫的位置,也就是說會返回距離文件開頭有多少個字節
6:ioctl函數,文件控制
#include <sys/ioctl.h>
int ioctl (int fd,usigned int cmd,...)
這是一個對設備文件進行操作的特殊函數,對於普通文件不使用這個函數,該函數的調用回合驅動程序內部相應的函數對應,cm d參數是一個命令參數,。。。號是自定義的命令參數,如果成功就返回0,不成功就返回-1
7:flock函數,文件鎖定函數
#include<.sys/file.h>
int flock (int fd,int operation)
flock函數會依參數operation所指定的方式對參數文件所制定的文件做各種鎖定或是接觸鎖定的動作,此函數只能鎖定整個文件,無法鎖定文件的哪個區域,單一文件無法同時建立共享鎖定,當使用dup或是fork時,文件描述符也不會繼承此種鎖定,
關於operation的參數
LOCK_SH:建立共享鎖定,多個進程可同時對一個文件做共享鎖定
LOCK_EX:建立互斥鎖定,一個文件同時只有一個互斥鎖定
LOCK_UN:接觸鎖定
LOCK_NB無法建立鎖定時,此操作可不被阻斷,立刻返回進程,通常與LOCK_SH,LOCK_EX 做or(1)組合
8:mmap函數和munmap函數,內存映射分別用於建立和及誒出內存映射
#include <unistd>
#include <sys/mman.h>
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize)
void munmap(void *start ,size_t length)
mmap用來將某個文件類容映射到內存中,對該內存區域的存取即使直接對該文件內容的讀寫,再調用mmap時必須要制定flags爲MAP_SHAREN或是MAP_PRINVATE
start致命對應的內存其實地址,通常是NULL表明系統自動選定地址
length指明瞭將文件中多大部分對應到內存中
prot:
PROT_EVEC:映射區域可被執行
PROT_READ:影射區域可被讀取
PROT_WRITE:影射區域可能寫入
PROT_NONE:影射區域不能存取
flags:映射區域的各種特性
MAP_FIED
MAP_SHARED
MAP_PRIVATE
MAP_ANONYMUS
MAP_DENYWRITE
MAP_LOCKED:
offset:文件映射的偏移量,通常設置爲0,代表從文件最前方開始對應,offset必須是分頁大小的整數倍
9:create函數,創建文件
#include <sys/types.h>
#inlcude <stat.h>
#include <fcntl.h>
int create (const char *pathname,mode_t mode)
create用於創建一個新的文件,這個函數將返回一個文件描述符,若出錯,早日返回-1,如果需要新建的文件已經存在,則經過creae函數調用後,該文件的內容會置空
10:dup函數和dup2函數,複製文件描述符
#include <unistd.h>
int dup(int filedes)
int dup2(int filedes,int filedes2)
這兩個函數用於複製一個顯存額文件描述符,由dup返回的新文件描述符一定是當前可用的文件描述符中最小一個,用dup2則可以用filedes2參數指定新描述符的數值,如果filedes2已經打開,則現將其關閉,如果filedes等於filedes2,則dup2函數返回filedes2
如果執行成功則返回新的描述符,如果失敗則返回-1,錯誤存在於errno中
11:fcntl函數,改變已經打開的文件的屬性
#include <fcntl.h>
int fcntl(int fields,int cmd)
int fcntl(int fields,int cmd,int arg)
cmd是輸入的命令,arg命令參數
功能是:複製一個現有的描述符,cmd=F_DUPFD————得到/設置文件愛你描述符標記(cmd = F_GETFD/F_SETFD)--------------得到/設置文件狀態標計(cmd = F_GETFL / F_SETOWN)----------------------得到/設置異步i/o所有權(cmd=F_GETOWN,cmd-= F_SETOWN)----------------------------得到/設置記錄鎖(cmd = F_GETLK,F_SETLK 或 F_SETLKW)
如果執行成功則返回新的描述符,如果失敗則返回-1,錯誤原因存在與errno中