【发布时间】:2018-04-12 07:17:46
【问题描述】:
“文件可能被截断。至少需要 %ld 大小,但大小为 %ld”。任何人都可以帮助我了解如何调用此消息吗?我在尝试收集内核跟踪时看到此消息。谁能解释为什么在我尝试收集内核跟踪时会发生这种情况?
我注意到的另一件事是,当我第一次看到上述消息时尝试收集内核跟踪。当我再次尝试立即收集时,我能够收集日志。但是当我在 > 5 分钟后再次尝试收集时,我看到了上述消息。
【问题讨论】:
“文件可能被截断。至少需要 %ld 大小,但大小为 %ld”。任何人都可以帮助我了解如何调用此消息吗?我在尝试收集内核跟踪时看到此消息。谁能解释为什么在我尝试收集内核跟踪时会发生这种情况?
我注意到的另一件事是,当我第一次看到上述消息时尝试收集内核跟踪。当我再次尝试立即收集时,我能够收集日志。但是当我在 > 5 分钟后再次尝试收集时,我看到了上述消息。
【问题讨论】:
好的,当您尝试一次性获取/收集大量信息时,这就是内核的行为。
话虽如此,在您的情况下,您需要再次调用您所做的操作,以便内核了解您确实想要显示那些 huge 信息。这就是您能够在第二次尝试中收集内核跟踪的原因。
如果我没记错的话,您实际上是在调用read() 系统调用,它将尝试从 fd 读取字节并将其计数到从 buf 开始的缓冲区中。
正如您可以从 Linux 内核源代码中看到的 read_write.c,rw_verify_area 函数不喜欢巨大的 counts。因此,它将它们限制在通常适合int 的范围内。所以它不必一直进行范围检查。
TL;DR
你得到的不是错误,很可能是一个特性不让内核努力从用户错误地打开大文件。这个限制是由 Linux 内核中的rw_verify_area 函数创建的。
因此,它旨在至少调用两次 read 系统调用来获取您的数据。
【讨论】: