Je suis en train d'apprendre la programmation Linux et je suis tombé sur la fonction EXED qui est un peu très utile. Mais le problème est que les arguments de la fonction EXEC sont très déroutants et je ne parviens pas à saisir quel argument est à quelle usine .. Dans le code suivant si On peut expliquer quel est le but de Execl () code> La fonction est appelée à partir d'un enfant créé via Fourche () code>, quel est le but du dernier argument ( null code>) dans exécuté () code>? null code> argument et autres arguments et des arguments des arguments de EXEC () code> fonction familiale, ce serait une bonne aide pour moi! p> p>
5 Réponses :
Les fonctions dans les fonctions variadiques est une boucle qui ira sur le nombre variable d'arguments. Ces boucles ont besoin d'une condition de terminaison. Dans certains cas, par exemple Une autre option serait d'ajouter un paramètre de fonction supplémentaire pour Nombre d'arguments em> , mais cela rendrait le code un peu plus fragile, nécessitant au programmeur de gérer un paramètre supplémentaire plutôt que de toujours utiliser un vous Voir également exécutées code> sont variadic: elles prennent un nombre variable de paramètres afin de pouvoir transmettre un nombre variable d'arguments à la commande. Les fonctions doivent utiliser null code> en tant que marqueur pour marquer la fin de la liste d'arguments. Printf CODE>, le nombre réel d'arguments peut être déduit d'un autre argument. Dans d'autres fonctions, null code> est utilisé pour marquer la fin de la liste. P> null code> comme argument final. P> (char *) 0 code> utilisé comme marqueur: p>
Le nombre et i> le type des arguments doit être d'accord avec ce que la fonction appelée attend. Comment la fonction appelée sait que l'attendre est documentée. Dans le cas de exécutant code>, la fonction appelée attend une liste de char * code>, terminée par un pointeur null de type char * code>. Étant donné que null code> a type int code> (ou au moins un type intégré), le transmettre ici est un comportement indéfini.
@Jameskanze à nouveau vous et vos comportements non définis ...
créer un comportement indéfini. Ce n'est pas un appel juridique à Le dernier argument doit être em> (code> (char *) 0 code> ou vous avez un comportement non défini.
Le premier argument est le chemin de l'exécutable. Ce qui suit
Les arguments apparaissent dans immédiatement après cette fonction, vous devez avoir la manipulation des erreurs
code. ( exécutant code>. UNE
Un appel correct peut être: argv code> du programme exécuté. La liste de ces
Les arguments sont terminés par un (char *) 0 code>; c'est comme ça que la fonction appelée
sait que le dernier argument a été atteint. Dans l'exemple ci-dessus,
Par exemple, l'exécutable à "/ bin / ls" code> remplacera votre code; dans
son principal code>, il aura argc code> égal 2, avec argv [0] code> égal "ls" code>,
et argv [1] code> égal "- l" code>. p> exécutant code> retourne toujours -1, quand il retourne, de sorte que vous n'avez pas besoin de
Essaye-le. Et il ne renvoie que s'il y avait une sorte d'erreur.) P> p>
Pourquoi pensez-vous exactement que d'utiliser null code> au lieu de (char *) 0 code> crée un comportement non défini?
@Janspurny parce que la norme POSIX le dit. Plus généralement, la norme C indique qu'il s'agit d'un comportement indéfini si une fonction Varargs tente d'extraire un type autre que le type qui a été passé. Execl code> est documenté pour nécessiter un char * code>. Cela pourrait difficilement essayer d'un autre type jusqu'à ce qu'il ait extrait l'argument. NULL code> a un type intégral, généralement int code>. Donc, passe null code> est un comportement indéfini et a été depuis déjà arrêté d'être INTS.
@Jameskanze: Des conneries totales. POSIX indique que null code>, sous forme de pointeur NULL, est zéro converti en un pointeur i> [définitions posix, 3.244], généralement (vide *) 0 code> . Il est b> (vide *) 0 code> ou une expression équivalente. Dans C89 et C99, VOID * CODE> n'a pas besoin d'être distribué à un autre type de pointeur. Par conséquent - et cela englobe Toutes les implémentations B> C89 / C99 / GNU C que j'ai jamais utilisées, à partir de microcontrôleurs à des clusters informatiques - null code> est la bonne à utiliser pour cela et toutes les autres fonctions variadiques similaires.
@Nominalanimal null code> n'est pas un pointeur NULL, c'est une constante de pointeur nulle. Et une constante de pointeur NULL est requise par la norme C ++ pour avoir un type intégral. J'ai seulement vu deux définitions de null code> dans UNIX: 0 code> et g ++ 's __ null code> compilateur magique. C'est toujours i> une erreur pour réussir null code> à une fonction variadique où les pointeurs sont attendus. La norme POSIX spécifie à l'aide de (char *) 0 code> et les pages de l'homme Linux indiquent explicitement que null code> doit être transmis comme (char *) null code> .
@Nominalanimal Juste pour être parfaitement clair, lorsque null code> (ou 0 code>) est utilisé dans un contexte nécessitant un type de pointeur, il est implicitement converti en un pointeur null. Passer une dispute à un ... code> pas i> nécessite un type de pointeur, et aucune conversion ne se produit; Vous passez 0 code>. G ++ utilise compiler magique pour null code>, vous vous en tirerez probablement avec g ++, mais j'ai utilisé plus que quelques compilateurs où cela ne fonctionnerait pas; où char * code> était supérieur à un int code> (et null code> a été défini comme 0 code>).
dans La chose sécurisée à faire surtout si vous avez une architecture de 64 bits consiste à utiliser explicitement /usr/include/libio.h code>, puisque GCC 2.8 (il y a longtemps) null code> est défini comme étant null code> était (vide *) 0 code> qui est indiscernable de (char *) 0 code> dans un Varargs CODE> Situation Depuis que le type n'est pas transmis, l'exception étant si __ cplusplus code> est défini dans quel cas null code> est défini comme 0. P>
(void *) 0 code> qui est défini pour être compatible avec n'importe quel pointeur et ne s'appuie pas sur n'importe quel DODGY #defines code> qui pourrait arriver à être dans la bibliothèque standard. P>
Le but chemin em>: l'emplacement du programme à invoquer, le programme à invoquer. < / p> arg em>, ... *: peut être considéré comme arg0, arg1, ..., argn. p> dans votre cas " bin / ls em > "Le programme à invoquer p> " ls em> "Le nom du programme p> " -l em> "est le paramètre de ce programme appelé p> p> (char *) 0 code> est de terminer les paramètres. Le comportement indéfini peut entraîner une erreur si cela manque.
La page man définit la signature exécutant ( "/ bin / ls", "ls", "-l", (char *) 0); code> est l'appel de fonction correct. p>
L'implémentation GLIBC-2.34 de la fonction POSIX EXECL CODE> EXECLL code> est celle ci-dessous. char* p = 0;
argv[i] = p;
...