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這個描述符對應的字串。