重定向使用 dup2 系統呼叫
檔案描述符就是核心中struct file* fd_array
陣列的下標,程序可以通過這個下標找到檔案的描述資訊,進而操作檔案。
檔案描述符(0 & 1 & 2)
]而現在知道,檔案描述符就是從0開始的小整數。當我們開啟檔案時,作業系統在記憶體中要建立相應的資料結構來描述目標檔案。於是就有了file結構體。表示乙個已經開啟的檔案物件。而程序執行open系統呼叫,所以必須讓程序和檔案關聯起來。每個程序都有乙個指標*files, 指向一張表files_struct,該錶最重要的部分就是包涵乙個指標陣列,每個元素都是乙個指向開啟檔案的指標!所以,本質上,檔案描述符就是該陣列的下標。所以,只要拿著檔案描述符,就可以找到對應的檔案
檔案描述符的分配規則
最小未使用
**示例:
#include
#include
#include
#include
intmain()
printf
("fd: %d\n"
, fd)
;close
(fd)
;return0;
}
輸出發現是fd: 3
關閉0或者2,在看
#include
#include
#include
#include
intmain()
printf
("fd: %d\n"
, fd)
;close
(fd)
;return0;
}
發現是結果是:fd: 0 或者 fd: 2
檔案描述符的分配規則:在files_struct陣列當中,找到當前沒有被使用的最小的乙個下標,作為新的檔案描述符。注意:為什麼開啟乙個檔案,如果不操作了一定要關閉,釋放資源?
檔案描述符實際是有限的,若不關閉檔案,檔案描述符被用光了,就打不開新檔案了
printf列印資料到標準輸出,close(1),就是把標準輸出關閉了;開啟新的檔案後,printf並沒有把資料列印出來,而是在重新整理緩衝區之後,將資料寫入到了檔案中!
在寫入檔案的時候:
檔案流指標和檔案描述符的關係
檔案描述符:是乙個非負整數
檔案流指標:file結構體 - - typedef struct _io_file file
檔案流指標是庫函式io介面的操作控制代碼
檔案描述符是系統呼叫io介面的操作控制代碼
檔案流指標這個結構體中封裝了檔案描述符
通過檔案流指標進行最終檔案操作的時候,依然還要能夠找到檔案對應的檔案描述符才可以
檔案流指標是乙個結構體,結構體中有很多成員變數,其中就有乙個叫 _fileno (這是檔案描述符)
那如果關閉1呢?看**:
#include
#include
#include
#include
#include
intmain()
printf
("fd: %d\n"
, fd)
;fflush
(stdout);
close
(fd)
;exit(0);}
此時,我們發現,本來應該輸出到顯示器上的內容,輸出到了檔案myfile
當中,其中,fd=1
。這種現象叫做輸出重定向。
常見的輸出重定向
有:> (清空重定向);>> (追加重定向)
符號作用
命令 > 檔案
將標準輸出重定向到檔案中(清除原有檔案中的資料)
命令 >> 檔案
將標準輸出重定向到檔案中(在原有的內容後追加)
重定向的本質
針對檔案描述符所對應的檔案描述資訊的重定向:
int
dup2
(int oldfd,
int newfd)
;- 描述符重定向函式
第一行 >/dev/null , 2>&1 這兩個重定向交換位置的意義不同!
乙個程序如何從使用者態切換到核心態執行?
答案:系統呼叫介面,異常,中斷
6.在bash中,在一條命令後加入」1>&2」意味著
a 標準輸出重定向到標準錯誤輸出
b 標準輸入重定向到標準錯誤輸出
c 標準輸出重定向到標準輸入
d 標準錯誤輸出重定向到標準輸入
正確答案: a
答案解析:
0 ,1,2叫檔案描述符;linux中,每開啟乙個檔案都有乙個小的整數與之對應,就是檔案描述符!
0 是標準輸入的 (stdin)
1 是標準輸出的 (stdout)
2 是標準報錯輸出的 (stderr)
'『>』是輸出重定向符
看到這裡啦,動動小手留個贊吶!
linux 檔案描述符和inode 的理解和區別
inode 或i節點是指對檔案的索引。如乙個系統,所有檔案是放在磁碟或flash上,就要編個目錄來說明每個檔案在什麼地方,有什麼屬性,及大小等。就像書本的目錄一樣,便於查詢和管理。這目錄是作業系統需要的,用來找檔案或叫管理檔案。許多作業系統都用到這個概念,如linux,某些嵌入式檔案系統等。當然,對...
linux檔案描述符
本文介紹了檔案描述符,1 首先說什麼是檔案描述符,它有什麼作用?檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案,並指定訪問該檔案的方式,呼叫成功後返回乙個檔案描述符。creat 開啟乙個檔案,如果該檔案不存在,則建立它...
linux檔案描述符
當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是乙個低階的正整數。最前面的三個檔案描述符 0,1,2 分別與標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 對應。因此,函式 scanf 使用 stdin,而函式 pri...