linux文件操作篇

函數:    close(),
       creat(),
       dup(),
       dup2(),
       fcntl(),
       flock(),
       fsync(),
       lseek(),
        mkstemp(),
       open(),
       read(),
       sync(),
       write(),
       ftruncate(),
       fstat(),
       fchmod(),
       select(),
       ioctl().

close(關閉文件) 相關函數 open,fcntl,shutdown,unlink,fclose
表頭文件 #include<unistd.h>
定義函數 int close(int fd);
函數說明 當使用完文件後若已不再需要則可使用close()關閉該文件,二close()會讓數據寫回磁盤,並釋放該文件所佔用的資源。參數fd爲先前由open()或creat()所返回的文件描述詞。
返回值 若文件順利關閉則返回0,發生錯誤時返回-1。
錯誤代碼 EBADF 參數fd 非有效的文件描述詞或該文件已關閉。
附加說明 雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行關閉文件,並確實檢查返回值。
範例 參考open()
 

creat(建立文件) 相關函數 read,write,fcntl,close,link,stat,umask,unlink,fopen
表頭文件 #include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定義函數 int creat(const char * pathname, mode_tmode);
函數說明 參數pathname指向欲建立的文件路徑字符串。Creat()相當於使用下列的調用方式調用open()
open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC));
錯誤代碼 關於參數mode請參考open()函數。
返回值 creat()會返回新的文件描述詞,若有錯誤發生則會返回-1,並把錯誤代碼設給errno。
EEXIST 參數pathname所指的文件已存在。
EACCESS 參數pathname 所指定的文件不符合所要求測試的權限
EROFS 欲打開寫入權限的文件存在於只讀文件系統內
EFAULT 參數pathname 指針超出可存取的內存空間
EINVAL 參數mode 不正確。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname爲一目錄
ENOMEM 核心內存不足
ELOOP 參數pathname有過多符號連接問題。
EMFILE 已達到進程可同時打開的文件數上限
ENFILE 已達到系統可同時打開的文件數上限
附加說明 creat()無法建立特別的裝置文件,如果需要請使用mknod()。
範例 請參考open()。
 

dup(複製文件描述詞) 相關函數 open,close,fcntl,dup2
表頭文件 #include<unistd.h>
定義函數 int dup (int oldfd);
函數說明 dup()用來複制參數oldfd所指的文件描述詞,並將它返回。此新的文件描述詞和參數oldfd指的是同一個文件,共享所有的鎖定、讀寫位置和各項權限或旗標。例如,當利用lseek()對某個文件描述詞作用時,另一個文件描述詞的讀寫位置也會隨着改變。不過,文件描述詞之間並不共享close-on-exec旗標。
返回值 當複製成功時,則返回最小及尚未使用的文件描述詞。若有錯誤則返回-1,errno會存放錯誤代碼。錯誤代碼EBADF參數fd非有效的文件描述詞,或該文件已關閉。
 

dup2(複製文件描述詞) 相關函數 open,close,fcntl,dup
表頭文件 #include<unistd.h>
定義函數 int dup2(int odlfd,int newfd);
函數說明 dup2()用來複制參數oldfd所指的文件描述詞,並將它拷貝至參數newfd後一塊返回。若參數newfd爲一已打開的文件描述詞,則newfd所指的文件會先被關閉。dup2()所複製的文件描述詞,與原來的文件描述詞共享各種文件狀態,詳情可參考dup()。
返回值 當複製成功時,則返回最小及尚未使用的文件描述詞。若有錯誤則返回-1,errno會存放錯誤代碼。
附加說明 dup2()相當於調用fcntl(oldfd,F_DUPFD,newfd);請參考fcntl()。
錯誤代碼 EBADF 參數fd 非有效的文件描述詞,或該文件已關閉
 

