文件底層的深入理解之文件輸入輸出重定向

目錄

一、文件fd的分配規則

二、對輸出重定向現象的理解

三、輸出輸入重定向的簡單實現

1、輸出重定向

?2、輸入重定向


一、文件fd的分配規則

最小的沒有被使用的數組下標,會被分配給最新打開的文件。

二、對輸出重定向現象的理解

?????????正如上面這段代碼所示,printf打印的內容并沒有向顯示器上打,而是輸出到了log1.txt文件里面,這又是為什么呢?原因就是在該進程的文件描述符表中,原來的下標1位置存的是顯示器文件的地址,你使用系統調用接口close(1),相當于把1位置的內容清空了,也就是1位置不再存儲顯示器文件的地址,后來你又打開了log1.txt文件,操作系統檢測到你這個進程的文件描述符表中最小的沒有被使用的數組下標為1,所以就把log1.txt文件的地址填入了1位置,這是在操作系統層面上做的工作。而在上層的語言層面上,stdout這個文件的文件描述符仍然為1,而且printf函數只認stdout這個文件,只會往stdout這個文件進行寫入,stdout文件通過它的文件描述符在底層的文件描述符表中進行查找的時候找到1位置,而此時1位置所存放的地址已經悄悄地被改成了log1.txt文件的地址,所以printf函數的內容自然就寫到了log1.txt文件中了。這就是輸出重定向。下面是圖解:

?????????但上面這一段代碼有一個小細節需要注意,就是你在進程結束之前不能關閉該文件。如果在進程結束之前關閉該文件,語言層面的緩沖區的內容還來不及刷新到文件中文件描述符中1位置的地址就被清空了,最后進程退出要刷新緩沖區的內容時會因為找不到文件的地址而寫不到文件當中。正如下面代碼和結果所示:

三、輸出輸入重定向的簡單實現

????????命令行解析>符號的時候,把>符號解析成重定向,然后在底層完成重定向的工作,變相地向文件中進行寫入。下面我用dup2()這個系統調用接口實現一下輸出重定向和輸入重定向。?????????dup2()這個接口是指在文件描述符中將newfd位置的地址改成oldfd位置的地址,具體實現如下所示:

1、輸出重定向

????????fd位置的文件地址覆蓋了原本1位置上的文件地址,結果就將本來應該打印到屏幕上的一串hhh字符最終輸入到了指定文件當中。

?2、輸入重定向

????????fd位置的文件地址覆蓋了原本0位置上的文件地址,本來應該從鍵盤中讀到的內容最終從文件中讀到了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718075.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現日本某地發生了一件謀殺案

題目 猜兇手 題目內容: 日本某地發生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個。 以下為4個嫌疑犯的供詞: A說:不是我。 B說:是C。 C說:是D。 D說:C在胡說 已知3個人說了真話&…

從零開始學習Netty - 學習筆記 -Netty入門【半包,黏包】

