2012-09-02 33 views
4

,我們知道文件/ proc/sys/net/ipv4/ip_forward中有兩個字符,但爲什麼ls只是顯示此文件的大小爲零?如何在/ proc中顯示文件的大小?它不應該是以下消息的大小爲零

我知道這不是磁盤上的文件,而是內存中的文件,那麼是否有任何命令可以在/ proc中看到文件的實際大小?

[email protected]:/proc/sys/net/ipv4# cat ip_forward | wc -c 
2 
[email protected]:/proc/sys/net/ipv4# ls -l ip_forward 
-rw-r--r-- 1 root  root   0 Sep 3 00:20 ip_forward 
[email protected]:/proc/sys/net/ipv4# pwd 
/proc/sys/net/ipv4 

回答

5

這些都不是真正的磁盤上的文件(你提到),但他們也不是內存中的文件 - 在/ proc名稱對應的呼叫到正在運行的內核在操作系統中,內容即時生成。

系統不知道沒有生成文件會有多大,但如果您兩次讀取「文件」,則不能保證獲得相同的數據,因爲系統可能已更改。

您可能正在尋找程序 sysctl -a 改爲。

+0

所以用sysctl,我還需要cat文件在/ proc嗎?或者我可以用sysctl做所有的事情? – hugemeow

0

它不是真正的內存中的文件,它是用戶和內核之間的接口。

+0

lol,那麼可以顯示/ proc目錄中文件的大小嗎? – hugemeow

+1

'0'不是一個大小,只是一個次要的設備號碼...嘗試'/ dev/sdb' ... –

+0

@BasileStarynkevitch哦,是的,沒錯,對不起! – phsym

1

/proc/文件系統是內核維護的「幻覺」,它不會給予其僞文件大部分的大小(因爲計算「真實」大小通常涉及構建整個文本僞文件文件的內容),並且期望大多數來自/proc/的[僞]文本文件按照從合適大小(例如1K)塊中的第一個到最後一個字節(即,直到EOF)的順序被讀取。詳細信息請參閱proc(5)手冊頁。

所以沒有辦法在一個單一的系統調用,以獲得真正的大小(像/proc/self/maps/proc/sys/net/ipv4/ip_forward一些文件)(如stat(2),因爲這會給出一個大小爲0,由stat(1)ls(1)命令報道)。閱讀這些文本文件的典型方法可能是

FILE* f = fopen("/proc/self/maps", "r"); 
       // or some other textual /proc file, 
       // e.g. /proc/sys/net/ipv4/ip_forward 
if (f) 
    { 
     do { 
     // you could use readline instead of fgets 
     char line[256]; 
     memset (line, 0, sizeof(line)); 
     if (NULL == fgets(line, sizeof(line), f)) 
      break; 
     // do something with line, for example: 
     fputs(line, stdout); 
     } while (!feof (f)); 
    fclose (f); 
    } 
5

/proc中的東西並不是真正的文件。在大多數情況下,它們甚至不是內存中的文件。當您訪問這些文件時,proc文件系統驅動程序會執行一個系統調用,以獲取適合該文件的數據,然後對其進行格式化以輸出。這通常是動態構建的動態數據。一個例子是/ proc/net/arp,它包含當前的ARP緩存。

獲取這些東西的大小隻能通過格式化整個輸出來完成,所以它不會在列出文件時完成。如果你想要的尺寸,像你一樣使用wc -c