2010-09-28 34 views
3

Selon exec reference, les appels à exec (ou stack vararg fonctions en général) nécessite un (char*)NULL aka 0 à la fin de la liste des paramètres. GCC, cependant, se plaint du code suivantpas assez de variables pour s'adapter à une sentinelle

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

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

Quelqu'un sait ce qui ne va pas?

+0

double possible: http://stackoverflow.com/questions/2050961/is-argv0-name-of-executable-an-accepted-standard-or-just-a-common-conventio –

Répondre

9

Cette référence dit que le prototype est

execl(const char * path, const char * arg, ...) 

je lis que 2 paramètres + (char *) NULL

quelque chose comme:

execl(cmdFullPath, (const char*)NULL, (char*)NULL); 

de la page:

#include <unistd.h> 

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

Vous êtes droite. Temporairement oublié que le 1er argument est obligatoire (nom de l'exécutable). Doh! – jameszhao00

+0

que se passe-t-il si la liste d'arguments est comme arg1 = val1, arg2 = val2, arg3 = val3, etc ... ou arg1 val1 arg2 val2 arg3 val3, etc ...? – enthusiasticgeek

2

It s habituel pour passer le nom de l'exécutable dans le premier paramètre

Donc si l'exécutable que vous exécutez est "/ bin/ls" (selon le lien que vous avez posté), le premier paramètre est "ls" et vous auriez ALORS passer (char *) NULL dans le dernier paramètre (c'est-à-dire dans ce cas le 3ème).

0

Vous devez transmettre au moins trois arguments. Le second est argv [0] donc il ne peut pas être nul.

execl(cmdFullPath, "", NULL)