【问题标题】:lsof always report offset equal to file size in OSXlsof 总是报告偏移量等于 OSX 中的文件大小
【发布时间】:2015-11-11 23:25:06
【问题描述】:

我试图估计我的程序处理了多少文件,对我来说一个明显的解决方案是使用lsof -o。但令人惊讶的是,lsof 的输出中的OFFSET 总是等于 SIZE(就像在lsof -s -- 中一样),所以我决定编写一些简单的程序来测试这种行为,然后......

C:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main(void) {
  int filedesc = open("path/to/file", O_RDONLY);
  printf("%i\n", filedesc);
  while(1) {};
}

斯卡拉:

io.Source.fromFile(path)

Python:

open(path)

OFFSET 在 OS X 下总是在文件末尾:

$ lsof -o /path/to/file
COMMAND  PID  USER   FD   TYPE DEVICE    OFFSET     NODE NAME
a.out   5390 folex    3r   REG    1,4 631302648 48453926 /path/to/file

$ lsof -s -- /path/to/file
COMMAND  PID  USER   FD   TYPE DEVICE      SIZE     NODE NAME
a.out   5390 folex    3r   REG    1,4 631302648 48453926 /path/to/file

我们将不胜感激任何对这些语言的解释。

更新:在 Ubuntu 下按预期工作。仅在 OS X 下错误的偏移量。

【问题讨论】:

  • 您的 sn-ps 都没有从位置 0 移动偏移量。您确定您正确解释了 lsof 的输出吗?将其复制粘贴到您的问题中。还要查看内核报告的数据(并将其复制到您的问题中),这就是 lsof 使用的:/proc/&lt;PID&gt;/&lt;FD&gt;/fdinfo
  • 刚刚发现在 linux 下它工作正常 :( 所以这是 OS X 和 lsof 互操作错误。
  • C 示例:open() 返回打开文件的文件描述符。它不会告诉您有关文件大小的任何信息。我建议阅读手册页。
  • lsof -s -- 给出文件大小,lsof -o 给出描述符偏移量。片段与文件大小无关。
  • 你能展示你看到的输出的一个小样本吗?

标签: c macos scala filesystems lsof


【解决方案1】:

以下是 OSX 手册页中关于 lsof 的大小/偏移列的内容(已添加重点):

SIZE、SIZE/OFF 或 OFFSET 是文件的大小或文件偏移量 以字节为单位。仅当值是 可用的。 Lsof 显示任何值 - 大小或偏移量 - 是 适合文件的类型和 lsof 的版本。 在一些 UNIX 方言 lsof 无法获得准确或一致的文件偏移量 来自其内核数据源的信息,[...]

文件大小以十进制显示;偏移量通常是 如果它包含 8 位数字,则以十进制显示,并带有前导 '0t' 或 较少的;如果长度大于 8,则以十六进制表示,以 '0x' 开头 位数。 [...]

因此,前导 '0t' 和 '0x' 标识列时的偏移量 可能同时包含大小和偏移量(即,它的标题是 SIZE/OFF)。

虽然列标题显示偏移,但数字没有前导 '0t''0x',所以我会得出结论,文件偏移信息根本无法从 OSX 内核获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多