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

Из следующего сообщения мы знаем, что в файле /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 

4 ответа

Решение

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

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

Вы можете вместо этого искать программу sysctl -a.

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

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

/proc/ Файловая система представляет собой "иллюзию", поддерживаемую ядром, которое не заботится о предоставлении размера (большей части) его псевдофайлов (поскольку для вычисления этого "реального" размера обычно требуется создание всего содержимого текстового псевдофайла), и ожидает большинство [псевдо-] текстовых файлов из /proc/ быть прочитанным последовательно от первого до последнего байта (т.е. до EOF), в блоках разумного размера (например, 1 КБ). Подробности смотрите в man-странице 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);
  }

Конечно, некоторые файлы (например, /proc/self/cmdline) документированы как возможно содержащие NUL байты. Вам понадобится немного fread для них.

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

Другие вопросы по тегам