![为什么 wc 和 stat 对 /proc/[pid]/cmdline 产生不同的结果?](https://linux22.com/image/216476/%E4%B8%BA%E4%BB%80%E4%B9%88%20wc%20%E5%92%8C%20stat%20%E5%AF%B9%20%2Fproc%2F%5Bpid%5D%2Fcmdline%20%E4%BA%A7%E7%94%9F%E4%B8%8D%E5%90%8C%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
我试图了解原因wc
并stat
报告不同的事情/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 识别为“空”文件。
总结一下,厕所计算文件中的实际字节数,统计数据显示有关文件的信息,以及文件根据文件的内容确定文件的类型。