1. 程式人生 > >Linux C程式設計學習筆記(2):open、creat、close函式及檔案的建立、開啟與關閉

Linux C程式設計學習筆記(2):open、creat、close函式及檔案的建立、開啟與關閉

my_create.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>  //根據errno值的不同來確定具體的錯誤型別

int main()
{
    int fd;

    if((fd=open("example_1.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1
) //if(creat("example_1.c",S_IRWXU)==-1) { perror("open"); //printf("open:%s with errno:%d\n",strerror(errno),errno); //從錯誤程式碼獲取相應的錯誤描述 exit(1); } else { printf("create file success\n"); } close(fd); return
0; }

編譯該程式,發現程式碼沒有錯誤。
執行兩次。
這裡寫圖片描述
第一次執行成功建立檔案example_1.c,許可權為所有者可讀可寫。
這裡寫圖片描述
第二次執行表示檔案已存在。這是因為在呼叫open時,同時設定了O_CREAT和O_EXCL標誌,則當檔案存在時,open呼叫失敗,系統將錯誤程式碼設定成EEXIST,表示檔案已存在。

如果把“perror(“open”);”註釋掉,把下一行取消註釋,重新編譯並執行程式:
這裡寫圖片描述
這種方法可以得到錯誤描述。

如果把open註釋掉,把creat取消註釋,則第二次執行不會報錯。這是因為creat,對於存在的檔案它用新檔案將其覆蓋。
這裡寫圖片描述

open函式

1.原型

  #include<fcntl.h>
  int open(const char *pathname, int flags); 
  int open(const char *pathname, int flags, mode_t mode);

2.功能

  開啟或建立一個檔案。對於open函式,僅當建立檔案時,才用到第三個引數。

3.引數

  ① pathname:開啟或建立的檔名
  ② flags:用下列一個或多個常量進行“或”運算構成flags引數(這些常量定義在fcntl.h中)
     O_RDONLY   只讀開啟
     O_WRONLY   只寫開啟
     O_RDWR    讀寫開啟
   以上三個常量只能選一個,下面的則可以多選:
     O_CREAT  若此檔案不存在,則建立它。使用此選項時,需要第三個引數mode,用其指定新檔案的訪問許可權。
     O_EXCL  如果同時制定了O_CREAT,而檔案已經存在,則會報錯。因此可以測試一個檔案是否存在,如果不存在,則建立此檔案,這使測試和建立兩者成為一個原子操作。
     O_TRUNC  如果此檔案存在,而且以可寫方式開啟,則將檔案長度清為0。即原文儲存資料丟失,但屬性不變
     O_APPEND  每次寫時都追加到檔案的尾端。
   等等….
  ③ mode:用下列一個或多個常量進行“或”運算構成mode引數(這些常量定義在sys/stat.h)
     S_IRWXU:00700  檔案所有者讀寫執行許可權
     S_IRUSR: 00400  檔案所有者讀許可權
     S_IWUSR:00200  檔案所有者寫許可權
     S_IXUSR: 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  其他使用者執行許可權

creat函式

1.原型

  #include<fcntl.h>
  int creat(const char *pathname, mode_t  mode);

2.功能

  建立一個新檔案。creat函式等效於:

  open(pathname,O_WRONLY | O_CREAT | O_TRUNC, mode)**

  注意:creat只能以只寫方式開啟,不能讀,讀出的將是亂碼!

3.引數

  ① pathname:建立的檔名
  ② mode:與open的mode相同

close函式

1.原型

  #include <unistd.h>
  int close(int fd);    

2.功能

  關閉一個已經開啟的檔案。

3.引數

  表示需要關閉的檔案描述符。該描述符由open或creat函式得到。

perror函式

1.原型

  perror (const char *s);

2.功能:  

  將 上 一 個 函 數 發 生 錯 誤 的 原 因 輸 出 到 標 準 裝置(stderr)。引數 s 所指的字串會先打印出,後面再加上錯誤原因字串。此錯誤原因依照變數errno 的值來決定要輸出的字串。
  在庫函式中有個errno變數,每個errno值對應著以字串表示的錯誤型別。當你呼叫“某些”函數出錯時,該函式已經重新設定了errno的值。perror函式只是將你輸入的一些資訊和現在的errno所對應的錯誤一起輸出。
  如果想看到errno的值,則將

perror("open");

  替換為:

printf("open:%s with errno:%d\n",strerror(errno),errno);  

strerror函式

功能

  把error對應的描述符轉化為對應的字串。
  例如error值為17,則 strerror(error)返回17這個描述符對應的字串。

標頭檔案:string.h