![执行“cat”会导致“值对于定义的数据类型错误来说太大”](https://linux22.com/image/661289/%E6%89%A7%E8%A1%8C%E2%80%9Ccat%E2%80%9D%E4%BC%9A%E5%AF%BC%E8%87%B4%E2%80%9C%E5%80%BC%E5%AF%B9%E4%BA%8E%E5%AE%9A%E4%B9%89%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E9%94%99%E8%AF%AF%E6%9D%A5%E8%AF%B4%E5%A4%AA%E5%A4%A7%E2%80%9D.png)
我对 /proc/(pid)/map 中的文件执行了 cat 并收到错误 Value too large for defined data type error
当然,该文件是二进制的,我认为将二进制文件输出到终端并不是最好的主意,但我实际上是将输出重定向到 tr 命令以将二进制文件转换为纯文本。
并非所有地图文件都会发生这种情况。只有少数地图文件会发生这种情况。
我很好奇为什么 cat 会发出这样的错误。
我的系统是在 Sun Fire V890 上运行的 Solaris 10 系统。
答案1
来自手册:
对于定义的数据类型来说值太大
原因
IPC 对象或文件系统对象的用户 ID 或组 ID 太大,无法存储在调用者提供的结构的适当成员中。
行动
在较新的系统上运行该应用程序,或要求程序作者修复此情况。
技术说明
此错误仅发生在支持的用户或组 ID 值范围大于声明的成员结构所能支持的系统上。这种情况通常是因为 IPC 或文件系统对象驻留在远程计算机上,并且其 uid_t、off_t 或 gid_t 类型的值大于本地系统的值。此错误的符号名称为 EOVERFLOW,errno=79。
或者换句话说:当源数据是 64 位并且实际值高于 32 位所能容纳的值时,代码使用具有 32 位值的结构请求数据。
答案2
从技术上讲,另一个答案是正确的。但是正在发生的事情是cat
尝试打开您尝试读取的文件,并调用 ,而(f)stat
这正是问题所在(您可以通过运行 来查看strace cat <file>
)。
您使用的是 32 位操作系统,这意味着如果您的文件大小大于该值 (2^31) 字节,这种情况将始终发生(即如果它不适合有符号的 32 位整数)。尝试打开ls -l
您的文件并查看其大小,您会看到