2

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

4

2 回答 2

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(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,您也会遇到麻烦(至少在 Posix 和 Linux 上) 。ls */*/*.c

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

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

于 2013-01-05T20:37:18.400 回答
2

Basile 已经非常明确地回答了 Linux 的答案。

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

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

于 2013-01-05T23:03:37.983 回答