prendre par exemple. Execre (2), qui, selon POSIX, ce prototype [1]: à moi, il semble que p> serait ont été une amélioration évidente. P> 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? p> [1] http://pubs.opengroup.org/onlinepubs/009695399/fonctions/exec.html p> p>
3 Réponses :
Certains programmes manipulent les chaînes ARGV afin que par conséquent, les valeurs ARGV ne sont pas constantes et ne doivent pas être déclarées telles. P> p> PS code> montrent certaines informations de l'état. Par exemple:
Vraisemblablement, cependant, ces programmes modifient la copie des chaînes ARGV dans leur espace d'adresse propre i>, pas l'espace d'adressage du processus qui appelé exécut code>.
Le C est d'abord apparu en 1972 . Plus tard, Afin de Maintenir la compatibilité avec le code pré- par conséquent, La question fournit un lien vers la documentation POSIX pour La déclaration sur En fait, pour être précis: il n'est pas possible d'indiquer cette idée d'une manière compatible avec pré- ... spécifiant deux niveaux de 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.
const code> a été ajouté à C en 1987. p>
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>
char * cons [] code> est le type le plus strict est compatible vers l'arrière avec le code pré-
Const code>. p>
Execve () code>. La documentation liée à POSIX explique cela comme suit: P>
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>
const code> code em>. p>
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
Ceci est essentiellement dû au trou de la norme C empêchant la conversion implicite de citations MPB de la norme POSIX P>
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. p>
blockQuote>
qui implique que la norme POSIX sera modifiée lorsque / si la norme C est toujours mise à jour. P> t ** code> sur
const t * const * code>. Une telle conversion serait sûre (une conversion de
t ** code> sur
const t ** code> serait problématique), mais la norme n'a pas été mise à jour pour le permettre. p>
[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 code>, pas les arguments de
argv code>. 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!