open和close函式

你笑一笑嘛發表於2020-10-25

open函式:開啟或建立檔案

系統呼叫open可以用來開啟普通檔案、塊裝置檔案、字元裝置檔案、連結檔案和管道檔案,但只能用來建立普通檔案,建立特殊檔案需要使用特定的函式。

標頭檔案:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函式原型:

int open(const char *pathname,int flages);
int open(const char *pathname,int flages,mode_t mode);

pathname:需要開啟或想要建立的含路徑的檔名。
flags:檔案狀態標誌位,表示開啟檔案的方式。
mode:如果檔案被新建立,指定該許可權為mode(八進位制表示法);
返回值:
0:標準輸出
1:標準輸入
2:標準出錯
我們得到的檔案描述符都是從3開始的,檔案描述符又稱檔案ID,每個檔案的檔案描述符都是唯一的。
返回值小於零時,表示建立或開啟檔案失敗。

flages引數
flages引數可以用來說明open函式的多個選擇,引數值可以分兩類:一類是主標誌,一類是副標誌。
1)主標誌是互斥的,使用了其中一種則不能再使用另外一種。
主標誌如下:

O_RDONLY:以只讀方式開啟
O_WRONLY:以只寫方式開啟
O_RDWR:以可讀可寫方式開啟

2)副標誌可同時使用多個,使用時在主標誌和副標誌直接加入按位與(|)運算子
副標誌如下:

O_CREAT建立一個檔案,檔案存在時 ,也能成功。如果檔案不存在時,才需要用到第三個引數mode,以說明新檔案的存取許可權
O_EXCL如果O_CREAT也被設定,此命令會檢查檔案是否存在。若檔案不存在,則建立該檔案;若檔案存在則導致開啟檔案出錯,返回檔案描述符-1
O_TRUNC開啟檔案(將檔案裡的內容清空)
O_APPEND追加方式開啟檔案(不會把檔案當中已經存在的內容刪除)

close()函式:

關閉一個檔案,將檔案描述符還給Linux系統。通過close函式關閉檔案並釋放相應的資源,防止核心為繼續維護它而付出代價。
標頭檔案

#include <unistd.h>

檔案原型

int close(int fd);

引數
fd:即將要關閉的檔案描述符。
返回值
0:成功 -1:失敗

利用open函式實現touch命令:

程式如下:
O_CREAT:建立一個檔案,檔案存在時 ,也能成功
若 O_CREAT|O_EXCEL,檔案存在時建立檔案,返回的檔案描述符為-1,建立失敗

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])//
{
        int fd;
        fd = open(arge[1],O_CREAT|O_EXCL | O_RDWR,0777);
        if(fd < 0){
                printf("creat file %s failure\n",arge[1]);
                return -1;
        }

        printf("creat file %s is sucess, fd = %d\n",arge[1],fd);
        close(fd);
        return 0;
}

在這裡插入圖片描述
umask 掩碼
open函式建立檔案的許可權=mode &(~umask)

O_RDWR :檔案的許可權為可讀可寫

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])//傳參
{
        int fd;
        fd = open(arge[1],O_CREAT | O_RDWR,0777);//與掩碼0022異或,所以其許可權為755
        if(fd < 0){
                printf("creat file %s failure\n",arge[1]);
                return -1;
        }

        printf("creat file %s is sucess, fd = %d\n",arge[1],fd);
        close(fd);
        return 0;
}

在這裡插入圖片描述
O_APPEND:追加方式開啟檔案(不會把檔案當中已經存在的內容刪除)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])
{
        int fd;
        fd = open("./a.c",O_APPEND | O_RDWR);
        if(fd < 0){
                printf("open file %s failure\n",arge[1]);
                return -1;
        }

        printf("open file %s is sucess, fd = %d\n",arge[1],fd);
        close(fd);
        return 0;
}

在這裡插入圖片描述
O_TRUNC 開啟檔案(會把已經存在的內容刪除)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])
{
        int fd;
        fd = open("./a.c",O_TRUNC | O_RDWR);
        if(fd < 0){
                printf("open file %s failure\n",arge[1]);
                return -1;
        }

        printf("open file %s is sucess, fd = %d\n",arge[1],fd);
        close(fd);
        return 0;
}

在這裡插入圖片描述

相關文章