Duplicaté possible: strong>
sur les arguments de ligne de commande de la fonction principale P> blockQuote>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? P>
4 Réponses :
Dans un système POSIX, il existe une valeur, C'est souvent 256 kib. p>
Les données dans empiriquement, vous constaterez souvent que les données immédiatement après la fin de la chaîne arg_max code> défini dans
avec une valeur minimale acceptable de _posix_arg_max code> (qui est 4096). Vous pouvez découvrir la valeur au moment de l'exécution via le
SYSCONF () Code>
fonction avec le paramètre sc_arg_max code>. p>
argv code> (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 () code> sans invoquer un comportement non défini. Des fonctions telles que GNU
GETOPT () CODE> 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 code> comme indiqué sur
MAIN () CODE>. P>
argv [argc-1] code> 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) CODE> Dans certains systèmes (reconnu comme une extension de l'annexe J standard C, §J.5.1) , où
envple code> est la même valeur que celle stockée dans la variable globale
environ code> et est le début d'une gamme de pointeurs à terminaison null sur les chaînes d'environnement. P >
Je pourrais me tromper, mais je pense que Argc et Argv appartiennent à Peut être utile :) p>
qui appelle la principale? P>
Vous pouvez appeler principal () code> 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 () code> est appelée la première fois.
principal () code> avec ce que vous voulez ... p>
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 () code>, il existe des garanties telles que
argc> = 1 code> et
argv [argc] == 0 code>; Lorsque vous l'appelez, vous pouvez imposer des règles que vous aimez, de sorte que votre appel
1 code> 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 () code> est appelée la première fois".
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> Ce n'est que l'appel système 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> Il existe différentes façons d'apprendre la limite supérieure P> Contrairement aux en-têtes, Exemple d'utilisation de arg_max code> est la longueur maximale des arguments pour un nouveau processus
exécuté () code> et ses variantes directes, ce qui donnera cette erreur. Ils renvoient la condition d'erreur correspondante E2BIG (). P>
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>
SYSCONF () CODE>: P>
expr `getconf ARG_MAX` - `env|wc -c` - `env|wc -l` \* 4 - 2048
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.