linux文件基礎-1_文件讀寫_open的flag

一、文件操作的基礎

1、操作系統提供的相關API

1).API函數由linux系統提供,由應用層程序調用,來實現各種功能
2).linux中常用的文件IO接口
open close write read lseek

3).對文件操作的一般步驟
(1)open打開文件得到文件描述符、並檢查返回值
(2)對文件進行讀寫操作(其他的操作)
(3)最後close關閉文件

2、對文件操作的內存情況

1)文件存在與塊設備中、靜態文件
2)open文件時內核的操作:
(1)進程先建立文件的數據結構,然後再去申請一段內存,將塊設備中的靜態文件讀到內存中(動態文件)
(2)我們對文件的讀寫操作,是針對這動態文件的操作。與靜態文件並不同步。
(3)close關閉文件時,內存中的動態文件去更新塊設備中的靜態文件。
(4)這麼設計的原因:①塊設備的限制、②內存可以按字節訪問,隨機操作

3、文件描述符

1)文件描述符(file descriptor):區分一個程序/進程打開的多個文件
2)文件描述符就是個數字,合法範圍爲0或者一個正整數,不能是一個負數。這個數字與打開這個文件時的數據結構掛鉤,操作動態文件就是通過這個數字來區分。
3)文件描述符的作用域:當前進程
4)對文件的所有操作都是通過這個文件描述fd。

4、實時查man手冊

1)查詢linux shell : man 1 xx
2)查詢API:man 2 xx
3)查詢庫函數: man 3 xx

5、文件讀寫

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int fd = -1,ret = -1;        // fd 就是file descriptor,文件描述符
    char buf[100] = {0};
    char writebuf[20] = "l love linux";
    
    // 第一步:打開文件
    fd = open("a.txt", O_RDWR);  
    if (-1 == fd)       //(fd < 0)
    {
        printf("文件打開錯誤\n");
    }
    else
    {
        printf("文件打開成功,fd = %d.\n", fd);
    }
    
    // 第二步:讀寫文件
    ret = write(fd, writebuf, strlen(writebuf));
    if (ret < 0)
    {
        printf("write失敗.\n");
    }
    else
    {
        printf("write成功,寫入了%d個字符\n", ret);
    }
/*  
    // 讀文件
    ret = read(fd, buf, 5);
    if (ret < 0)
    {
        printf("read失敗\n");
    }
    else
    {
        printf("實際讀取了%d字節.\n", ret);
        printf("文件內容是:[%s].\n", buf);
    }
*/  
    // 關閉文件
    close(fd);
    return 0;
}

二、open函數等的flag

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

1、讀寫權限

O_RDONLY :只讀方式
O_WRONLY :只寫方式
O_RDWR :讀寫方式
附帶權限後只能按照這種權限去操作。

2、打開存在並有內容的文件

O_APPEND: 接續
O_TRUNC: 截斷

當我們打開一個已經存在並且內部有內容的文件時會怎麼樣?

1)只有O_TRUNC:本來是有內容的,則內容會被丟棄
2)只有O_APPEND:本來是有內容的,則新寫入的內容會接續到原來內容的後面
3)默認不使用O_APPENDO_TRUNC:不讀不寫的時候,原來的文件中的內容保持不變
4)O_APPENDO_TRUNC同時出現:O_TRUNCO_APPEND給屏蔽了,即本來是有內容的,則內容會被丟棄

3、打開不存在的文件

O_CREAT: 爲了應對這種打開一個並不存在的文件,我們去創建它。
O_EXCL: 與O_CREAT結合使用,則沒有文件時創建文件,有這個文件時會報錯提醒我們。
1)open使用O_CREAT打開存在的文件,則原來存在的文件會被刪除。(類似先刪除,再創建新的)

2)mode

當我們使用O_CREAT標誌時候,可以使用第三個參數mode開指定創建的權限。
例如創建一個可讀可寫不可執行的文件:open("a.txt", O_RDWR | O_CREAT | O_EXCL, 0666);

4、O_NONBLOCK(非阻塞)

1)阻塞:一個函數是阻塞的,被調用時,當前進程可能被卡住(函數內部等待的條件沒有達到,需要等待條件),不能立刻返回。結果有保障,時間沒保障
2)非阻塞:調用這個函數,一定能立刻返回,但是函數的任務不一定完成。時間有保障,結果沒保障
3)操作系統給的一些API很多是被設計成阻塞式的ope就是,所以我們希望以非阻塞式打開就需要加O_NONBLOCK的標誌。

4)阻塞與非阻塞只用於設備文件,不適用於普通文件。

5、write的同步

O_SYNC(synchronize:同步)
1)沒有O_SYNC這個標誌:write只將內容寫到底層緩衝區即可返回,然後在合適的時間啊in將buf同步到硬盤。這種設計爲了提高硬件的操作和性能。
2)有O_SYNC:當我們希望硬件不等待時,直接寫入硬盤中。

open腦圖

注:筆記整理,參考於朱有鵬老師的嵌入式核心課程

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