为了减少发出的命令数量,我需要在perl语句中添加尽可能多的字符
system("$cmd_and_parameters")
在Windows和Linux下,我可以假设的(安全)最大线路长度是多少?
我的问题是由于需要使用正确的perl模块发出Oetiker“rrdtool suite”的命令,没有(请不要因此而责怪我)。
我的第一次尝试是使用前面提到的功能,设置
$cmd_and_parameters = "path_to_rrdtool/rrdtool update $db $timestamp:$value"
它有效,但考虑到我必须做的更新次数,它很慢。
因此,正如“rrdtool update”允许的那样,我决定将参数数量增加到允许的最大数量,从而减少“系统”调用的数量。
使用合理的少量参数,它的效果要好得多,无论如何它对我的需求来说已经足够好了,但仍然是“多少$ timestamp:$ values我可以把系统函数放在哪里?
也就是说:perl系统函数中可以有多少个字符?
答案 0 :(得分:10)
在Linux上,限制为ARG_MAX
(您可以使用getconf ARG_MAX
查询)。我习惯于编辑内核的限制(例如在linux-3.7.1/include/uapi/linux/limits.h
中增加它)。
(请注意,setrlimit(2) RLIMIT_STACK
实际上可能会降低程序参数的最大大小)
某些Linux内核(特别是旧内核或嵌入式内核)具有下限。你应该准备好它可能低至32768(在我自己的内核上我将它提升到2097152)。
我提出ARG_MAX
的原因是我有足够的RAM(16Gbytes),我的shell是zsh
而且我喜欢在我想要的时候输入**/*.c
(从而避免find
)
阅读execve(2) Linux手册页和Posix exec文档。 Linux手册页有几段关于参数大小和环境的限制。
在Windows上(或至少在MS-DOS上)它可能低至128(在扩展之前)。
你应该明白,论证扩展是(在Posix& Linux系统上)由shell完成的,system(3)和Perl这个名称的函数可能正在启动/bin/sh -c
,它将执行扩张。重要的是扩展参数列表的大小:所以如果你调用system("ls */*/*.c")
并且*/*/*.c
扩展到一百万个参数,你就会遇到麻烦(至少在Posix和Linux上),即使未展开的命令行也是如此ls */*/*.c
非常短暂。
在Windows和MS-DOS上,传闻运行时库将命令行扩展为参数列表。我听说程序以未解释的终端命令开始,并且一些运行时启动事情正在进行扩展。
所以回答你的问题:在Posix系统上,重要的是扩展的参数列表,如果扩展的参数列表小于32K字节,你很可能非常安全(实际上128Kbyte就足够了)。在Windows或MS-DOS上(我猜这个)你可能需要将未扩展的命令行限制为128个字符,并将其扩展到64K字节(实际上更大的阈值通常会起作用)。我真的认为你总是测试system
答案 1 :(得分:2)
Basile几乎已经确定地回答了Linux的答案。
Windows NT及相关版本(这意味着不是Windows 95,98或ME - 它们,我认为仅限于128个字符,包括命令名称)具有2047或8191个字符的命令行。 http://support.microsoft.com/kb/830473
除非你真的需要支持古老的(12岁以上)版本的Windows,否则2KB减去一点就应该没问题。