GNU/Linux >> Tutoriels Linux >  >> Linux

limite de longueur de chaîne de fonction system()

system exec est un shell avec des arguments "sh","-c", YourAgumentToSystem, (char*)0 (garanti par POSIX), donc la longueur maximale (sans compter les '\0' terminateur) est ARG_MAX -1 -3 -3 - size_of_your_environment .

ARG_MAX est défini dans limits.h comme

"Longueur maximale des arguments des fonctions exec, y compris les données d'environnement."

Si limits.h , ne définit pas ARG_MAX , vous devriez pouvoir appeler le sysconf(_SC_ARG_MAX) pour obtenir une limite d'exécution.

La page de manuel Linux pour execve (appelé par le système) fournit plus d'informations :

Sous Linux avant le noyau 2.6.23, la mémoire utilisée pour stocker les chaînes d'environnement et d'arguments était limitée à 32 pages (définies par la constante du noyau MAX_ARG_PAGES). Sur les architectures avec une taille de page de 4 Ko, cela donne une taille maximale de 128 Ko.

Sur le noyau 2.6.23 et supérieur, la plupart des architectures supportent une limite de taille dérivée de la limite de ressources soft RLIMIT_STACK (voir getrlimit(2)) qui est en vigueur au moment de l'appel à execve(). (Les architectures sans unité de gestion de mémoire sont exceptées :elles maintiennent la limite qui était en vigueur avant le noyau 2.6.23.) Ce changement permet aux programmes d'avoir une liste d'arguments et/ou d'environnements beaucoup plus grande. Pour ces architectures, la taille totale est limitée à 1/4 de la taille de pile autorisée. (Imposer la limite de 1/4 garantit que le nouveau programme a toujours de l'espace de pile.) Depuis Linux 2.6.25, le noyau place un plancher de 32 pages sur cette limite de taille, de sorte que, même lorsque RLIMIT_STACK est défini très bas, les applications sont garanties pour avoir au moins autant d'arguments et d'espace d'environnement que ceux fournis par Linux 2.6.23 et les versions antérieures. (Cette garantie n'était pas fournie dans Linux 2.6.23 et 2.6.24.) De plus, la limite par chaîne est de 32 pages (la constante du noyau MAX_ARG_STRLEN) et le nombre maximum de chaînes est de 0x7FFFFFFF.

Pour mesurer la taille de votre environnement, vous pouvez exécuter :

extern char **environ;
size_t envsz = 0; for(char **e=environ; *e; e++) envsz += strlen(*e)+1;

(Comme Zan Lynx l'a souligné dans les commentaires, cela peut être accéléré (cca 20 fois selon mes mesures - de 1600ns à 80ns pour l'environnement de 100 chaînes de 6 Ko que j'avais lors de la mesure) si vous supposez le char* pointeurs en environ pointent vers un tampon contigu, ce qu'ils font après le démarrage d'un programme, mais appellent setenv , putenv , ou unsetenv cassent généralement ceci :

extern char **environ;
char **e; for(e=environ; *e; e++) {}
size_t envsz =  ($_sz)(e[-1]+strlen(e[-1])+1 - *environ);

Dans tous les cas, l'accélération au détriment de la robustesse ne devrait pas avoir beaucoup d'importance si vous vous attendez à fork+exec (/system) bientôt, étant donné que fork+exec coûte généralement au moins environ 1 à 2 ms sous Linux sur un système moderne. machine.)


La limite dépend fortement du système. Cela peut même dépendre du shell de commande qui sera utilisé. Vous devriez tester la valeur de retour de system() pour voir si l'appel système a réussi :-1 signifie échec et errno devrait vous donner plus d'informations. Le comportement doit être défini pour toute chaîne C appropriée.

Documents POSIX qui system(command) est équivalent à :

execl(<shell path>, "sh", "-c", command, (char *)0);

Et aussi les documents ARG_MAX défini dans <limits.h> comme limite pour les longueurs combinées des arguments à exec et les variables d'environnement.

Notez cependant que command peut contenir des caractères génériques et/ou d'autres mots shell dont l'expansion peut dépasser une autre limite. Vérifiez toujours la valeur de retour en cas d'échec.


Linux
  1. Journaux système NG

  2. Exemples de manipulation de chaînes Bash - Longueur, sous-chaîne, rechercher et remplacer

  3. Pourquoi mon chat fonctionne-t-il plus lentement avec les appels système que le chat de Linux ?

  4. Appel système fork() et fonction execv

  5. Valeur de retour de x =os.system(..)

Comment utiliser les fonctions de chaîne MySQL

Configuration système requise pour Kali Linux

Fonctions bash

Comment limiter l'accès de l'utilisateur au système Linux

Limiter le nombre de connexions SSH par utilisateur/groupe/système

Le temps du système