Respostas
- Definitivamente não é um bug.
-
O parâmetro que define o tamanho máximo para um argumento é
MAX_ARG_STRLEN
. Não há documentação para esse parâmetro além dos comentários embinfmts.h
:/* * These are the maximum length and maximum number of strings passed to the * execve() system call. MAX_ARG_STRLEN is essentially random but serves to * prevent the kernel from being unduly impacted by misaddressed pointers. * MAX_ARG_STRINGS is chosen to fit in a signed 32-bit integer. */ #define MAX_ARG_STRLEN (PAGE_SIZE * 32) #define MAX_ARG_STRINGS 0x7FFFFFFF
Como mostrado, o Linux também tem um limite (muito grande) no número de argumentos para um comando.
-
Um limite no tamanho de um único argumento (que difere do limite geral de argumentos mais ambiente) parece ser específico para o Linux. Este artigo oferece uma comparação detalhada de
ARG_MAX
e equivalentes em sistemas semelhantes a Unix.MAX_ARG_STRLEN
é discutido para o Linux, mas não há menção de nenhum equivalente em nenhum outro sistema.O artigo acima também afirma que
MAX_ARG_STRLEN
foi introduzido no Linux 2.6.23, junto com várias outras mudanças relacionadas ao comando maximum dos argumentos (discutido abaixo). O log / diff para o commit pode ser encontrado aqui . -
Ainda não está claro o que explica a discrepância adicional entre o resultado de
getconf ARG_MAX
e o tamanho real máximo possível dos argumentos mais o ambiente. A resposta relacionada de Stephane Chazelas , sugere que parte do espaço é explicada por ponteiros para cada um dos argumentos / ambiente cordas. No entanto, minha própria investigação sugere que esses ponteiros não são criados no início da chamada do sistemaexecve
quando ainda pode retornar um erroE2BIG
para o processo de chamada (embora os ponteiros para cada stringargv
sejam certamente criados posteriormente). / p>Além disso, as seqüências de caracteres são contíguas na memória, tanto quanto eu posso ver, por isso não há intervalos de memória devido ao alinhamento aqui. Embora seja muito provável que seja um fator dentro de qualquer que use a memória extra. Entender o que usa o espaço extra requer um conhecimento mais detalhado de como o kernel aloca memória (que é um conhecimento útil para se ter, então eu investigarei e atualizarei mais tarde).
ARG_MAX Confusão
Desde o Linux 2.6.23 (como resultado de este commit ), houve mudanças no modo como os valores máximos do argumento do comando são manipulados, o que faz o Linux diferir de outros sistemas do tipo Unix. Além de adicionar MAX_ARG_STRLEN
e MAX_ARG_STRINGS
, o resultado de getconf ARG_MAX
agora depende do tamanho da pilha e pode ser diferente de ARG_MAX
em limits.h
.
Normalmente, o resultado de getconf ARG_MAX
será 1/4
do tamanho da pilha. Considere o seguinte em bash
usando ulimit
para obter o tamanho da pilha:
$ echo $(( $(ulimit -s)*1024 / 4 )) # ulimit output in KiB
2097152
$ getconf ARG_MAX
2097152
No entanto, o comportamento acima foi alterado ligeiramente por este commit (adicionado no Linux 2.6.25-rc4 ~ 121).
ARG_MAX
in limits.h
agora serve como um limite inferior rígido no resultado de getconf ARG_MAX
. Se o tamanho da pilha estiver definido de forma que 1/4
do tamanho da pilha seja menor que ARG_MAX
em limits.h
, o valor limits.h
será usado:
$ grep ARG_MAX /usr/include/linux/limits.h
#define ARG_MAX 131072 /* # bytes of args + environ for exec() */
$ ulimit -s 256
$ echo $(( $(ulimit -s)*1024 / 4 ))
65536
$ getconf ARG_MAX
131072
Observe também que, se o tamanho da pilha for menor que o mínimo possível ARG_MAX
, o tamanho da pilha ( RLIMIT_STACK
) se tornará o limite superior de argumento / ambiente antes que E2BIG
seja retornado (embora getconf ARG_MAX
ainda mostrará o valor em limits.h
).
Uma última observação a ser feita é que, se o kernel for construído sem CONFIG_MMU
(suporte para hardware de gerenciamento de memória), a verificação de ARG_MAX
será desativada, portanto, o limite não se aplica. Embora MAX_ARG_STRLEN
e MAX_ARG_STRINGS
ainda se apliquem.
Leitura adicional
- Resposta relacionada de Stephane Chazelas - link
- Na página detalhada que abrange a maioria dos itens acima. Inclui uma tabela de valores
ARG_MAX
(e equivalentes) em outros sistemas semelhantes a Unix - link - Aparentemente, a introdução de
MAX_ARG_STRLEN
causou um erro no Automake, que estava embutindo scripts shell em Makefiles usandosh -c
- link