【Linux】基礎IO(上)!!!

doctor_xiong發表於2018-01-14

回憶C語言IO:

在C語言裡面,對檔案的操作主要是通過fopen()和fclose()函式進行的, FILE* fopen(char*filename,char*type); 其中type表示的是需要對檔案的操作型別。
int fclose(char*filename);在C語言裡面對檔案進行IO操作的時候C語言會預設開啟三個輸入輸出流,分別是stdin,stdout,stderr,三個輸入輸出流返回型別都是FILE*。

系統檔案IO:
操作檔案,除了上面的C語言介面,我們還可以採用系統介面來進行檔案訪問
這裡寫圖片描述
open() 若函式執行成功返回一個新的檔案描述符(一個非負的小整數),若執行失敗機會返回-1。
filename:需要開啟或建立的目標檔案。
flags:開啟檔案是的檔案引數。
flag:是用來表明檔案的操作方式,主要有以下幾種:
O_RDONLY:檔案只讀開啟
O_WRONLY:檔案只寫開啟
O_RDWR:檔案讀寫開啟
O_CREAT:若檔案不存在,將建立一個新檔案,新檔案的所有者將會被設定為當前使用者
O_EXCR:必須和O_CREAT一起使用,當檔案存在的時候報錯,不存在的時候建立。
O_TRUNC:如果一個檔案是普通檔案,開啟模式是可寫,會將檔案長度置0,丟棄現有的內容。
O_APPEND:檔案追加模式。在寫之前將檔案的讀寫指標置在我檔案的末尾,新的檔案將寫到檔案的末尾。

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

int main()
{
    int fp = open("hehe.txt",O_WRONLY|O_CREAT,0644);
    if(fp < 0)
    printf("open()");
    else
        printf("ok\n");
    close(fp);
    return 0;
}

結果:
這裡寫圖片描述

檔案的寫操作:

ssize_t write(int fd, const void *buf, size_t count); 

其中fd——–>目前不知道,後面補充
buf——->緩衝區首地址
len——–>期望寫入的位元組數
當write函式執行成功之後會返回成功被寫入位元組的個數。

舉個栗子:

int main()
{
    int fp = open("hehe.txt",O_WRONLY|O_CREAT,0644);
    if(fp < 0)
    printf("open()");
    else
        printf("ok\n");
    char *buf = "hello word!";
    int r =  write(fp, buf, strlen(buf));
    if(r == -1)
        exit(1);
    else
        printf("ok\n");
    close(fp);
    return 0;
}

結果:
這裡寫圖片描述
這裡寫圖片描述

讀取檔案:

ssize_t read(int fd, void *buf, size_t count);

fd——->以後補充
buf——>緩衝區首地址
count——>期望一次讀出檔案的字元數
read() 函式呼叫成功返回值為成功讀取檔案的字元數,若失敗則返回-1。

舉個栗子:


int main()
{
    char buf[15];
    int fd = open("hehe.txt",O_RDONLY,0644);
    read(fd,buf,10);
    printf("%s\n",buf);
}

檔案描述符:
在上面提到的fd就是檔案提示符,檔案提示符就是小整數,linux程式在預設情況下會有三個檔案描述符,0 、1、2,分別是標準輸入、標準輸出和標準錯誤。
檔案描述符的理解:在系統開啟檔案的時候就會需要相應的結構體來描述相關的檔案,於是就有了在每個程式裡面都會含有一個files*,這個files*指向一個file_struct,file_struct其實是一個表,這個表包含一個指標陣列,每個指標陣列的指標都指向一個開啟的檔案的指標,這個檔案描述符就是這個檔案指標的下標,所以當我們可以拿到這個檔案描述符的時候就可以間接的找到系統開啟檔案的位置。
如圖:

這裡寫圖片描述

檔案描述符的分配規則:
在系統分配檔案描述符的時候,總是在上面提到的指標陣列裡面找到未被使用的最小的下標,作為當前檔案的檔案描述符。

舉個栗子:

int main()
{
    //close(1);
    int fd = open("hehe.txt",O_RDONLY|O_CREAT ,0644); 
    int fp = open("haha.txt",O_RDONLY|O_CREAT,0644);
    int ft;
    printf("%d\n",fd);
    close(fd);
    ft = open("csdn.txt",O_RDONLY|O_CREAT,0644);
    printf("%d\n",ft);
    return 0;
}

案例:
當我們close(1) 時候,在開啟一個檔案,比如open("myfile",O_REONLY|O_CREAT, 0644);的時候就會發現,本應該輸出到標準輸出的資料被輸出到了myfile裡面,因為在linux系統裡面檔案表示符1代表著標準輸出,但是我們將檔案識別符號1關閉之後,新開啟的檔案就會佔用1號檔案表示符,這時候當我們想輸出的時候就會將檔案內容輸出到myfile裡面了。

舉個栗子:


int main()
{
    close(1);
    int fd = open("hehe.txt",O_RDONLY|O_CREAT ,0644); 
    printf("hehe\n");
    close(fd);
    return 0;
}

相關文章