为什么 wc 和 stat 对 /proc/[pid]/cmdline 产生不同的结果?

为什么 wc 和 stat 对 /proc/[pid]/cmdline 产生不同的结果?

我试图了解原因wcstat报告不同的事情/proc/[pid]/cmdline

wc说我的 shellcmdline文件大小为 6 个字节:

$ wc --bytes /proc/$$/cmdline
6 /proc/10425/cmdline

stat表示文件大小为 0 字节:

$ stat --format='%s' /proc/$$/cmdline
0

file同意stat

$ file /proc/$$/cmdline
/proc/10425/cmdline: empty

cat给出这个输出:

$ cat -vE /proc/$$/cmdline
-bash^@

所有这些都在 Linux 上进行,而不是在任何其他 *nix 操作系统上进行。

stat和程序是否wc有不同的算法来计算文件中的字节数?

答案1

下面的文件/proc不是常规文件,而是由内核动态创建的虚拟文件。对于大多数(全部?)来说,系统不会事先计算大小,但读取它的程序只会获取要获取的任何数据。

wc你所做的和stat例如所做的之间的区别ls在于,在这里wc打开文件,读取它并计算它得到的内容,同时stat使用ls系统stat()调用向系统询问文件的元数据,包括大小(而且还获得例如所有者和权限)。对于虚拟文件,这些不会给出相同的结果。

如果运行 eg ls -l /proc/$$/,您将看到许多大小为 0 的文件,尽管其中大多数文件都可以读取数据。

设备节点/dev/sda类似,尽管在它们的情况下ls甚至不显示大小,而是显示设备编号。

特别是file,您可以file -s要求它只读取数据而不关心它是否是特殊文件。

答案2

是的,wc 和 stat 有不同的算法来计算文件中的字节数。

厕所计算文件中的字节数,在本例中为 6。

统计数据显示有关文件的信息,包括其大小(以字节为单位)。但是,/proc/[pid]/cmdline 不是文件系统上的典型文件,而是 proc 文件系统中的虚拟文件。该文件包含用于启动具有给定进程 ID 的进程的命令行参数。它存储在内存中而不是文件系统上,这意味着它的大小可能与已写入的实际字节数不同。这就是 stat 将大小报告为 0 的原因。

file 命令用于根据文件内容确定文件的类型,它可以正确地将 /proc/[pid]/cmdline 识别为“空”文件。

总结一下,厕所计算文件中的实际字节数,统计数据显示有关文件的信息,以及文件根据文件的内容确定文件的类型。

相关内容