Netty進階 1.黏包半包 1.1.黏包 服務端代碼 public class HelloWorldServer {private static final Logger logger LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventL…

Ubuntu上Jenkins自動化部署Gitee上VUE項目

文章目錄 1.安裝NodeJS插件2.配置全局工具配置-NodeJS環境變量3.新建自由風格的軟件項目任務4.配置General配置丟棄舊的構建配置參數化構建過程 5.配置源碼管理6.構建觸發器7.設置構建環境8.配置構建步驟9.配置構建后操作10測試構建 前文鏈接: Ubuntu上Jenkins自動…

java常用應用程序編程接口(API)——Instant,DateTimeFormatter,Period,Duration概述

前言: 整理下學習心得。打好基礎,daydayup! Instant Instant是時間線上的某個時刻/時間戳,通過獲取Instant的對象可以拿到此刻的時間,該時間由兩部分組成:1,從1970年1月1日00:00:00開始走到此刻…

前端開發 VSCode 插件推薦

1、Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code VS Code 的中文(簡體)語言包,此中文(簡體)語言包為 VS Code 提供本地化界面。 下載地址:Chinese (Simplified) (簡體中文) La…

D*算法超詳解 (D星算法 / Dynamic A*算法/ Dstar算法)(死循環解決--跟其他資料不一樣奧)

所需先驗知識(沒有先驗知識可能會有大礙,了解的話會對D*的理解有幫助):A*算法/ Dijkstra算法 何為D*算法 Dijkstra算法是無啟發的尋找圖中兩節點的最短連接路徑的算法,A*算法則是在Dijkstra算法的基礎上加入了啟發函數…

[JavaWeb玩耍日記]HTML+CSS+JS快速使用

目錄 一.標簽 二.指定css 三.css選擇器 四.超鏈接 五.視頻與排版 六.布局測試 七.布局居中 八.表格 九.表單 十.表單項 十一.JS引入與輸出 十二.JS變量,循環,函數 十三.Array與字符串方法 十四.自定義對象與JSON 十五.BOM對象 十六.獲取…

Network LSA 結構簡述

Network LSA主要用于描述一個區域內的網絡拓撲結構,包括網絡中的路由器和連接到這些路由器的網絡。它記錄了每個路由器的鄰居關系、連接狀態以及連接的度量值(如帶寬、延遲等),以便計算最短路徑和構建路由表。display ospf lsdb n…

網關kong記錄接口處理請求和響應插件 tcp-log-with-body的安裝

tcp-log-with-body 介紹 Kong的tcp-log-with-body插件是一個高效的工具,它能夠轉發Kong處理的請求和響應。這個插件非常適用于需要詳細記錄API請求和響應信息的情景,尤其是在調試和排查問題時。 軟件環境說明 kong version 2.1.4 - 2.8.3 [可用親測]C…

二、數據結構——單鏈表,雙鏈表,棧,隊列,單調棧,單調隊列,KMP,Trie,并查集,堆,哈希表等內容。

對于鏈表來說,由于new操作時間太長,因此,算法題中一般使用靜態鏈表。 1.單鏈表 采用數組實現單鏈表,可以直接開兩個數據,一個數組存放數值,另外一個數據存放下一個元素(指針)。 示…

JavaScript“基本語法”筆記(自學第一天)!

一、JavaScript的用途和應用領域 JavaScript的應用領域非常廣泛,主要包括以下幾個方面: 網頁交互性: JavaScript最初是為了增強網頁的交互性而開發的,它可以控制網頁的行為、樣式和內容,使用戶能夠與網頁進行實時交互&#xff0c…

一個教材上的CMS網站源碼在Linux服務器上登錄時驗證碼正常,但在windows下不能正常顯示

一個教材上的CMS網站源碼在Linux服務器上登錄時驗證碼正常,但在windows下不能正常顯示。 在linux服務器上能正常顯示。顯示界面如下所示:

蜻蜓FM語音下載(mediadown)

一、介紹 蜻蜓FM語音下載(mediadown),能夠幫助你下載蜻蜓FM音頻節目。如果你是蜻蜓FM會員,它還能幫你下載會員節目。 二、下載地址 本站下載:蜻蜓FM語音下載(mediadown) 百度網盤下載&#…

Web 應用防火墻(WAF):功能、應用場景和未來發展方向

Web 應用防火墻(WAF)是一種用于保護 Web 應用程序免受各種網絡攻擊的安全工具。WAF 可以檢測并阻止對 Web 應用程序的惡意攻擊,如SQL 注入、跨站腳本(XSS)和跨站請求偽造(CSRF)等。它通過檢查 H…

【Redis 主從復制】

文章目錄 1 :peach:環境配置:peach:1.1 :apple:三種配置方式:apple:1.2 :apple:驗證:apple:1.3 :apple:斷開復制和切主:apple:1.4 :apple:安全性:apple:1.5 :apple:只讀:apple:1.6 :apple:傳輸延遲:apple: 2 :peach:拓撲結構:peach:2.1 :apple:?主?從結構:apple:2.2 :apple:?…

【MetaGPT】配置教程

MetaGPT配置教程(使用智譜AI的GLM-4) 文章目錄 MetaGPT配置教程(使用智譜AI的GLM-4)零、為什么要學MetaGPT一、配置環境二、克隆代碼倉庫三、設置智譜AI配置四、 示例demo(狼羊對決)五、參考鏈接 零、為什么…

大數據技術(一)

大數據技術概述 大數據技術層面及其功能 數據采集與預處理 利用ETL(extract-transform-load)工具將分布的、異構數據源中的數據,如關系數據、平面數據文件等,抽取到臨時中間層后進行清洗、轉換、集成,最后加載到數據倉庫或數據集市中&…

C語言什么是循環嵌套?

一、問題 分?結構是可以進?嵌套的,循環結構同樣也?持嵌套,那什么是循環嵌套呢? 二、解答 ?個循環體內?包含另?個完整的循環結構,就稱之為循環嵌套。內嵌的循環中還可以嵌套循環,這就是多層循環,也叫…

類與對象詳解 C++ (1)

1.struct和class 與C語言不同的是,C中struct和class可以定義成員變量和成員函數。更偏好用class。 2.類的定義 格式如下: class 為 定義類的 關鍵字, ClassName 為類的名字, {} 中為類的主體,注意 類定義結束時后面…

前端canvas項目實戰——簡歷制作網站(五):右側屬性欄(字體、字號、行間距)

目錄 前言一、效果展示二、實現步驟1. 優化代碼,提取常量2. 實現3個編輯模塊3. 實現updateFontProperty方法4. 一個常見的用法:僅更新當前選中文字的樣式 三、Show u the code后記 前言 上一篇博文中,我們擴充了線條對象(fabric.…