关于 main 函数的命令行参数

Posted

技术标签:

【中文标题】关于 main 函数的命令行参数【英文标题】:About command line arguments of main function 【发布时间】:2011-11-21 20:52:37 【问题描述】:

它看起来像int main(int argc, char *argv[]);。我的问题是:

1 我可以在argv[] 中添加多少个数组项?

2 每个char * 的最大大小是多少?

【问题讨论】:

我认为它依赖于实现,你不能依赖任何特定的界限。 如果你需要传递这么多参数以至于你需要考虑这些上限,你可能做错了什么。您可能需要某种形式的 IPC。 但是为什么您需要这些信息?如果你需要,也许你做错了什么。 1 我使用 linux 2 我将通过 php 脚本使用 exec() 将大量信息传递给它。 3 我认为使用文件交换数据会比使用主函数的参数花费更多的时间。谢谢 @javas:文件不是IPC的唯一形式,例如您可以使用popen并通过管道写入大量数据。但是在 linux 上,命令行无论如何都允许很长,以支持 ls *log 之类的东西。 【参考方案1】:

你可以试试:

$ getconf ARG_MAX
2180000

http://pubs.opengroup.org/onlinepubs/007904975/basedefs/limits.h.html

ARG_MAX 是 exec 函数的最大参数长度,包括环境数据。

也就是说,参数的数量或参数的长度没有单独的限制。只有存储所有参数和环境变量所需的总大小限制。

xargs 使用sysconf(_SC_ARG_MAX); 计算出最大命令行长度,它产生的值与getconf ARG_MAX 报告的值相同。

在 Linux 上,命令行参数和环境变量被放入新进程的堆栈中。因此,进程/线程最大堆栈大小是最终上限。 Linux 特定的限制是 hardcoded in the kernel:

#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define MAX_ARG_STRINGS 0x7FFFFFFF

【讨论】:

【参考方案2】:

这两者仅受您拥有多少内存(或您的操作系统为您的程序提供多少内存)的限制。

编辑:实际上,参数的数量也受int 的大小限制。

【讨论】:

或者你的操作系统为 cmd 行提供了多少内存(这在大多数操作系统中非常有限,有时非常硬编码) 我认为这个答案是在回答“任何 char* 的最大大小是多少”,而提问者可能是由于误解,在问 char*s 的最大大小是多少argv[] 是。 Windows 为您提供的内存非常少(有时它只占用几 kB 的命令行参数),而所有 Unix 平台都非常慷慨,如果您需要更多内存,那就错了。 【参考方案3】:

我认为你误解了这里发生的事情。您无需在代码中向 argv[] 添加任何内容,也不必担心它们的最大大小。当有人运行你编译好的程序时,就像

./javas_program argument1 argument2 argument3

然后你的主函数将被调用。 argc 将是 4,argv[0] 将是 ./javas_programargv[1] 将是 argument1argv[2] 将是 argument2,等等。

在您的程序中,您应该假设argv[] 的内容可以是任意大小。如果要将它们限制为特定大小,则应检查它们是否大于该大小。

【讨论】:

【参考方案4】:

这可能取决于您用于启动程序的机制。如果是通过 shell(bash 或其他),您必须查找它是否施加了限制。

如果你通过execv 或类似的东西启动你的程序,它们应该只受到与任何数组和字符串相同的限制,并且正如有人指出的那样,因为argcint 出于历史原因, int 不是size_t 的有限大小。

【讨论】:

以上是关于关于 main 函数的命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

main函数

Java中eclipse与命令行向main函数传递参数

C程序获取命令行参数

第33课 main函数与命令行参数

什么是命令行参数?本人是c++菜鸟

C之main函数和命令行参数(三十)