6
votes

Pas assez de variables pour s'adapter à une sentinelle

Selon Référence Exec , appels à exécutés (ou option Vérification des fonctions Vararg En général) nécessite un (char *) null code> alias 0 à la fin de la liste des paramètres. GCC, cependant, se plaint du code suivant

char cmdFullPath[4096]; //yes this 4096 thing is bad coding practice 
...
execl(cmdFullPath, (char*)NULL);

//warning: not enough variable arguments to fit a sentinel


1 commentaires

3 Réponses :


11
votes

Cette référence indique que le prototype est

#include <unistd.h>

int main() {
    execl("/bin/ls", "ls", "-l", (char *)NULL);
    return 0;
}


6 commentaires

Tu as raison. Temporairement oublié que le 1er argument est obligatoire (nom exécutable). Doh!


Que se passe-t-il si la liste des arg1 = val1, arg2 = VAL2, arg3 = VAL3, etc ... ou arg1 VAL1 arg2 VAL2 arg3, etc ...?


Si je suis correct retour 0; n'est jamais exécuté. Est-ce une convention de l'écrire?


@Philx_x - voir ici CodeProject.com/questions / 693038 / Pourquoi-we-we-we-we-user-user n - il est nécessaire en C mais facultatif en C ++


@Preetsangha ceci résiste à une question différente. Mon inquiétude est que quelque chose après exécutant est inutile car à ce stade, le texte du programme du processus est littéralement écrasé par celui de LS .


@PHILX_X - N'hésitez pas à modifier la question à améliorer!



2
votes

Son habitude de transmettre le nom exécutable en tant que premier paramètre

Donc, si l'exécutable que vous exécutez est "/ bin / ls" (selon le lien que vous avez affiché), le premier paramètre est "LS" et vous passeriez ensuite (char *) null en dernier (c.-à-d. Dans ce cas, 3ème paramètre.


0 commentaires

0
votes

Vous devez passer au moins trois arguments. Le second est argv [0] de sorte qu'il ne peut pas être nul.

execl(cmdFullPath, "", NULL)


0 commentaires