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

标签 linux windows 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:$value 对?”

也就是说:一个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 的原因是我有足够的内存(16GB),我的 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 扩展到一百万个参数,即使未扩展的命令行 ls */*/*.c 非常短,您也会遇到麻烦(至少在 Posix 和 Linux 上)。

在 Windows 和 MS-DOS 上,有传言说运行时库会将命令行扩展为一个参数列表。我听说程序以未解释的终端命令启动,一些运行时启动的东西正在做扩展。

所以回答你的问题:在 Posix 系统上,重要的是扩展参数列表,如果扩展参数列表小于 32K 字节,你很可能非常安全(实际上 128Kbyte 就足够了)。在 Windows 或 MS-DOS(我猜)上,您可能需要将未扩展的命令行限制为 128 个字符,并将其扩展为 64Kbytes(实际上更大的阈值通常会起作用)。我真的认为你应该总是测试system

的结果

关于linux - perl 中的系统命令行最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176089/

相关文章:

perl - 在 perl 中添加哈希时遇到问题

c# - 使用 C# 开发的 Windows 服务锁定和解锁文件夹

在 C 程序 (Visual Studio) 中正确放置 volatile 修饰符

windows - 如何防止 Windows XP 窃取我用于 Emacs 的输入 Ctrl-Space?

linux - 我们如何识别与特定关键字或终端中的字符串匹配的文件中的行号?

perl - 获取执行perl的输出

perl - 在perl中如何在不使用XS的情况下写入调用者的变量?

java - 终端 - 在后台运行java应用程序以及如何关闭它?

linux - 对于没有密码的 ssh,两种方式都是正确的

python - Linux - 显示一些命令的内存