国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

做網(wǎng)站需要多少固定帶寬seo人才網(wǎng)

做網(wǎng)站需要多少固定帶寬,seo人才網(wǎng),如何做網(wǎng)站的后臺,凡科網(wǎng)站做商城前言:本篇講解linux下的重定向相關(guān)內(nèi)容。 在本篇中, 博主將會帶著友友們一邊實驗, 一邊探索底層原理。 通過本篇的學(xué)習(xí), 友友們將會了解到重定向是如何實現(xiàn)的, 重定向的本質(zhì)是什么, 重定向和進程替換之間的…

? ? ? ? 前言:本篇講解linux下的重定向相關(guān)內(nèi)容。 在本篇中, 博主將會帶著友友們一邊實驗, 一邊探索底層原理。 通過本篇的學(xué)習(xí), 友友們將會了解到重定向是如何實現(xiàn)的, 重定向的本質(zhì)是什么, 重定向和進程替換之間的關(guān)系等等, 本篇內(nèi)容將會豐富我們對于進程的理解。

? ? ? ? ps:由于本節(jié)內(nèi)容涉及到文件fd,所以本節(jié)內(nèi)容適合了解文件fd的友友們進行觀看。?

目錄

文件描述符的分配規(guī)則

重定向的本質(zhì)

dup

dup2的使用——輸出重定向

?dup2的使用——輸入重定向

自定義shell實現(xiàn)重定向指令

文件的重定向和進程替換

重定向的參數(shù)

如何理解計算機下“一切皆文件”


文件描述符的分配規(guī)則

? ? ? ? 想要知道文件描述符的分配規(guī)則, 我們需要使用一個實驗來測試出來。 下面我們開始進行這個實驗:

? ? ? ? 在這個實驗中, 我們會用到wrrite, open函數(shù), 如下圖為man手冊:

? ? ? ? 其中, open函數(shù)需要包含頭文件sys/types.h、sys/stat.h、fcntl.h

? ? ? ? write函數(shù)需要包含unistd.h頭文件????????

? ? ? ? 然后, 我們的代碼如下:

需要用到的頭文件:

下面是我們的代碼:

這個程序運行后, 就是如下結(jié)果:

圖中打印fd, 然后將hello linux的內(nèi)容打印到log.txt文件中, 再輸出log.txt的內(nèi)容, 就如同上圖

????????上圖的fd打印為3, 我們知道, 0, 1, 2對應(yīng)的是stdin, stdout, stderr。所以新文件fd就到了3號fd。

????????接下來, 就開始測試文件描述符的分配規(guī)則。

????????從0號小標開始, 尋找最小的沒有使用的數(shù)組位置,它的下標就是新文件的文件描述符。

? ? ? ? 我們從上圖可以看出, 文件描述符是3。 而0, 1, 2都被占用了。 我們就可以考慮——對于文件來說, 文件描述符都是從小到大創(chuàng)建的。?

? ? ? ? 那么我們?yōu)榱蓑炞C這個猜想, 就可以消除0號下標的指向。 那么0號就空出來了。 這個時候我們再創(chuàng)建的文件就是被映射在了0號下標處。

下面是測試代碼:

然后打印出來的fd如下:

上面的結(jié)果就是說, 消除了0號fd位置的指針, 當我們再打開一個文件的時候就可以將這個文件指針放入0號位置。?

我們再關(guān)閉1號fd進行測試:

然后運行結(jié)果:

?

沒有打印出內(nèi)容的原因是因為1號是顯示器文件, 關(guān)閉后就不會再向顯示器中打印了。

關(guān)閉2再測試一下

然后運行結(jié)果:

清除2號指針后, 然后打開文件, 2號就會保存新打開的文件指針。 然后打開的fd就變成了2, 打印出來的是2, 同樣符合我們的假設(shè)。

  • 那么現(xiàn)在就可以下結(jié)論了——文件描述符對應(yīng)的分配規(guī)則是什么? 從0下標開始, 尋找最小的沒有使用的數(shù)組位置, 它的下標新文件的文件描述符。

