搞懂Linux下的幾種文件類型

来源:https://www.cnblogs.com/f-ck-need-u/archive/2019/02/25/10430642.html
-Advertisement-
Play Games

在Linux系統下,有七類文件類型: 普通文件( ) 目錄(d) 軟鏈接(字元鏈接L) 套接字文件(S) 字元設備(S) 塊設備(B) 管道文件(命名管道P) 普通文件、目錄、軟鏈接無需多解釋。 管道文件 管道分為 匿名管道和命名管道 。管道都是一端寫入、另一端讀取,它們是單方向數據傳輸的,它們的數 ...


在Linux系統下,有七類文件類型:

  • 普通文件(-)
  • 目錄(d)
  • 軟鏈接(字元鏈接L)
  • 套接字文件(S)
  • 字元設備(S)
  • 塊設備(B)
  • 管道文件(命名管道P)

普通文件、目錄、軟鏈接無需多解釋。

管道文件

管道分為匿名管道和命名管道。管道都是一端寫入、另一端讀取,它們是單方向數據傳輸的,它們的數據都是直接在記憶體中傳輸的,管道是進程間通信的一種方式,例如父進程寫,子進程讀。

在shell中匿名管道就是一個管道符號"|",例如ls | grep xxx,其中ls對應的進程是這個獨立進程組中的父進程,grep對應的進程是子進程,父進程寫子進程讀。

在編程語言中,匿名管道是通過創建兩個文件句柄或文件描述符(例如A、B)來實現的,一個文件句柄用於寫數據(例如A寫入端,數據寫入A將自動推入B中),另一個文件句柄用於讀數據(即B)。

對於命名管道,即有名稱的管道,命名管道將文件保留在文件系統中,它也稱為FIFO,也就是first in first out。雖然命名管道文件保留在文件系統中,但是這個文件只是使用命名管道的一個入口,在使用命名管道傳輸數據的時候,仍然是在記憶體中進行的,也就是說並不會因為保留在文件系統上命名管道的效率就低了。

在shell中,可以使用mknod命令或mkfifo命令創建命名管道,在寫某些特殊需求的shell腳本時,命名管道非常有用。實際上,在Bash 4之後就支持協程(使用coproc命令)的功能了(ksh和zsh老早就支持協程),但是協程的需求都能通過命名管道來實現。

一般的管道都是單向通信的,無法實現雙向通信的功能,也就是只能一邊寫一邊讀,不能兩邊都能讀、寫。如果要實現雙向通信,可以創建兩根管道(這樣就有4個文件句柄,兩個讀端,兩個寫端),或者使用更方便的套接字。

套接字(Socket)

套接字用來實現兩端通信,正如上面分析的,可以實現雙向管道的進程間通信功能。不僅如此,套接字還能通過網路實現跨主機的進程間通信功能。

套接字需要成對才有意義,也就是分為兩端,每一端都有用於讀、寫的文件描述符(或文件句柄),相當於兩根雙向通信的管道。

套接字根據協議族的方式分為兩大類:網路套接字(AF_INET類型,根據ipv4和ipv6分為inet4和inet6)和Unix Domain套接字(AF_UNIX類型)。當然,從協議族往下,套接字可細分為很多種類型,例如INET套接字可以分為TCP套接字、UDP套接字、鏈路層套接字、Raw套接字等等。其中網路套接字是網路編程的基礎和核心。

Unix Domain套接字

對於單機的進程間通信,使用Unix Domain套接字比Inet套接字更好,因為Unix Domain套接字沒有網路通信組件,也就是少了很多網路功能,它更加輕量級。實際上,某些語言在某些操作系統平臺上實現的管道功能就是通過Unix Domain來實現的,可想而知其高效率。

Unix Domain套接字有兩個文件句柄(例如A、B),這兩個文件句柄都是同時可讀、可寫的句柄。進程1向A寫入數據,將自動推送到B上,進程2可從B上讀取從A寫入的數據,同理進程2向B中寫入數據將自動推送到A上,進程1可從A上讀取從B寫入的數據。如下:

進程1            進程2
------------------------
A   ----------->  B
B   ----------->  A

在編程語言中,創建Unix Domain Socket自然有對應的函數輕鬆創建(可man socketpair)。對於bash shell,可以通過nc命令(NetCat)來創建,或者乾脆使用兩個命名管道來實現對應的功能。如有需要,可自行瞭解如何在bash shell中使用Unix Domain套接字。

網路套接字

對於跨網路的進程間通信,需要使用網路套接字。每個網路套接字都由5部分組成,它們稱為套接字的5元組。格式如下:

{protocol, src_addr, src_port, dest_addr, dest_port}

即協議、源地址、源埠、目標地址、目標埠。

每端套接字在內核空間都有兩個buffer(即一對socket有4個buffer),每一端都有recv buffer和send buffer。進程1向自己的套接字的send buffer寫入數據,將發送到對端的recv buffer中,然後對端的進程2就可以從recv buffer中讀取數據,反之亦然。

但是在真正可以讀、寫網路套接字之前,網路套接字還需要一些設置。服務端套接字創建(socket()函數,創建後就會有一個文件句柄或文件描述符供讀、寫操作)後,還要綁定地址(通過bind()函數)和監聽埠(通過listen()函數),客戶端則只需要創建套接字後,直接使用connect()函數向服務端套接字發起連接請求即可。

