我一直在努力解决在 C 中编写一个小程序的一个非常简单的问题。
只要输入的大小不超过1024字节,通过fgets()
获取输入(命令,参数,要执行的标志)就可以正常工作。输入1024个字符后,不再接受任何字符 - 提示就会停止。我假设问题的原因并不在于fgets()
参数/配置,因为否则它至少会使输入达到定义的大小而不是阻塞。
如果只fgets()
(_SC_LINE_MAX
)字节/字符,<{1}}如何接受行?
答案 0 :(得分:6)
正如我在评论中所指出的,几乎可以肯定的是,您的终端驱动程序不会允许您输入超过1024字节的行;它不会分配更多存储空间。这适用于规范&#39;模式;有关详细信息,请参阅Canonical vs non-canonical terminal input。
这是一个简单的测试程序(现在在问题中)。当我在Mac OS X 10.11.4上运行它时,我可以输入1023个字符加上换行符,或1024个字符但没有换行符,直到我删除它。
对于记录,输入字符串为:
12345678901234567890123456789X123456789Y123456789Z123456789A123456789B123456789C123456789D123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123456789r123456789s123456789t123456789u123456789v123456789w123456789x123456789y123456789z123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m123456789n123456789o123456789p123456789q123
如果您使用换行符复制并粘贴它,则可能会输入OK。如果你再添加任何字符,你可能会让终端向你发出哔哔声。
另一个问题(fgets()
is limited to 1024 bytes — what can I use instead?)几乎肯定会遇到同样的问题 - 并且在提供有用帮助的方式上并没有给予太多帮助。
如果您使用诸如GNU readline
库之类的库,它可以将终端置于非规范模式,然后可以处理更长的行,因为终端驱动程序不会等到输入换行符在将数据发送到程序之前。重建内核对终端输入行长度有一个更大的限制,名义上是Linux类系统的一个选项,但不是休闲程序员的任务。
LINE_MAX
及相关宏另请注意,_SC_LINE_MAX
是用于确定LINE_MAX
的{{3}}代码,该代码必须至少为{POSIX2_LINE_MAX}
(最小2048)的值,并将其记录为:
除非另有说明,否则当实用程序被描述为处理文本文件时,实用程序的输入行(标准输入或其他文件)的最大长度(以字节为单位)。长度包括尾随
<newline>
的空间。
请注意,终端不是文本文件。此限制表示grep
之类的实用程序不得错误处理长度为2048字节的行,但它可能会被较长的行混淆(例如,因为它读取了一行的2048字节块,并且&#39 ;行的开头&#39;在长行的第二个或后续块的开头匹配。)
POSIX的基本原理说明:
{LINE_MAX}
除非另有说明,否则这是影响所有公用事业的全局限制。来自POSIX.1-2008的系统接口卷的
{MAX_CANON}
值可能进一步限制来自终端的输入线。{LINE_MAX}
值是争论的主题,并且是那些希望拥有无限线条的人与那些理解许多历史实用程序都是用固定缓冲区编写的人之间的妥协。实用程序编写者经常选择UNIX系统常量BUFSIZ来分配这些缓冲区;因此,对于I / O线,一些实用程序限制为512字节,而其他实用程序则达到4096字节或更高。应该注意
{LINE_MAX}
仅适用于输入行长度; POSIX.1-2008中没有要求限制输出线的长度。awk
,sed
和paste
等实用程序理论上可以构造比它们收到的任何输入行更长的行,具体取决于使用的选项或应用程序的指令。他们不需要将输出截断为{LINE_MAX}
。应用程序负责处理此问题。如果将其中一个实用程序的输出通过管道传输到另一个标准实用程序中,则必须考虑行长度限制;除其他外,fold
实用程序可用于确保只有合理的行长度才能到达实用程序或应用程序。
引用的{MAX_CANON}
描述为:
{MAX_CANON}
终端规范输入行中的最大字节数 最低可接受价值:
{_POSIX_MAX_CANON}
在其他地方(<limits.h>
),_POSIX_MAX_CANON
的最低可接受值为255.