0

我正在编写一个将电池电量记录到 CSV 文件的工具(我知道这将是一个 bash 单行程序,但这对我来说是另一个 Common Lisp 学习练习)。

我的计划是将整个电池状态文件存储到内存中,因为它保证是一个小文件。但是file-length在文件大小上始终返回 0,同时在其他文件上正常工作:

* (defun stream-length (path)
    (with-open-file (stream path) 
            (file-length stream)))

STYLE-WARNING: redefining COMMON-LISP-USER::STREAM-LENGTH in DEFUN

STREAM-LENGTH
* (stream-length "/home/duncan/foo")

4
* (stream-length "/proc/acpi/battery/BAT0/state")

0

事实证明,这不仅仅是 SBCL;Perl 的行为方式相同:

$ perl -e 'print -s "/home/duncan/foo"; print "\n"'
4
$ perl -e 'print -s "/proc/acpi/battery/BAT0/state"; print "\n"'
0

但该文件肯定包含一些内容:

$ cat /proc/acpi/battery/BAT0/state
present:                 yes
capacity state:          ok
charging state:          discharging
present rate:            0 mW
remaining capacity:      3945 mWh
present voltage:         10800 mV

所以我假设状态文件有一些特别之处。有人可以告诉我它是什么吗?

4

1 回答 1

1

大多数/proc文件都是特殊的。它们的内容不存在存储在任何地方,而是在进程打开并读取给定文件时按需生成。每次读取内容的大小可能会有所不同。因此,他们通常不会宣传任何特定的尺寸。

正确的方法是简单地打开文件并读取它直到 EOF。

于 2011-05-10T22:45:54.577 回答