博客 / 詳情

返回

基礎IO

打開文件(open函數)

  • 任何一個進程在運行時都會默認打開三個文件

    • 標準輸入stdin(鍵盤)
    • 標準輸出stdout(顯示器)
    • 標準錯誤stderr(顯示器)

open函數原型

  • pathname :要打開的文件路徑。
  • mode :指定要用什麼權限打開文件。
  • 返回值 :打開失敗則返回 -1,打開成功則返回一個文件描述符。
int open(const char *pathname, int flags);   //用於打開已經存在的文件
int open(const char *pathname, int flags, mode_t mode);  //用於打開不存在的文件

文件權限mode

  • 創建文件時,mode用於設定新文件的權限。

    • 該權限是以權限編碼值來設定的(例如設置為 0666 )
    • 該權限受權限掩碼umask的限制。

    image.png

flags屬性詳解

  • 打開文件的方式:

    • O_RDONLY :表示以只讀方式打開。
    • O_WRONLY :表示以只寫方式打開。
    • O_RDWR :表示以可讀可寫方式打開。
  • 寫入數據的方式:

    • O_APPEND :寫入數據時,以在末尾追加的方式寫入。
    • O_TRUNC :寫入數據時,以覆蓋的方式寫入(即先刪除原數據,再寫入)
    • 如果同時使用 :O_TRUNC起作用
    • 同時不使用 :原文件內容不變(不讀不寫)
  • 打開不存在的文件時:

    • O_CREAT :打開不存在的文件時,會在當前路徑自動創建這個文件,如果文件存在,則會先刪除這個文件再創建文件。
    • 所謂當前路徑是指進程啓動時所處的路徑,而不是程序文件所存在的路徑。

    讀文件(read)

    函數原型

  • fd :文件描述符
  • buf :存放讀取的數據
  • count:期望讀取的字節數
  • 返回值是實際讀取的字節數。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

寫文件(write)

函數原型

  • fd :文件描述符
  • buf :需要寫入的內容
  • count:期望寫入的字節數
  • 返回值是實際寫入的字節數。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

image.png

C語言中的fopen、fwrite、fread

  • c語言中的文件函數fopen等,其底層都是調用系統的open函數等。
  • 並且 fopen 等返回值為文件指針, open 返回值是文件描述符(int類型)
  • 這樣實現一種語言上的封裝,實現跨平台性。

文件描述符

  • 在系統中任何時刻都存在大量的已經打開的文件。
  • 磁盤文件中存儲的不只是文件內容,還包括文件屬性
  • 內存文件中存儲的更多是文件屬性,文件內容是緩慢的從硬盤文件中加載的。
  • 系統分配文件描述符的方法:

    • 當前已經使用的文件描述符不會再次被分配,新分配的文件描述符的值是系統中未被分配的文件描述符的值中最小的一個。

文件描述符的意義

  • 每個進程中都存在一個進程控制塊PCB
  • 這個PCB的結構體task_struct中存在一個文件結構體 files_struct
  • 這個文件結構體中存在一個用來存在文件指針的數組 struct file* fd_array [ ]
  • 運行進程,打開文件後,就會將文件的指針存放在這個數組中
  • 所謂的文件描述符則是對應文件在數組中的下標。
  • 因為進程的獨立性,在這個進程中將文件關閉,對其他進程沒有影響。
    image.png

複製文件描述符

dup函數介紹

  • 調用dup函數對文件描述符fd1進行復制,會返回一個新的文件描述符(注意:這個新的文件描述符fd2 在數值上不等於 fd1,但是它們都指向同一個文件)
  • 使用dup複製時,這個新的文件描述符 fd2 的值是無法自己指定的,是由操作系統內部分配的。
#include <unistd.h>
int dup(int oldfd);
//fd2 = dup(fd1);

dup2函數介紹

  • 使用dup2 複製時,這個新的文件描述符的值是可以自己指定的。
  • fd1 是原來的文件描述符的值,16 是人為指定新的文件描述符。
  • 如果正確,返回值fd2 就是16,如果錯誤,返回值fd2 就是 -1。
#include <unistd.h>
int dup2(int oldfd, int newfd);
//fd2 = dup2(fd1, 16);

命令行中的重定向( > )

  • Linux中的shell命令執行後,打印結果都是默認進入標準輸出的(因為這些命令都是調用printf打印的),所以我們可以直接在Linux終端看到命令執行的結果。
  • 命令行中的重定向 > 的作用:

    • 將命令行中命令執行的結果指定輸出到某一個文件中。
    • 例如:將ls命令的輸出結果重定向到 1.txt 文件中去(注意是在終端命令行中輸入下列命令)
    ls > 1.txt
  • 重定位命令 > 的原理就是利用close + dup

    • open打開文件 1.txt ,然後 close 關閉 stdout(標準輸出),因為標準輸出的文件描述符的值是1,然後利用dup2 將文件描述符1 和 1.txt文件關聯起來。
user avatar huorongsecurity 頭像 guaguokedeluobo_dkxrgk 頭像 veronicaaa 頭像 4znq03yt 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.