fcntl(文件描述詞操作) 相關函數 open,flock
表頭文件 #include<unistd.h>
#include<fcntl.h>
定義函數 int fcntl(int fd , int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lock);
函數說明 fcntl()用來操作文件描述詞的一些特性。參數fd代表欲設置的文件描述詞,參數cmd代表欲操作的指令。
有以下幾種情況:
F_DUPFD用來查找大於或等於參數arg的最小且仍未使用的文件描述詞,並且複製參數fd的文件描述詞。執行成功則返回新複製的文件描述詞。請參考dup2()。F_GETFD取得close-on-exec旗標。若此旗標的FD_CLOEXEC位爲0,代表在調用exec()相關函數時文件將不會關閉。
F_SETFD 設置close-on-exec 旗標。該旗標以參數arg 的FD_CLOEXEC位決定。
F_GETFL 取得文件描述詞狀態旗標,此旗標爲open()的參數flags。
F_SETFL 設置文件描述詞狀態旗標,參數arg爲新旗標,但只允許O_APPEND、O_NONBLOCK和O_ASYNC位的改變,其他位的改變將不受影響。
F_GETLK 取得文件鎖定的狀態。
F_SETLK 設置文件鎖定的狀態。此時flcok 結構的l_type 值必須是F_RDLCK、F_WRLCK或F_UNLCK。如果無法建立鎖定,則返回-1,錯誤代碼爲EACCES 或EAGAIN。
F_SETLKW F_SETLK 作用相同,但是無法建立鎖定時,此調用會一直等到鎖定動作成功爲止。若在等待鎖定的過程中被信號中斷時,會立即返回-1,錯誤代碼爲EINTR。參數lock指針爲flock 結構指針,定義如下
struct flcok
{
short int l_type; /* 鎖定的狀態*/
short int l_whence;/*決定l_start位置*/
off_t l_start; /*鎖定區域的開頭位置*/
off_t l_len; /*鎖定區域的大小*/
pid_t l_pid; /*鎖定動作的進程*/
};
l_type 有三種狀態:
F_RDLCK 建立一個供讀取用的鎖定
F_WRLCK 建立一個供寫入用的鎖定
F_UNLCK 刪除之前建立的鎖定
l_whence 也有三種方式:
SEEK_SET 以文件開頭爲鎖定的起始位置。
SEEK_CUR 以目前文件讀寫位置爲鎖定的起始位置
SEEK_END 以文件結尾爲鎖定的起始位置。
返回值 成功則返回0,若有錯誤則返回-1,錯誤原因存於errno.
 

flock(鎖定文件或解除鎖定) 相關函數 open,fcntl
表頭文件 #include<sys/file.h>
定義函數 int flock(int fd,int operation);
函數說明 flock()會依參數operation所指定的方式對參數fd所指的文件做各種鎖定或解除鎖定的動作。此函數只能鎖定整個文件,無法鎖定文件的某一區域。
參數 operation有下列四種情況:
LOCK_SH 建立共享鎖定。多個進程可同時對同一個文件作共享鎖定。
LOCK_EX 建立互斥鎖定。一個文件同時只有一個互斥鎖定。
LOCK_UN 解除文件鎖定狀態。
LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回進程。通常與LOCK_SH或LOCK_EX 做OR(|)組合。
單一文件無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時文件描述詞不會繼承此種鎖定。
返回值 返回0表示成功,若有錯誤則返回-1,錯誤代碼存於errno。
 

fsync(將緩衝區數據寫回磁盤) 相關函數 sync
表頭文件 #include<unistd.h>
定義函數 int fsync(int fd);
函數說明 fsync()負責將參數fd所指的文件數據,由系統緩衝區寫回磁盤,以確保數據同步。
返回值 成功則返回0,失敗返回-1,errno爲錯誤代碼。
 

