J'avais même pas vu que tu faisais ça.
Ta manpage n'est sans doute pas très explicite, je te colle le bout de la mienne qui t'intéresse, parce que c'est très fourbe en fait execv, à cause de la manière dont argv doit être constitué et qui peut préter à confusion :
Citation :
The path argument pointsto a path name that identifies the new process image file. The argv argument is an array of character pointers to null-terminated strings. The last member of this array must be a null pointer. These strings constitute the argument list available to the new process image. The value in argv[0] should point to a filename that is associated with the process being started by one of the exec functions.
|
De plus, il est bon de gérer les erreurs.
Ainsi :
$ cat foobar.c #include <stdio.h> #include <unistd.h> #include <errno.h> int main(int argc, char **argv, char **envp) { char *foo[] = { "ls", NULL }; int ret = execve("/bin", foo, envp); if (ret == -1 ) perror("Plantated" ); return 0; } $ cc foobar.c $ a.out Plantated: Permission denied
|
Ce qui rend les choses plus explicites (le programme tente d'exécuter "/bin" ).
En somme : le premier argument c'est l'objet à exécuter.
Le second argument "argv" contient la liste des arguments à lui passer, avec argv[0] == le nom de l'objet exécuté (ou assimilé), comme ce que tu obtiens dans argv[0] en utilisant ce prototype de main() : "int main(int argc, char **argv)".
Et le dernier contient les variables d'environnement.
Et donc (juste un exemple sans fork() ni rien) :
Code :
#include <stdio.h> #include <unistd.h> #include <errno.h> int main(int argc, char **argv, char **envp) { char *foo[] = { "/bin/ls", "-l", NULL }; int ret = execve(foo[0], foo, envp); if (ret == -1 ) perror("Plantated:" ); return 0; }
|
$ cc foobar.c $ a.out total 3856 -rw-r--r-- 1 scottinet cmidev 6578 Jan 28 16:45 CVS.zip drwxr-xr-x 6 scottinet cmidev 8192 Jan 23 14:18 EC -rw-r--r-- 1 scottinet cmidev 29337 Jan 8 14:17 ECTrade.cc etc.
|
Message édité par Elmoricq le 16-02-2009 à 22:20:51