关于 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_program
,argv[1]
将是 argument1
,argv[2]
将是 argument2
,等等。
在您的程序中,您应该假设argv[]
的内容可以是任意大小。如果要将它们限制为特定大小,则应检查它们是否大于该大小。
【讨论】:
【参考方案4】:这可能取决于您用于启动程序的机制。如果是通过 shell(bash
或其他),您必须查找它是否施加了限制。
如果你通过execv
或类似的东西启动你的程序,它们应该只受到与任何数组和字符串相同的限制,并且正如有人指出的那样,因为argc
是int
出于历史原因, int
不是size_t
的有限大小。
【讨论】:
以上是关于关于 main 函数的命令行参数的主要内容,如果未能解决你的问题,请参考以下文章