lseek(移動文件的讀寫位置) 相關函數 dup,open,fseek
表頭文件 #include<sys/types.h>
#include<unistd.h>
定義函數 off_t lseek(int fildes,off_t offset ,int whence);
函數說明 每一個已打開的文件都有一個讀寫位置,當打開文件時通常其讀寫位置是指向文件開頭,若是以附加的方式打開文件(如O_APPEND),則讀寫位置會指向文件尾。當read()或write()時,讀寫位置會隨之增加,lseek()便是用來控制該文件的讀寫位置。參數fildes 爲已打開的文件描述詞,參數offset 爲根據參數whence來移動讀寫位置的位移數。
參數 whence爲下列其中一種:
SEEK_SET 參數offset即爲新的讀寫位置。
SEEK_CUR 以目前的讀寫位置往後增加offset個位移量。
SEEK_END 將讀寫位置指向文件尾後再增加offset個位移量。
當whence 值爲SEEK_CUR 或SEEK_END時,參數offet允許負值的出現。
下列是教特別的使用方式:
1) 欲將讀寫位置移到文件開頭時:lseek(int fildes,0,SEEK_SET);
2) 欲將讀寫位置移到文件尾時:lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置時:lseek(int fildes,0,SEEK_CUR);
返回值 當調用成功時則返回目前的讀寫位置,也就是距離文件開頭多少個字節。若有錯誤則返回-1,errno 會存放錯誤代碼。
附加說明 Linux系統不允許lseek()對tty裝置作用,此項動作會令lseek()返回ESPIPE。
範例 參考本函數說明
 

mkstemp(建立唯一的臨時文件) 相關函數 mktemp
表頭文件 #include<stdlib.h>
定義函數 int mkstemp(char * template);
函數說明 mkstemp()用來建立唯一的臨時文件。參數template 所指的文件名稱字符串中最後六個字符必須是XXXXXX。Mkstemp()會以可讀寫模式和0600 權限來打開該文件,如果該文件不存在則會建立該文件。打開該文件後其文件描述詞會返回。文件順利打開後返回可讀寫的文件描述詞。若果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。
錯誤代碼 EINVAL 參數template 字符串最後六個字符非XXXXXX。EEXIST 無法建立臨時文件。
附加說明 參數template所指的文件名稱字符串必須聲明爲數組,如:
char template[ ] =”template-XXXXXX”;
千萬不可以使用下列的表達方式
char *template = “template-XXXXXX”;
範例 #include<stdlib.h>
main( )
{
int fd;
char template[ ]=”template-XXXXXX”;
fd=mkstemp(template);
printf(“template = %s\n”,template);
close(fd);
}
執行 template = template-lgZcbo
 