重定向的本質(zhì)

我們在上面探究文件描述符的分配規(guī)則的時候, 知道了1號文件描述符被清空后, 再新打開的文件的文件指針就會保存到1號文件描述符中。 ——這個過程起始就是重定向。

下面重新捋一下這個過程, 對于上面這個過程, 我們的進程本來有一個文件描述符表:

? ? ? ? 然后我們將1號fd指向顯示器的文件的指針收回, 然后創(chuàng)建新文件log.txt, 將log.txt的struct_files的地址放到1號文件的fd處。

我們看下面的具體代碼:

????????上面這個1號fd轉(zhuǎn)化到過程, 也就是上面黃框框的代碼段。 對于操作系統(tǒng)來說, 他知不知道fd的指向發(fā)生了變化呢? 答案是不知道!!對于操作系統(tǒng)來說, 他不管fd下面做了什么, 他只認fd。 所以, 如果還向1里面寫東西, 那么就是本來向顯示器文件里面寫東西轉(zhuǎn)化為向log.txt文件里面寫東西。 而這個過程就是重定向。

? ? ? ? 那么我們?nèi)绻胍蚱渌募锩鎸憱|西, 是不是就需要將這個文件的指針覆蓋到1號fd里面? ——這就是重定向。 重定向只需要將想要重定向到文件的指針覆蓋到1號所在的fd里面!!

dup

上面我們講道理重定向的底層原理。 但是整個代碼很長——需要一開始關(guān)閉1號fd文件描述符指針, 然后將新打開文件的文件描述符指針放到1號文件中。 實際上, 系統(tǒng)就是提供了一種fd覆蓋的接口——dup系列, 下面是man手冊:

上面有三個dup系列函數(shù), 常用的是dup2. 下面我們具體查看一下dup2的用法:

第一個參數(shù)名為newfd, 對應(yīng)上面的1號fd, 第二個參數(shù)名是oldfd, 對應(yīng)上面的新打開的文件。 也就是說將oldfd里面的內(nèi)容拷貝到newfd里面。

dup2的使用——輸出重定向

????????dup2可以直接將數(shù)組中的一個fd覆蓋到另一個數(shù)組fd。 我們dup2的第一個參數(shù)是新打開的文件fd, 第二個參數(shù)是要拷貝到的fd的位置。

????????如下為代碼:

運行結(jié)果如下:

? ? ? ? 我們也可以把清空寫改成追加寫:

運行結(jié)果如下:

?dup2的使用——輸入重定向

先創(chuàng)建一個數(shù)組進行拷貝拷貝, 然后向顯示器中讀取, 如果讀取, 那么打印讀取的內(nèi)容。

此時是向鍵盤中讀取:

我們使用dup2, 將新打開的文件覆蓋到0號fd。 就是輸入重定向, 將新打開的文件的數(shù)據(jù)打印:

如圖就是將新打開文件的數(shù)據(jù)打印到inbuffer。 再將inbuffer的數(shù)據(jù)打印。 我們在log.txt里面寫上aaaaaaaa

下面是打印內(nèi)容:

自定義shell實現(xiàn)重定向指令

????????如何自己實現(xiàn)>, >>, < 指令

????????要自己實現(xiàn)>, >>, <指令, 我們就要拿出我們之前寫的自定義shell的代碼了。?

????????在代碼中, 我們需要先新定義幾個宏——NONE代表沒有重定向, IN_RDIR代表輸入重定向, OUT_RDIR代表輸入輸出重定向, APPEND_RDIR代表追加重定向。

? ? ? ? 也要定義兩個新的變量——rdirfilename指向重定向文件的首地址, rdir代表重定向的標志。

如下圖宏定義:

新創(chuàng)建的變量:

在交互函數(shù)里面分析是否有重定向, check_rdir就是重定向判斷的函數(shù):

