Об аргументах командной строки основной функции - PullRequest
6 голосов
/ 21 сентября 2011

Это будет выглядеть как int main(int argc, char *argv[]);. Мои вопросы:

1 Сколько элементов массива я могу добавить в argv[]?

2 Каков максимальный размер каждого char *?

Ответы [ 4 ]

4 голосов
/ 21 сентября 2011

Вы можете попробовать:

$ 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 голосов
/ 21 сентября 2011

Оба они ограничены только тем, сколько у вас памяти (или сколько памяти ваша ОС предоставляет вашей программе).

РЕДАКТИРОВАТЬ: На самом деле количество аргументов также ограничено размером int.

0 голосов
/ 21 сентября 2011

Вероятно, это зависит от механизма, который вы используете для запуска вашей программы. Если это через оболочку (bash или что-то еще), вам придется искать, если это накладывает ограничения.

Если вы запускаете вашу программу через execv или что-то подобное, на них должны распространяться те же ограничения, что и на любой массив и строку, и, как кто-то заметил, поскольку argc по историческим причинам равно int, ограниченный размер int не size_t.

0 голосов
/ 21 сентября 2011

Я думаю, вы не понимаете, что здесь происходит. В своем коде вы ничего не добавляете в argv [] и не беспокоитесь об их максимальных размерах. Когда кто-то запускает вашу скомпилированную программу, как

./javas_program argument1 argument2 argument3

тогда будет вызвана ваша основная функция. argc будет 4, argv[0] будет ./javas_program, argv[1] будет argument1, argv[2] будет argument2 и т. Д.

В вашей программе вы должны предполагать, что содержимое argv[] может быть любого размера. Если вы хотите ограничить их определенным размером, убедитесь, что они не больше этого размера.

...