open(打開文件) 相關函數 read,write,fcntl,close,link,stat,umask,unlink,fopen
表頭文件 #include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定義函數 int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
函數說明 參數pathname 指向欲打開的文件路徑字符串。下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用OR(|)運算符組合。
O_CREAT 若欲打開的文件不存在則自動建立該文件。
O_EXCL 如果O_CREAT 也被設置,此指令會去檢查文件是否存在。文件若不存在則建立該文件,否則將導致打開文件錯誤。此外,若O_CREAT與O_EXCL同時設置,並且欲打開的文件爲符號連接,則會打開文件失敗。
O_NOCTTY 如果欲打開的文件爲終端機設備時,則不會將該終端機當成進程控制終端機。
O_TRUNC 若文件存在並且以可寫的方式打開時,此旗標會令文件長度清爲0,而原來存於該文件的資料也會消失。
O_APPEND 當讀寫文件時會從文件尾開始移動,也就是所寫入的數據會以附加的方式加入到文件後面。
O_NONBLOCK 以不可阻斷的方式打開文件,也就是無論有無數據讀取或等待,都會立即返回進程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打開文件。
O_NOFOLLOW 如果參數pathname 所指的文件爲一符號連接,則會令打開文件失敗。
O_DIRECTORY 如果參數pathname 所指的文件並非爲一目錄,則會令打開文件失敗。
此爲Linux2.2以後特有的旗標,以避免一些系統安全問題。參數mode 則有下列數種組合,只有在建立新文件時纔會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該爲(mode-umaks)。
S_IRWXU00700 權限,代表該文件所有者具有可讀、可寫及可執行的權限。
S_IRUSR 或S_IREAD,00400權限,代表該文件所有者具有可讀取的權限。
S_IWUSR 或S_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。
S_IXUSR 或S_IEXEC,00100 權限,代表該文件所有者具有可執行的權限。
S_IRWXG 00070權限,代表該文件用戶組具有可讀、可寫及可執行的權限。
S_IRGRP 00040 權限,代表該文件用戶組具有可讀的權限。
S_IWGRP 00020權限,代表該文件用戶組具有可寫入的權限。
S_IXGRP 00010 權限,代表該文件用戶組具有可執行的權限。
S_IRWXO 00007權限,代表其他用戶具有可讀、可寫及可執行的權限。
S_IROTH 00004 權限,代表其他用戶具有可讀的權限
S_IWOTH 00002權限,代表其他用戶具有可寫入的權限。
S_IXOTH 00001 權限,代表其他用戶具有可執行的權限。
返回值 若所有欲覈查的權限都通過了檢查則返回0 值,表示成功,只要有一個權限被禁止則返回-1。
錯誤代碼 EEXIST 參數pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標。
EACCESS 參數pathname所指的文件不符合所要求測試的權限。
EROFS 欲測試寫入權限的文件存在於只讀文件系統內。
EFAULT 參數pathname指針超出可存取內存空間。
EINVAL 參數mode 不正確。
ENAMETOOLONG 參數pathname太長。
ENOTDIR 參數pathname不是目錄。
ENOMEM 核心內存不足。
ELOOP 參數pathname有過多符號連接問題。
EIO I/O 存取錯誤。
附加說明 使用access()作用戶認證方面的判斷要特別小心,例如在access()後再作open()空文件可能會造成系統安全上的問題。
範例 #include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
main()
{
int fd,size;
char s [ ]=”Linux Programmer!\n”,buffer[80];
fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);
write(fd,s,sizeof(s));
close(fd);
fd=open(“/tmp/temp”,O_RDONLY);
size=read(fd,buffer,sizeof(buffer));
close(fd);
printf(“%s”,buffer);
}
執行 Linux Programmer!
 

read(由已打開的文件讀取數據) 相關函數 readdir,write,fcntl,close,lseek,readlink,fread
表頭文件 #include<unistd.h>
定義函數 ssize_t read(int fd,void * buf ,size_t count);
函數說明 read()會把參數fd 所指的文件傳送count個字節到buf指針所指的內存中。若參數count爲0,則read()不會有作用並返回0。返回值爲實際讀取到的字節數,如果返回0,表示已到達文件尾或是無可讀取的數據,此外文件讀寫位置會隨讀取到的字節移動。
附加說明 如果順利read()會返回實際讀到的字節數,最好能將返回值與參數count 作比較,若返回的字節數比要求讀取的字節數少,則有可能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()被信號中斷了讀取動作。當有錯誤發生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則無法預期。
錯誤代碼 EINTR 此調用被信號所中斷。
EAGAIN 當使用不可阻斷I/O 時(O_NONBLOCK),若無數據可讀取則返回此值。
EBADF 參數fd 非有效的文件描述詞,或該文件已關閉。
範例 參考open()。
 

sync(將緩衝區數據寫回磁盤) 相關函數 fsync
表頭文件 #include<unistd.h>
定義函數 int sync(void)
函數說明 sync()負責將系統緩衝區數據寫回磁盤,以確保數據同步。
返回值 返回0。
 

write(將數據寫入已打開的文件內) 相關函數 open,read,fcntl,close,lseek,sync,fsync,fwrite
表頭文件 #include<unistd.h>
定義函數 ssize_t write (int fd,const void * buf,size_t count);
函數說明 write()會把參數buf所指的內存寫入count個字節到參數fd所指的文件內。當然,文件讀寫位置也會隨之移動。
返回值 如果順利write()會返回實際寫入的字節數。當有錯誤發生時則返回-1,錯誤代碼存入errno中。
錯誤代碼 EINTR 此調用被信號所中斷。
EAGAIN 當使用不可阻斷I/O 時(O_NONBLOCK),若無數據可讀取則返回此值。
EADF 參數fd非有效的文件描述詞,或該文件已關閉。
範例 請參考open()。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章