6
votes

Pourquoi les arguments ARGV et ENVP n'exécutent-ils pas les pointeurs à construire?

prendre par exemple. Execre (2), qui, selon POSIX, ce prototype [1]: xxx

à moi, il semble que xxx

serait ont été une amélioration évidente.

Alors, est-ce que quelqu'un sait pourquoi c'est tel qu'il est? Qu'est-ce qui peut expliquer le besoin Pour manipuler éventuellement les chaînes ARGV / ENVP données données?

[1] http://pubs.opengroup.org/onlinepubs/009695399/fonctions/exec.html


5 commentaires

[En réponse à vos commentaires sur ma réponse supprimée] Oh, je vois ce que vous voulez dire - oui, ma réponse aborde les arguments de principal , pas les arguments de argv . C'est vraiment une question de l'API C, pas une question de conception de système UNIX. Je pense que la réponse est simplement une compatibilité historique avec les API d'origine, pré-const.


Étant donné que des questions sur l'API C (par opposition à la conception du système général) sont hors tension ici, je vote de migrer vers débordement de pile . (Ne pas republier, la question sera déplacée bientôt.)


Vraisemblablement certains programmes mutaient ces tampons


Ce tampon peut en effet être muté dans le nouveau processus, mais ce serait de l'autre côté de l'exécutant, avec une nouvelle mise en page de mémoire qui n'a rien à voir avec le processus qui envoie ces arguments au noyau avant que l'exécutif ne se produise.


Vient de trébucher sur la même chose en regardant POSIX_SPOWN. Chainging l'API à Const Char ** ou const Char * Const * ne devrait même pas casser les implémentations existantes. Pour utiliser ces méthodes avec la signature donnée, je dois soit copier les tableaux ARGV et ENVP ou simplement les jeter et espérer que rien ne va mal ... Dommage!


3 Réponses :


-1
votes

Certains programmes manipulent les chaînes ARGV afin que PS montrent certaines informations de l'état. Par exemple: xxx

par conséquent, les valeurs ARGV ne sont pas constantes et ne doivent pas être déclarées telles.


1 commentaires

Vraisemblablement, cependant, ces programmes modifient la copie des chaînes ARGV dans leur espace d'adresse propre , pas l'espace d'adressage du processus qui appelé exécut .



2
votes

Le argv code> et ENVP code> Les arguments sur Execve () code> ne sont pas des pointeurs sur const code> afin de préserver l'arrière Compatibilité avec code C valide qui a été écrit avant const code> a été ajouté à C.

C est d'abord apparu en 1972 . Plus tard, const code> a été ajouté à C en 1987. p>

Afin de Maintenir la compatibilité avec le code pré- Const code>, la déclaration mise à jour - const code> déclaration de Execve () code> doit pouvoir accepter le non- const code> entrées. C Ne permet pas aux affectations de char * [] code> à const char * [] code>. Cela peut être vérifié en essayant (et en échec) de compiler le programme suivant: p> xxx pré>

par conséquent, char * cons [] code> est le type le plus strict est compatible vers l'arrière avec le code pré- Const code>. p>

La question fournit un lien vers la documentation POSIX pour Execve () code>. La documentation liée à POSIX explique cela comme suit: P>

La déclaration sur argv [] code> et Envple [] code> être constantes est incluse à faire explicite aux futurs écrivains des liaisons de langue que celles-ci Les objets sont complètement constants. En raison d'une limitation de l'ISO C Standard, il n'est pas possible d'indiquer cette idée dans la norme C. ... p> blockquote>

En fait, pour être précis: il n'est pas possible d'indiquer cette idée d'une manière compatible avec pré- const code> code em>. p>

... spécifiant deux niveaux de const code> - qualification em> pour le argv [] code> et envple [] code> paramètres pour les fonctions EXED em> peut sembler être le naturel choix, étant donné que ces fonctions ne modifient pas non plus la matrice de les pointeurs ou les caractères auxquels la fonction pointe, mais cette interdireait le code correct existant. Au lieu de cela, seul le tableau de Les pointeurs sont notés comme constants. La table de compatibilité de la mission pour dst = src em> dérivé de la norme ISO C résume la Compatibilité: p>

        dst:          char *[]   const char *[]   char *const[]   const char *const[]
src:
char *[]               VALID           -              VALID               -
const char *[]           -           VALID              -               VALID 
char * const []          -             -              VALID               - 
const char *const[]      -             -                -               VALID


0 commentaires

0
votes

Ceci est essentiellement dû au trou de la norme C empêchant la conversion implicite de t ** sur const t * const * . Une telle conversion serait sûre (une conversion de t ** sur const t ** serait problématique), mais la norme n'a pas été mise à jour pour le permettre.

citations MPB de la norme POSIX

La déclaration sur ARGV [] et l'ENVP [] étant des constantes est incluse pour rendre explicite aux futurs rédateurs de liaisons de langue que ces objets sont complètement constants. En raison d'une limitation de la norme ISO C, il n'est pas possible d'indiquer cette idée dans la norme C.

qui implique que la norme POSIX sera modifiée lorsque / si la norme C est toujours mise à jour.


0 commentaires