簡體   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