檔案描述符?檔案流指標?
檔案描述符、檔案流指標及重定向
- 前言
- 一、檔案描述符是什么?
- 二、檔案描述符和檔案流指標的關系
- 三、重定向
- 總結
前言
在C標準庫的I/O中我們提到檔案流指標,在系統呼叫i/O介面中提到了檔案描述符,這次來看看這兩個東西有什么區別
一、檔案描述符是什么?


由上圖可知,檔案描述符就是從0開始的小整數,當我們打開檔案時,作業系統在記憶體中要創建相應的資料結構來描述目標檔案,于是就有了file結構體,表示一個已經打開的檔案物件,而行程執行open系統呼叫,所以必須讓行程和檔案關聯起來,每個行程都有一個指標*files(在pcb中),然后這個指標指向打開檔案的指標!所以,本質上,檔案描述符就是該陣列的下標,所以,只要拿著檔案描述符,就可以找到對應的檔案,

我們嘗試列印一下這個檔案描述符的值;

然后我們再關閉1號描述符(stdout);

因為關閉了標準輸出stdout,1號位置空出來,fd便會占據1號位置,資料并非寫入到標準輸出流,而是寫入到當前“1”號描述符指向的my*file檔案的緩沖區,由于“換行重繪緩沖“只能在stdout有效所以不列印;
然后我們再手動重繪緩沖區,1就會被列印出來,
然后我們再關閉“0”或者“2”號描述符;

此時我們便可以得出一個重要的結論暨檔案描述符的分配規則:在files_struct陣列當中,找到當前沒有被使用的最小的一個下標,作為新的檔案描述符,
二、檔案描述符和檔案流指標的關系
檔案流指標:庫函式IO介面的操作句柄FILE *fp;
檔案描述符:系統呼叫IO介面的操作句柄 int fd,
庫函式與系統呼叫介面的關系:庫函式封裝了系統呼叫介面,
檔案流指標的標準輸入輸出和錯誤:stdin、stdout、stderr,
我們看一下原始碼:

stdin、stdout、stderr這三個都是struct _IO_FILE 型別的指標,

上圖中將結構體重定義為FILE,就是檔案流指標,

檔案流指標歸根究底就是個結構體,里面包含了一個成員變數,就是檔案描述符,相當于檔案流指標是對檔案描述符的一層封裝,
例如我們使用fopen時,實際上是把open回傳的fd賦給了在檔案流指標的結構體中封裝的_fileno,
三、重定向
代碼如下(示例):上面我們舉的關閉1號描述符的例子中,本來應該輸出到顯示幕上的內容,卻輸出到了我們指定的檔案中,其中fd = 1,這種現象就叫做“輸出重定向”,字面意思可以大概理解為把stdout用新的檔案替代了,
常見的重定向有:> (清空重定向);>>(追加重定向)
舉個栗子:

實質就是改變了資料流向,
重定向的原理:通過改變檔案描述符對應位置的檔案描述資訊,進而改變所操作的檔案,實作資料流向的改變,

dup2系統呼叫介面:

dup2(old fd, new fd);讓new fd成為old fd的復制版,
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//close(1);
int fd = open("./_file_test.txt",O_CREAT|O_RDWR|O_TRUNC,0664);
if(fd<0)
{
perror("open error");
return -1;
}
dup2(fd,1);//
printf("fd = %d\n",fd);//列印檔案描述符的值
fflush(stdout);
close(fd);
return 0;
}
1復制了fd的描述資訊,所以1也指向fd指向的檔案,也不會列印在顯示屏上,而是將資料寫入fd指的檔案中,
總結
檔案流指標是結構體,檔案描述符是陣列下標,重定向就是改變資料流向
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276631.html
標籤:python
上一篇:你真的了解陣列嗎?(交集差集并集補集在專案中的使用)
下一篇:可視化—三維圖的繪制
