как я могу показать размер файлов в / proc? он не должен быть размером 0

из следующего сообщения, мы знаем, что есть два символа в файле / proc / sys / net / ipv4 / ip_forward, но почему я только что показал, что этот файл имеет нулевой размер?

Я знаю, что это не файл на диске, а файл в памяти, так есть ли какая-либо команда, которая может видеть реальный размер файлов в / 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 

На самом деле это не файлы на диске (как вы упоминаете), но они также не являются файлами в памяти – имена в / proc соответствуют вызовам в запущенном ядре в операционной системе, а содержимое генерируется «на лету».

Система не знает, насколько велики будут файлы без их создания, но если вы дважды прочтете «файл», нет гарантии, что вы получите одни и те же данные, потому что система, возможно, изменилась.

Возможно, вы ищете программу sysctl -a .

Вещи в / proc не являются файлами. В большинстве случаев они не являются даже файлами в памяти. Когда вы обращаетесь к этим файлам, драйвер файловой системы proc выполняет системный вызов, который получает данные, соответствующие файлу, а затем форматирует его для вывода. Обычно это динамические данные, созданные на лету. Примером этого является / proc / net / arp, который содержит текущий кеш ARP.

Получение размера этих вещей может быть выполнено только путем форматирования всего вывода, поэтому это происходит не только при перечислении файла. Если вы хотите размеры, используйте wc -c как и вы.

/proc/ filesystem – это «иллюзия», поддерживаемая kernelм, что не мешает давать размер (большинство) своих псевдо-файлов (поскольку вычисление «реального» размера обычно связано с построением всего текстового псевдо-файла контент) и ожидает, что большинство [псевдо] текстовых файлов из /proc/ будут считываться последовательно от первого до последнего байта (т.е. до EOF), в блоках с разумным размером (например, 1K). См. Справочную страницу 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, // eg /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); } 

Это не файл в памяти, это интерфейс между пользователем и kernelм.

  • Использование BufferedReader для чтения текстового файла
  • В чем разница между итерацией по файлу с помощью foreach или в Perl?
  • Как изменить таймаут на объекте .NET WebClient
  • Использование File.listFiles с FileNameExtensionFilter
  • Лучший способ писать байты в середине файла в Java
  • Как проверить, существует ли строка в файле с Bash?
  • Как очистить файл на Perl?
  • JavaFX FileChooser Throws Error (возможно, легко исправить, но все еще запутано)
  • Загрузите модуль node.js из строки в памяти
  • простой HttpURLConnection POST-файл multipart / form-data от android до google blobstore
  • Почему Path.Combine не правильно конкатенирует имена файлов, которые начинаются с Path.DirectorySeparatorChar?
  • Давайте будем гением компьютера.