10
votes

C argv Quelle est la taille maximale des données

Duplicaté possible:

sur les arguments de ligne de commande de la fonction principale

Comment puis-je déterminer quelle taille maximale des données que je pourrais passer dans un article C (int Argc, char * argv)? Y a-t-il une macro quelque part dans la norme qui définirait cela? Est-ce que les données "possédées" par le processus principal (c'est-à-dire mon programme stocke ces données) ou est-ce en quelque sorte "propriété" par le système d'exploitation et je peux simplement obtenir un pointeur?


2 commentaires

Il peut différer grandement en fonction du système que vous exécutez le programme. Consultez ma réponse pour référence et comment trouver la limite de votre système


À propos du duplicata, le titre du lien en double ne contient pas suffisamment d'informations spécifiques à trouver. Cependant, la réponse acceptée répond également à cette question.


4 Réponses :


11
votes

Dans un système POSIX, il existe une valeur, arg_max défini dans avec une valeur minimale acceptable de _posix_arg_max (qui est 4096). Vous pouvez découvrir la valeur au moment de l'exécution via le SYSCONF () fonction avec le paramètre sc_arg_max .

C'est souvent 256 kib.

Les données dans argv (la gamme de pointeurs et des chaînes qu'elles pointues de) sont "possédées" par le programme. Ils peuvent être modifiés; Que cela soit sensible dépend de votre point de vue. Vous ne pouvez certainement pas sortir des limites de ce qui a été transmis à la fonction principale () sans invoquer un comportement non défini. Des fonctions telles que GNU GETOPT () Réorganisent les arguments lorsqu'ils sont exécutés sans la variable d'environnement POSIXLY_CORRYE définie dans l'environnement. Vous avez déjà un pointeur sur les données du argv comme indiqué sur MAIN () .

empiriquement, vous constaterez souvent que les données immédiatement après la fin de la chaîne argv [argc-1] est en réalité le début de l'environnement. Le programme principal peut être écrit comme Int Main (int Argc, Char ** argv, Char ** ENVP) Dans certains systèmes (reconnu comme une extension de l'annexe J standard C, §J.5.1) , où envple est la même valeur que celle stockée dans la variable globale environ et est le début d'une gamme de pointeurs à terminaison null sur les chaînes d'environnement.


0 commentaires

0
votes

Je pourrais me tromper, mais je pense que Argc et Argv appartiennent à __ libc_start_main dans libc.so.6
qui appelle la principale?

Peut être utile :)


0 commentaires

1
votes

principal () n'est pas spécial en ce qui concerne ce qu'il accepte. Ce qui est spécial est la magie qui se passe avant principal () est appelée la première fois.

Vous pouvez appeler principal () avec ce que vous voulez ... xxx


2 commentaires

Vous pouvez le faire en C; Vous ne pouvez pas faire cela en C ++ (et la question est étiquetée C afin que votre réponse soit correcte). Lorsque le système appelle principal () , il existe des garanties telles que argc> = 1 et argv [argc] == 0 ; Lorsque vous l'appelez, vous pouvez imposer des règles que vous aimez, de sorte que votre appel 1 est correct car vous l'avez fait, mais ne serait pas correct si le système l'a essayé.


C'est ce que je voulais dire avec la "magie spéciale qui se passe avant principal () est appelée la première fois".



5
votes

arg_max code> est la longueur maximale des arguments pour un nouveau processus

Vous verrez ce message d'erreur, si vous avez essayé d'appeler un programme avec trop d'arguments, c'est-à-dire le plus probable avec Correspondance des motifs: p> xxx pré>

Ce n'est que l'appel système exécuté () code> et ses variantes directes, ce qui donnera cette erreur. Ils renvoient la condition d'erreur correspondante E2BIG (). P>

Le shell n'est pas à blâmer, il suffit de vous donner cette erreur. En fait, l'expansion de Shell n'est pas un problème, car ICI EXEC () n'est pas nécessaire. L'expansion n'est limitée que par les ressources du système de mémoire virtuelle. P>

Ainsi, les commandes suivantes fonctionnent en douceur, car au lieu de remettre trop d'arguments à un nouveau processus, ils utilisent uniquement une coquille intégrée (ECHO ) ou itérer sur les arguments avec une structure de commande (pour boucle): p> xxx pré>

Il existe différentes façons d'apprendre la limite supérieure P>

: strong> getconf arg_max p>

Call System: strong> SYSCONF (_SC_ARG_MAX) P>

Header System: strong> arg_max dans EG P>

Contrairement aux en-têtes, SYSCONF CODE> ET GETCONF CODE> DITES LA LIMITE qui est réellement en vigueur. Cela est pertinent sur les systèmes qui permettent de la modifier au moment de l'exécution, par reconfiguration, En recompilant (par exemple Linux) ou en appliquant des correctifs (HP-UX 10). P>

Exemple d'utilisation de SYSCONF () CODE>: P>

 expr `getconf ARG_MAX` - `env|wc -c` - `env|wc -l` \* 4 - 2048


0 commentaires