對於TCP套接字,客戶端發起連接請求即表示要和服務端進行三次握手(內核完成,和用戶空間進程無關)。將這三次握手的每一次進行細分,第一次客戶端發送SYN請求,服務端接收到SYN後,內核將這個連接放進syn queue中並設置狀態為syn-recv,然後發送ack+syn給客戶端,當接收到客戶端回覆ack後,內核將連接從syn queue移到established queue(或accept queue)中並將連接的狀態標記為established。最後等待用戶空間的進程發起accept()系統調用讓內核將其從accept queue中移除。被accept()後的連接表示已經建立好的連接,可以真正實現兩端進程間的數據傳輸。

更多關於TCP套接字的原理,參見我的另一篇文章:不可不知的socket和TCP連接過程

塊設備和字元設備

塊設備是硬體設備,通過隨機(不一定是順序)訪問固定大小的數據塊(chunk)來區分。固定大小的chunk稱為塊(block)。最常見的塊設備是硬碟,但也存在許多其他塊設備,如軟盤驅動器、藍光閱讀器和快閃記憶體。註意,這些都是掛載文件系統的設備,文件系統就像是塊設備的通用語言。

字元設備通過連續的流數據訪問,一個位元組接著一個位元組。典型的字元設備是終端(終端分多種,由物理的也有虛擬的)和鍵盤

區分塊設備和字元設備最簡單的方法是看數據訪問的方式。能隨機訪問獲取數據的是塊設備,必須按位元組順序訪問的是字元設備

如果可以這裡讀一點數據,那裡讀一點數據,最後串成一整段連續的數據,那麼這個就是塊設備,就像硬碟上的數據是不連續的,有可能需要通過隨機訪問的方式獲取一段數據。比如磁碟上一個稍大一點的文件,可能前10k數據是連續的數據塊或在連續的扇區內,之後的10k數據在離它很遠甚至在不同的柱面上。

如果一段數據中的每個位元組都跟訪問時的位元組順序是一樣的,即位元組先後順序從訪問獲取時到最後處理數據的過程中都是完全一致的,那麼這個就是字元設備。換句話說,字元設備可以看作是流設備。就像鍵盤輸入數據一樣,連續敲兩個字鍵,這兩個鍵對應的位元組數據在被接收的時候一定是先敲的在前面,後敲的在後面。同理終端設備也是以一樣的,程式將數據輸出到終端時,程式先輸出字母a再輸出數字3,那麼顯示在終端上時一定是a在前,3在後。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DHCP Server服務在%windir%\System32\DHCP或"%SystemRoot%\System32\DHCP"文件夾下存放了一個審核日誌。審核日誌文件名稱是基於一周的當前天來命名。在預設情況下,如果磁碟空間少於20MB,或當前日誌文件超過分配的最大空間,那麼DHCP Server... ...
  • 1.redis根目錄調出命令行(cmd) 2.登錄redis:redis-cli -h 127.0.0.1 -p 6379 3.查看所有key值:keys * 4.刪除指定索引的值:del key 5.清空整個 Redis 伺服器的數據:flushall 6.清空當前庫中的所有 key:flushd ...
  • 定點設計師產品說明 系統要求 定點設計師產品說明 系統要求 教程 MATLAB工作流 在MATLAB中創建定點數據 定點基礎知識 執行定點算術 “執行定點算術” 查看定點數據 示例代碼中使用的fi對象顯示設置 加速定點模擬 此示例說明如何使用fiaccel函數來加速定點演算法。您可以從MATLAB®代 ...
  • 一:實驗環境 虛擬機:win7,winserver 2008 二:實驗過程 (1)在server創建用戶 (2)將win7加入到域st13.com中 首先修改win7的dns伺服器地址為伺服器server2008的地址 接下來進行連通性測試: Server ping win7 Win7 ping s ...
  • Fixed-Point Designer™ 提供開發定點和單精度演算法所需的數據類型和工具,以在嵌入式硬體上進行性能優化。Fixed-Point Designer 會分析您的設計並提供建議的數據類型和屬性,例如字長和定標。您可以指定詳細的數據屬性,如舍入模式和溢出操作,以及混合單精度和定點數據。您可以 ...
  • win7下建立超級隱藏賬戶 實驗目的: 隱藏用戶,不讓管理員簡單的發現 隱藏方法: 1.命令提示符中創建隱藏賬戶這種方法只能將賬戶在"命令提示符"中進行隱藏,而對於"電腦管理"則無能為力。因此這種隱藏賬戶的方法並不是很實用,只對那些粗心的管理員有效,是一種入門級的系統賬戶隱藏技術 2. 註冊表隱藏 ...
  • --crontab檢查是否安裝[oracle@rac1 ~]$ rpm -qa | grep crontabcrontabs-1.10-8啟動與關閉[oracle@rac1 ~]$ /etc/init.d/crond stop/start/restart/reload全局配置文件[root@rac1 ...
  • 1.運行 gpedit.msc →computer configuration→administrative templates→windows componets→Remote Desktop→Remote Desktop session host→Connections→Limit number ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...