2017-08-30 79 views
4

我正在學習android內核作爲初學者。我可以通過使用dmesg命令通過adb讀取從函數main()中的宏ERROR()引發的消息system/core/init/init.c。我觀察到在調用main(),dmesg內部的函數open_devnull_stdio()後,不再顯示ERROR()引發的消息。在c中的文件名開始之前和結束之後使用雙下劃線(__)的目的是什麼?

爲了找到原因,我開始挖掘到的open_devnull_stdio()system/core/init/util.c聲明,我發現這條線我不明白

static const char *name = "/dev/__null__";

其實有沒有名爲__null__內的設備/dev/文件,但有一個叫null文件,我可以用adb pull抓住它,它是一個0字節(空)文件。

那麼爲什麼用雙下劃線(__)包裹文件名?

這裏是鏈接的util.c

+1

我不知道答案,但你可能想查找/ dev/null。這是一個衆所周知的「文件」。 https://en.wikipedia.org/wiki/Null_device –

+0

null設備是一件非常特別的事情。你能舉出更多的例子嗎? – Yunnosch

回答

2

在開始之前,結束之後或在C之後都沒有特別的目的使用雙下劃線。從C的角度來看,文件名只是一個字符串,操作系統可以以任何方式自由解釋它選擇。從Linux的角度來看,同樣適用。文件名中的下劃線只是字符。他們沒有區別於字母bt

如果我猜對了,我正在閱讀the same file as you(鏈接到您正在閱讀的源代碼可能是一個好主意),那麼它應該是非常明顯的代碼之後, 。接下來的行是:

if (mknod(name, S_IFCHR | 0600, (1 << 8) | 3) == 0) { 
    fd = open(name, O_RDWR); 
    unlink(name); 

它創建空設備然後打開並立即再次刪除。

我懷疑這樣做是爲了程序可以在不訪問根文件系統的情況下運行,並且仍然能夠打開相當於/dev/null

+0

謝謝@藝術。是的,這兩個功能是一樣的。我附上了我提到的文件。 – Yasindu

-1

正如其他人指出這只是告訴它是「空設備」,不叫「空」的常規文件。 null應該像一個信息接收器,而不像您將數據轉儲到的普通文件。希望這可以幫助。

2

我不知道答案,但我有一個想法:

下面的頁面顯示了一個「strace的」輸出在使用/dev/__null__

https://gist.github.com/tetsu-koba/1522515

Linux下的設備文件有用於識別設備的33位(?)數字。 (至少在舊的Linux版本下)你可以刪除/dev中的一些文件,你可以恢復它,甚至當你知道33位數字時,就可以在另一個目錄(!)中創建它! (所以你可以刪除設備/dev/sda2和創建設備(而非文件)/home/myuser/sda2代替!)

在上面的鏈接跟蹤顯示以下三行:

mknod("/dev/__null__", S_IFCHR|0600, makedev(1, 3)) = 0 
open("/dev/__null__", O_RDWR|O_LARGEFILE) = 3 
unlink("/dev/__null__") = 0 

這些行將創建設備文件/dev/__null__(33位數字標識爲/dev/null)。然後它打開該文件,然後再次刪除該文件。

也許這樣做是因爲該工具應該能夠在設備文件「/ dev/null」存在的Linux安裝上運行(在這種情況下,該文件不應該被覆蓋)以及該文件是丟失(在這種情況下,必須使用已知的33位數字創建替換文件)。

相關問題