LINE_MAX
可以通过运行来获取 的值getconf LINE_MAX
。在 FreeBSD 12 和 Ubuntu 18.04(我怀疑还有很多其他操作系统)上,该值是 2048 字节。
在 POSIX 世界中,有许多专门设计用于处理文本文件的 shell 实用程序。任何一行长度超过字节(包括换行符)的文件LINE_MAX
都不是文本文件(无论如何都是由 POSIX 定义的)。设计用于将文本文件作为输入的 shell 实用程序不需要能够正确处理此类文件。
在实践中,我似乎无法找到一个无法处理行数很长的文本文件的实用程序。据我了解,GNU 实用程序对文本文件中一行的长度没有任何实际限制(我不确定 FreeBSD)。
有人知道任何现代或半现代操作系统上的 shell 实用程序会在LINE_MAX
长度超过字节的行上阻塞吗?顺便说一句,像 Perl 和 Python 这样的编程语言会受到 的值的影响吗LINE_MAX
?
答案1
至少在某些情况下,此站点上至少有一个 shell 实用程序的示例LINE_MAX
,该实用程序至少在某些情况下坚持使用 ,开放BSDcut
;事实并非如此呛比这些更长的行,但它的某些功能仅限于LINE_MAX
行的第一个字符。
除了完全拒绝使用较长线路的实用程序之外,还有一种常见模式会导致潜在的不良行为:通常使用
fgets(line, sizeof line, fp);
其中line
是LINE_MAX
- 大小的字符数组(参见示例pam_localuser
)。如果line
每次处理都fgets
返回 non- NULL
,则输入将LINE_MAX
在行太长时进行分割处理。因此,在 中pam_localuser
,/etc/passwd
长度大于的行将LINE_MAX
被视为两行。
我查看的编程语言和解析器生成器没有引用LINE_MAX
(除了传递引用之外,以使值可用于用这些语言编写的程序)。这包括 GCC、Perl、Python 和 Lua。