下圖是check_rdir的實現(xiàn):

然后我們再在執(zhí)行普通命令的板塊里面創(chuàng)建一個新的代碼塊。 也就是當id == 0的時候, 判斷此時的rdir的狀態(tài), 如果是NONE才是exec, 正常加載執(zhí)行邏輯。 如下是代碼:

然后我們還要在每次輸入指令的時候都給rdir和rdirfilename做初始化:

運行出結(jié)果之后:


?

文件的重定向和進程替換

????????現(xiàn)在有一個問題, 就是在重定向的時候, 我們修改了fd。 然后加載了子進程, 為什么這樣做是正確的呢?——要解決這個問題, 就要拿起進程的知識了, 如下圖:

????????在上面的圖里面, PCB和文件管理, 是內(nèi)核數(shù)據(jù)結(jié)構(gòu); 而虛擬地址空間, 物理內(nèi)存, 頁表, 是進程數(shù)據(jù)結(jié)構(gòu),?這兩個是結(jié)偶關(guān)系。 而對于物理內(nèi)存, 程序和代碼加載替換掉物理內(nèi)存, 頁表重新映射物理內(nèi)存。 這個過程, 在內(nèi)核數(shù)據(jù)結(jié)構(gòu)里, 并不關(guān)心。

? ? ? ? 所以, 文件的重定向和進程替換之間互不影響!!!

重定向的參數(shù)

我們使用重定向, 可能遇到下圖這種只有一部分數(shù)據(jù)重定向到了新文件, 但是還有一部分直接打印到了顯示器的情況:

????????上面描述的問題就是重定向了一部分, 但是還有一部分沒有重定向, 這是因為對于重定向來說, 默認是將打印到顯示器的數(shù)據(jù)重定向到文件中。

  • ? ? ? ? 想要將兩部分——stdout、stderr兩個部分的數(shù)據(jù)都進行重定向, 就需要使用參數(shù)fd, 使用方式如下: fd > 文件。

? ? ? ? 如下圖使用:

這兩種方法我們要談的是第二種方法:./newfile.exe 1 > both.log 2>&1, 這里面2>&1的意思就是說, 將1fd的內(nèi)容拷貝到2fd里面去。 而1已經(jīng)重定向到了both.log, 所以, 將1的內(nèi)容拷貝到2fd里面去后。 本應(yīng)該打印到2fd里面的內(nèi)容也會被打印到文件中。

如何理解計算機下“一切皆文件”

? ? ? ? 對于計算機來說, 所有的操作計算機的動作, 都是以進程的方式進行操作的。所有訪問文件的操作, 最終都是用進程的方式訪問文件的。

? ? ? ? 計算機上所有應(yīng)用的所有操作, 最終都會被系統(tǒng)解釋成進程。 目前, 所有對文件的操作, 全部都依賴進程的操作。?

? ? ? ? 而且, 我們知道, 對于馮諾依曼體系結(jié)構(gòu)來說, 底層大部分都是外設(shè)!!!如下圖:

????????上面就是一個一個打開文件后創(chuàng)建的結(jié)構(gòu)體, 下面就是底層硬件。

  • ? ? ? ? ?對于上面圖中的底層設(shè)備, 每一個外設(shè)的讀寫方法都是不一樣的, 也就是他們的struct file是不一樣的。 所以這個時候每一個struct file里面都有一個指針指向struct operation_func類型的結(jié)構(gòu)體。

如下圖:

那么, 未來操作系統(tǒng)為了進行文件操作, 就會先創(chuàng)建一個進程:

然后, 操作系統(tǒng)又專門給我們定義了系統(tǒng)調(diào)用:

????????所以, 操作系統(tǒng)就實現(xiàn)了在上層統(tǒng)一使用read, write接口, 然后在下層根據(jù)文件的不同, 找到不同的write, read方法。

