В Linux константа ARG_MAX определена в файле include/linux/limits.h, где так и написано 131072 байтов (это на переменные окружения и аргументы командной строки вместе).
Где-то между 2.6.22 и 2.6.23 ситуация немного изменилась, посмотрев в функцию get_arg_page(), что в файле fs/exec.c, можно заметить, что теперь размер ограничен четвертью стека, и, следовательно, может быть неограничен вовсе, т.к. размер стека может быть изменен перед запуском процесса, используя команду ulimit -s.
Простенький скрипт позволяющий поиграть с размером области для аргументов. Будет работать только на системах с ядрами новее, чем 2.6.23. На более старых всегда будет один и тот же результат — 131072.
#!/bin/sh
EXEBIN=/bin/true
pattern=$(perl -e 'print ("x" x 4095)."\n";')
ulimit -s $1
ulimit -s
arg=$pattern
while $EXEBIN $arg
do
echo -n .
arg="$arg $pattern"
done
echo $? ${#arg}
Комментариев нет:
Отправить комментарий