繁体   English   中英

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

[英]system command line max length in perl

为了减少发出的命令数量,我需要在perl语句中添加尽可能多的字符

system("$cmd_and_parameters")

在Windows和Linux下,我可以假设(安全)最大线路长度是多少?

我的问题是由于需要发出Oetiker“rrdtool套件”的命令, 而不使用正确的perl模块(请不要因此而责怪我)。

我的第一次尝试是使用前面提到的功能,设置

$cmd_and_parameters = "path_to_rrdtool/rrdtool update $db $timestamp:$value" 

考虑到我必须做的更新次数,它可以工作,但速度很慢。

因此,当“rrdtool update”允许时,我决定将参数数量增加到允许的最大值,从而减少“系统”调用的数量。

使用合理的少量参数,它可以更好地工作,无论如何它对我的需求来说已经足够好了,但仍然是一个问题“我可以在系统函数中添加多少$ timestamp:$值对夫妻?

也就是说:perl系统函数中可以有多少个字符?

在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完成的,而系统(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的结果

Basile几乎已经对Linux的答案做出了最终的回答。

Windows NT和相关版本(这意味着不是Windows 95,98或ME - 它们,我认为仅限于128个字符,包括命令名称)具有2047或8191个字符的命令行。 http://support.microsoft.com/kb/830473

除非你真的需要支持古老的(12岁以上)版本的Windows,否则2KB减去一点就应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM