系统命令行perl中的最大长度

时间:2013-01-05 20:28:06

标签: linux windows perl

为了减少发出的命令数量,我需要在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系统函数中可以有多少个字符?

2 个答案:

答案 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减去一点就应该没问题。