/dev/null 是什麼?

/dev/null 是什麼?

我一直在查看 /dev,並偶然發現了幾個文件,包括null.我想查看文件中的內容,所以我這樣做了hx null,但是什麼也沒發生,並且給出了錯誤File null is not a regular file。是什麼原因導致此訊息?

答案1

中的幾個物件/dev虛擬設備並由內核函數直接處理。比較常用的有:

  • /dev/null:無限容量的通用水槽。用於丟棄輸出: try echo foo >/dev/null。讀取它會傳回一個空位元組流(立即 EOF)。
  • /dev/zero:無限的位元組來源0x00。通常用作用 0 覆蓋內容的輸入。
  • /dev/random, /dev/urandom: 無限的隨機位元組來源。

答案2

事實上,其他答案似乎都沒有真正回答為什麼 hx 拒絕使用 /dev/null 的問題。 hx 如此反應的原因很簡單,它被編程為為裝置檔案輸出此錯誤訊息。

https://github.com/krpors/hx/blob/develop/editor.c#L125:

if (!S_ISREG(statbuf.st_mode)) {
        fprintf(stderr, "File '%s' is not a regular file\n", filename);
        exit(1);

這意味著 hx 特別拒絕處理任何非常規文件。我不認為進行此檢查有一個很好的理由 - 如果沒有它,我希望它/dev/null可以與 hx 一起使用,因為 hx 會讀取一個空文件,並且在保存它們時對其進行的任何更新都會丟失。

(這假設https://github.com/krpors/hx/確實是海報所說的 hx 程式)

答案3

/dev/null基本上是一種丟棄資訊的方法。

主要目的只是為了能夠將事物重新導向遺忘。

echo 'duck' > /dev/null

將抑制 給予的訊息,echo 'duck'因為它被送到/dev/null並因此被丟棄。

這主要在使用的命令提供您不希望看到的輸出時使用。

讀取/dev/null立即返回文件末尾——即,它就像一個空文件。

還有其他有趣的事情,/dev例如random會給你隨機數據;這並不是您對「文件」的期望:)值得注意的是,這/dev/random是從系統使用中收集的真實隨機數據(擊鍵之間的時間和類似的事情),並且該池可能會很快耗盡。/dev/urandom給你看似隨機的數字,卻是用數學公式計算出來的。通常/dev/urandom可以滿足您的需要,但例如非常強大的加密金鑰,它還不夠好。

您也可以讀取/dev/zero以獲得無限的零(空)位元組流。

答案4

/dev/null是一個字元設備文件,即設備驅動程式的介面。

該特定設備是虛擬設備(不代表真實硬體)。特製為無底垃圾桶;您可以將任何程式的輸出轉儲到其中,以防您不希望它們顯示或其他任何地方。

  • 就內容而言,如果您確實嘗試過這個文件 (是的,就是你閱讀),它會總是相當於一個空的0位元組長度文件

我不知道你的hx命令是什麼,但從你的描述我猜這是一個識別文件類型的命令按其內容。我在 GNU/Linux 系統上執行此任務時使用的命令是file,如果發現該文件不是常規文件,它也會停止...

$ file /dev/null
/dev/null: character special

file命令還提供了一個-s選項,強制它讀取......

$ file -s /dev/null
/dev/null: empty

也許您的hx命令有一個可以使用的類似選項?

file預設(也許你的hx命令也是如此)不識別非常規文件的原因在-s選項文件中有所暗示file的手冊頁,即...

  • 讀取這些文件可能會導致副作用,這些副作用有時是不想要的。
    • 從 FIFO 管道中讀取會永久消耗其中的數據,您無法將已讀取的數據推回管道中。
    • 從設備文件讀取會導致設備變化...
      • 從磁帶設備讀取會導致磁帶頭位置移動。
      • 從序列埠設備讀取會導致緩衝的輸入位元組被消耗。
      • 從隨機數設備讀取會導致系統的熵池耗盡。
      • 還有更多,取決於相關設備的驅動程式。
  • 識別這些特殊文件按內容需要做更多的工作,但確定性卻低很多:
    • 內容大小不會提前知道(或需要特殊的系統特定ioctl()呼叫才能取得)。
    • 在很多情況下,尋求是行不通的。
    • 檢測依賴文件結尾簽名的文件類型將需要通讀整個內容。
    • 其中一些文件給出無窮內容。

如果您的程式不是為處理所需的工作而設計的,那麼它可能無法識別非常規文件的內容;並作為安全預防措施中止。

  • 如果程序在沒有此安全檢查的情況下繼續進行,可能會導致懸掛, A碰撞,或者更糟的是,導致系統記憶體不足;取決於相關程序的設計。

如果是這種情況,則表示您的程式有限制;而是用於file -s識別目的。


附錄

如果你hx一些十六進位/二進位編輯;那麼特別是不建議用它打開您不知道的特殊文件。十六進位編輯通常預載整份文件到記憶體中進行編輯操作。

因此,如果您嘗試讓它打開一個無限內容的設備文件(如/dev/zero/dev/urandom),甚至是一個大型有限設備(如/dev/sda),它可能會將您的系統驅動到一個記憶體不足的情況,您可能需要重置整台電腦才能恢復。

您剛進行的安全檢查可能會保護您免受這種情況的影響。 (正如已經提到的:設備檔案的內容大小事先未知 - 程式無法事先確定您是否有足夠的記憶體來載入它)

如果您只是想“查看”文件的標題,無論如何;使用十六進位觀眾反而, 喜歡hexdump(推薦),或老派od。例如:

  • hexdump -C -n 512 /dev/null(內容將為空)
  • hexdump -C -n 512 /dev/urandom(內容每次都是不同的亂碼)

^ 此-n 512選項將視圖限制為前 512 個位元組。但即使你忽略了這一點,並受到無盡輸出的轟炸,你所需要做的就是按 來停止它Ctrl+C

相關內容