关于main函数的命令行参数

7

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

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

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


1
我认为这取决于具体实现,你不能依赖于任何特定的限制。 - Vlad
1
如果你需要传递如此多的参数,以至于你需要考虑这些上限,那么你可能做错了什么。你可能需要一些形式的IPC(进程间通信)。 - Tamás Szelei
1
但是,你为什么需要这些信息呢?如果你需要的话,也许你正在做一些错误的事情。 - Vlad
1 我使用Linux。 2 我将通过PHP脚本使用exec()向它传递大量信息。 3 我认为使用文件交换数据比使用主函数的参数会花费更多时间。谢谢。 - javas
@javas:文件不是唯一的IPC形式,例如您可以使用popen通过管道写入大量数据。但在Linux上,命令行允许非常长,以支持诸如ls *log之类的操作。 - Steve Jessop
4个回答

4
您可以尝试:
$ 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特定的限制在内核中硬编码

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

3

这两者仅受内存限制(或操作系统分配给程序的内存)的限制。

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


2
或者您的操作系统为命令行提供了多少内存(在大多数操作系统中,这相当有限,并且有时非常硬编码)。 - PlasmaHH
我认为这个答案在回答“char*的最大大小是多少”,而询问者可能由于误解而询问argv[]中char*的最大大小。 - Jon Bright
Windows 给你的内存非常少(有时候甚至只是几 kB 的命令行参数就会导致它崩溃),而所有的 Unix 平台都非常慷慨,如果你需要更多的话,那么你做错了。 - Nicholas Wilson

0

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

./javas_program argument1 argument2 argument3

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

在你的程序中,你应该假设argv []的内容可以是任何大小。如果你想限制它们的大小,你应该检查它们是否超过了限制。


0

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

如果您通过 execv 或类似方法启动程序,则它们应该仅受到与任何数组和字符串相同的限制,并且正如某些人指出的那样,由于 argc 基于历史原因是 int,因此受到 int 而不是 size_t 的有限大小限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接