簡體   English   中英

如何在/ proc中顯示文件的大小? 它不應該是零大小

[英]how can i show the size of files in /proc? it should not be size zero

從下面的消息中,我們知道文件/ proc / sys / net / ipv4 / ip_forward中有兩個字符,但為什么ls只是顯示這個文件的大小為零?

我知道這不是磁盤上的文件,而是內存中的文件,所以有沒有命令可以看到/ proc中文件的實際大小?

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

那些不是磁盤上的真正文件(正如你所提到的)但它們也不是內存中的文件 - / proc中的名稱對應於對操作系統中正在運行的內核的調用,並且內容是動態生成的。

系統在不生成文件的情況下不知道文件的大小,但如果您兩次讀取“文件”,則無法保證您獲得相同的數據,因為系統可能已更改。

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

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

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

/proc/ filesystem是由內核維護的“錯覺”,它不會給出(大部分)其偽文件的大小(因為計算“真實”大小通常會涉及構建整個文本偽文件的()內容),並期望來自/proc/大多數[偽]文本文件在合理大小(例如1K)的塊中從第一個到最后一個字節(即直到EOF)依次讀取。 有關詳細信息,請參見proc(5)手冊頁。

因此,無法在單個系統調用中獲取真實大小(某些文件,如/proc/self/maps/proc/sys/net/ipv4/ip_forward )(如stat(2) ,因為它會給出一個大小如stat(1)ls(1)命令所報告的,為0。 閱讀這些文本文件的典型方法可能是

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);
  }

當然,一些文件(例如/proc/self/cmdline )被記錄為可能包含NUL字節。 你需要一些他們的fread

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM