它看起来像这样:int main(int argc, char *argv[]);
。我的问题是:
1. 在argv[]
中可以添加多少个数组项?
2. 每个char *
的最大大小是多少?
它看起来像这样:int main(int argc, char *argv[]);
。我的问题是:
1. 在argv[]
中可以添加多少个数组项?
2. 每个char *
的最大大小是多少?
$ 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
这两者仅受内存限制(或操作系统分配给程序的内存)的限制。
编辑:实际上,参数数量还受到int
大小的限制。
char*
的最大大小。 - Jon Bright我认为你误解了这里发生的事情。在你的代码中,你不会向argv[]添加任何内容,也不必担心它们的最大大小。当有人运行你编译的程序时,
./javas_program argument1 argument2 argument3
然后你的主函数将被调用。argc
将是4,argv [0]
将是./javas_program
,argv [1]
将是argument1
,argv [2]
将是argument2
等。
在你的程序中,你应该假设argv []
的内容可以是任何大小。如果你想限制它们的大小,你应该检查它们是否超过了限制。
这可能取决于您用于启动程序的机制。如果是通过 shell(bash
或其他)启动,则必须查看它是否施加了限制。
如果您通过 execv
或类似方法启动程序,则它们应该仅受到与任何数组和字符串相同的限制,并且正如某些人指出的那样,由于 argc
基于历史原因是 int
,因此受到 int
而不是 size_t
的有限大小限制。
popen
通过管道写入大量数据。但在Linux上,命令行允许非常长,以支持诸如ls *log
之类的操作。 - Steve Jessop