Nous avons vu qu'après un fork, les codes du père et du fils sont identiques et qu'ils ne diffèrent que par leur PID. Si l'on veut faire effectuer 2 tâches distinctes par les 2 processus, il faut donc prévoir chacun des codes correspondant qui serait présent dans les 2 processus mais qu'un seul utilisera à chaque fois. C'est une perte de ressources et, par ailleurs, cela implique de coder les codes des 2 programmes.
La fonction exec permet de pallier ce problème en remplaçant le code du processus fils par un code spécifique. Il existe en fait différentes formes d'appels de la fonction exec selon l'environnement ou les paramètres que l'on souhaite faire parvenir au programme.
execvp et execve sont les équivallents de
execp et exece pour execv.
Ci-dessous nous donnons un exemple d'utilisation d'execl.
[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(18,-18)
Le père lance la commande ls puis reprend la main. Notez que le nom de la commande est donné 2 fois ! (1 fois pour indiquer où se trouve le code, une seconde fois en tant que argv[0] - voir (*)).
/* Utilisation de la commande EXECL */ /* lancement de la commande ls */ #include <stdio.h> <stdlib.h> /* Programme principal */ void main(int argc, char *argv[]) { int pidfils,fpid; int pidpere=getpid(); int status; if (pidfils=fork()) { fpid=wait(&status); printf("Le process fils %d est termine ",fpid); if (0xff & status) { printf("et il y a eu un probleme !\n"); } else { printf("et tout s'est bien passe\n"); } } else { printf("Je suis le processus %d et je vais faire un ls\n",getpid()); (*) execl("/usr/bin/ls","ls",0); printf("Croyez-vous que ce commentaire sera ecrit ?"); } }
[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(18,-21)
Dans le second exemple, la fonction execv est utilisée afin de montrer comment s'effectue le passage des paramètres (noter le caractère nul pour signifier que la liste des paramètres est terminée).
/* Utilisation de la commande EXECVP */ /* lancement de la commande ls */ #include <stdio.h> <stdlib.h> /* Programme principal */ void main(int argc, char *argv[]) { int pidfils,fpid; int pidpere=getpid(); int status; char *par[5]; par[0]="ls"; par[1]="-a"; par[2]="-p"; par[3]=(char *)0; if (pidfils=fork()) { fpid=wait(&status); printf("Le process fils %d est termine ",fpid); if (0xff & status) { printf("et il y a eu un probleme !\n"); } else { printf("et tout s'est bien passe\n"); } } else { printf("Je suis le processus %d et je vais faire un ls -a -p\n",getpid()); execvp(par[0],par); printf("Croyez-vous que ce commentaire sera ecrit ?"); } }