歡迎您光臨本站 註冊首頁

linux常用c函數 文件操作篇

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

 

 

   close(關閉文件)

  相關函數  openfcntlshutdownunlinkfclose

  表頭文件  #include<unistd.h>

  定義函數  int close(int fd);

  函數說明  當使用完文件后若已不再需要則可使用close()關閉該文件,二close()會讓數據寫回磁碟,並釋放該文件所佔用的資源。參數fd為先前由open()creat()所返回的文件描述詞。

  返回值  若文件順利關閉則返回0,發生錯誤時返回-1

  錯誤代碼  EBADF 參數fd 非有效的文件描述詞或該文件已關閉。

  附加說明  雖然在進程結束時,系統會自動關閉已打開的文件,但仍建議自行關閉文件,並確實檢查返回值。

  範例  參考open()

  creat(建立文件)

  相關函數  readwritefcntlcloselinkstatumaskunlinkfopen

  表頭文件  #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(複製文件描述詞)

  相關函數  openclosefcntldup2

  表頭文件  #include<unistd.h>

  定義函數  int dup (int oldfd);

  函數說明  dup()用來複制參數oldfd所指的文件描述詞,並將它返回。此新的文件描述詞和參數oldfd指的是同一個文件,共享所有的鎖定、讀寫位置和各項許可權或旗標。例如,當利用lseek()對某個文件描述詞作用時,另一個文件描述詞的讀寫位置也會隨著改變。不過,文件描述詞之間並不共享close-on-exec旗標。

  返回值  當複製成功時,則返回最小及尚未使用的文件描述詞。若有錯誤則返回-1errno會存放錯誤代碼。錯誤代碼EBADF參數fd非有效的文件描述詞,或該文件已關閉。

  dup2(複製文件描述詞)

  相關函數  openclosefcntldup

  表頭文件  #include<unistd.h>

  定義函數  int dup2(int odlfd,int newfd);

  函數說明  dup2()用來複制參數oldfd所指的文件描述詞,並將它拷貝至參數newfd后一塊返回。若參數newfd為一已打開的文件描述詞,則newfd所指的文件會先被關閉。dup2()所複製的文件描述詞,與原來的文件描述詞共享各種文件狀態,詳情可參考dup()

  返回值  當複製成功時,則返回最小及尚未使用的文件描述詞。若有錯誤則返回-1errno會存放錯誤代碼。

  附加說明  dup2()相當於調用fcntl(oldfdF_DUPFDnewfd);請參考fcntl()

  錯誤代碼  EBADF 參數fd 非有效的文件描述詞,或該文件已關閉

  fcntl(文件描述詞操作)

  相關函數  openflock

  表頭文件  #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_APPENDO_NONBLOCKO_ASYNC位的改變,其他位的改變將不受影響。

  F_GETLK 取得文件鎖定的狀態。

  F_SETLK 設置文件鎖定的狀態。此時flcok 結構的l_type 值必須是F_RDLCKF_WRLCKF_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_SHLOCK_EX OR(|)組合。

  單一文件無法同時建立共享鎖定和互斥鎖定,而當使用dup()fork()時文件描述詞不會繼承此種鎖定。

  返回值  返回0表示成功,若有錯誤則返回-1,錯誤代碼存於errno

  fsync(將緩衝區數據寫回磁碟)

  相關函數  sync

  表頭文件  #include<unistd.h>

  定義函數  int fsync(int fd);

  函數說明  fsync()負責將參數fd所指的文件數據,由系統緩衝區寫回磁碟,以確保數據同步。

  返回值  成功則返回0,失敗返回-1errno為錯誤代碼。

  lseek(移動文件的讀寫位置)

  相關函數  dupopenfseek

  表頭文件  #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) 欲將讀寫位置移到文件開頭時:lseekint fildes,0,SEEK_SET);

  2) 欲將讀寫位置移到文件尾時:lseekint fildes0,SEEK_END);

  3) 想要取得目前文件位置時:lseekint fildes0,SEEK_CUR);

  返回值  當調用成功時則返回目前的讀寫位置,也就是距離文件開頭多少個位元組。若有錯誤則返回-1errno 會存放錯誤代碼。

  附加說明  Linux系統不允許lseek()對tty裝置作用,此項動作會令lseek()返回ESPIPE

  範例  參考本函數說明

  mkstemp(建立唯一的臨時文件)

  相關函數  mktemp

  表頭文件  #include<stdlib.h>

  定義函數  int mkstemp(char * template);

  函數說明  mkstemp()用來建立唯一的臨時文件。參數template 所指的文件名稱字元串中最後六個字元必須是XXXXXXMkstemp()會以可讀寫模式和0600 許可權來打開該文件,如果該文件不存在則會建立該文件。打開該文件后其文件描述詞會返回。文件順利打開后返回可讀寫的文件描述詞。若果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。

  錯誤代碼  EINVAL 參數template 字元串最後六個字元非XXXXXXEEXIST 無法建立臨時文件。

  附加說明  參數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(打開文件)

  相關函數  readwritefcntlcloselinkstatumaskunlinkfopen

  表頭文件  #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_CREATO_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_IREAD00400許可權,代表該文件所有者具有可讀取的許可權。

  S_IWUSR S_IWRITE00200 許可權,代表該文件所有者具有可寫入的許可權。

  S_IXUSR S_IEXEC00100 許可權,代表該文件所有者具有可執行的許可權。

  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_CREATO_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(由已打開的文件讀取數據)

  相關函數  readdirwritefcntlcloselseekreadlinkfread

  表頭文件  #include<unistd.h>

  定義函數  ssize_t read(int fd,void * buf ,size_t count);

  函數說明  read()會把參數fd 所指的文件傳送count個位元組到buf指針所指的內存中。若參數count0,則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(將數據寫入已打開的文件內)

  相關函數  openreadfcntlcloselseeksyncfsyncfwrite

  表頭文件  #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()。

 

 



[火星人 ] linux常用c函數 文件操作篇已經有574次圍觀

http://coctec.com/docs/program/show-post-71593.html