? ? ? ? ?所以, 一切皆文件——就是操作系統(tǒng)在文件層面上封裝一層struct file結(jié)構(gòu)體對象, 然后, 根據(jù)這個對象里面的指針找到對應(yīng)文件的write, read。 而這里的write, read同樣是一層封裝各種各樣讀寫方法的結(jié)構(gòu)體。 而真正的各種設(shè)備的讀寫方法如何實現(xiàn), 我們并不關(guān)心!!!

? ? ? ? 從struct file往上, 就是用戶!是給我們看到的, 我們看到的, 就是struct file。 看到的就是——一切皆文件!!!

? ? ? ? 所以, 在linux中, 在struct file這一層, 被稱作VFS——virtual file system虛擬文件系統(tǒng)。

  • ? ? ? ? 以后, 當我們的進程再想實現(xiàn)open, write這些接口的時候, 就會先找到struct file。 然后struct file就回去找到自己里面的operation_func, 至于operation里面是什么情況, struct file并不關(guān)心。 而這, 就是多態(tài)。 這里面的一層一層的指針的包含關(guān)系, 就叫做繼承!!

以上, 就是本節(jié)的全部內(nèi)容, 下面是博主整理的個人筆記:

http://aloenet.com.cn/news/45331.html

相關(guān)文章:

  • 下載網(wǎng)上國網(wǎng)app汕頭seo收費
  • 彩票網(wǎng)站開發(fā)風險國外網(wǎng)站制作
  • 新疆所有的網(wǎng)站百度知道客服
  • 一些網(wǎng)站是用什么顏色做的怎么申請建立網(wǎng)站
  • 網(wǎng)站開發(fā)設(shè)計實訓(xùn) 報告蘇州seo關(guān)鍵詞優(yōu)化方法
  • 鹽城有沒有做網(wǎng)站嗎湖南專業(yè)的關(guān)鍵詞優(yōu)化
  • 鎮(zhèn)江網(wǎng)站制作優(yōu)化老哥們給個關(guān)鍵詞
  • 怎樣做化妝品公司網(wǎng)站百度產(chǎn)品大全首頁
  • it運維工程師證書湖北seo
  • htm網(wǎng)站模板上海公司網(wǎng)站seo
  • 誰教我做啊誰會做網(wǎng)站啊整站排名服務(wù)
  • wordpress 查看訪客站長工具seo綜合查詢源碼
  • 百度云盤做網(wǎng)站空間百度上怎么打廣告宣傳
  • 紹興市中等專業(yè)學(xué)校網(wǎng)站軟文外鏈代發(fā)
  • 開發(fā)企業(yè)門戶網(wǎng)站友情鏈接賺錢
  • 中組部兩學(xué)一做網(wǎng)站如何建網(wǎng)站教程
  • 安徽 網(wǎng)站制作線上推廣平臺
  • jsp網(wǎng)站建設(shè)期末作業(yè)廣州疫情最新情況
  • 網(wǎng)站建設(shè)5000費用運營網(wǎng)站
  • 長春網(wǎng)站建設(shè) 信賴吉網(wǎng)傳媒什么是競價推廣
  • wordpress自定義主頁廣告優(yōu)化師發(fā)展前景
  • 網(wǎng)站做指向是什么意思合肥做網(wǎng)站哪家好
  • 做中學(xué)網(wǎng)站企業(yè)宣傳冊
  • 買的網(wǎng)站模板怎么做成都seo學(xué)徒
  • 網(wǎng)站建設(shè)和管理河南百度推廣代理商
  • 廣州視頻網(wǎng)站建站公司知識營銷
  • wordpress小程序教程免費網(wǎng)站seo
  • 怎么樣建立一個網(wǎng)站百度一下 你就知道首頁官網(wǎng)
  • 便宜做網(wǎng)站的公司靠譜嗎國家免費職業(yè)技能培訓(xùn)官網(wǎng)
  • 怎么做網(wǎng)站賺錢的動漫網(wǎng)站b站推廣網(wǎng)站2023