cs_nander
Messages postés8Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 2 août 2006
-
1 août 2006 à 15:39
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008
-
2 août 2006 à 15:59
bonjour!
je cherche a faire un petit programme de mise a jours de mes application.
mon application principale lance mon programme qui kill a lors son pére (l'application principale). Mon probleme est que lorsque l'on kill un pere on kill aussi tout ses fils.
j'ai essayer d'appeller mon prog de MAJ avec la cmd system().
sinon j'ai vue que je pouvais utilisé une des fonctions exec(). mais es ce que le fichier executable de mon programme principal pourra etre remplacé si j'utilise cette commande. car il est impossible de remplace un fichier en cour d'utilisation.
cs_nander
Messages postés8Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 2 août 2006 2 août 2006 à 12:27
Ni l'un Ni l'autre
j'ai realisé un programme totalement a part et je l'execute dans mon programme pere grace a l'appel a la fonction systeme() ou exec().
mon programme de mise a jour (le fils) commence par killer sont pere (le prog a mettre a jour) et apres il ne fait plus rien alors que le code devrait continuer par la copie d'un fichier depuis un repertoire source vers un repertoire destination fournie en parametre.
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 2 août 2006 à 13:56
apparament, exec remplace le processus courant par celui passe en parametre de la fonction.
donc par exemple si dans le programme P1 tu fais un exec(P2), alors P2 prend le PID de P1. donc si tu kill P1 a partir de P2, tu ne fait que killer P2 en fait (je sais pas si je suis tres clair!).
donc si j'azi bien compris ce que tu veu faire, tu a juste pas besoin de killer P1, vu qu'il se termine au lancement de P2!!!
Extrait de la manpage de execve:
En cas de réussite, execve() ne revient pas à l'appelant, et les
segments de texte, de données, ainsi que la pile du processus appelant sont
remplacés par ceux du programme chargé.
Le programme invoqué hérite du PID du processus appelant
cs_nander
Messages postés8Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 2 août 2006 2 août 2006 à 14:02
oui effectivement j'ai vue ca ce midi aussi donc je vais esseyer de faire un exec sans killer de processus et je vais voir si je peut remplacer mon executable comme ca
merci guillemouze
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_nander
Messages postés8Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 2 août 2006 2 août 2006 à 15:14
bon voici le bout de code quui lance mon appli de mise a jour :
----------------------------
char cmd[50];
sprintf(cmd,"%SMAJ.exe",Application-> getRepAppli()); //Application-> getRepAppli() renvoi le repertoire de l'application
printf("%s",cmd); // affiche /Users/nander/Desktop/lanceur/trunk/macos/appli/build/Debug/MAJ.exe
execl(cmd,"MAJ.exe",RepTemp,Application-> getRepAppli());
-----------------------------
le probleme c que la fonction execl revient toujours dans le code appelant.
le MAJ.exe est bien dans le bon repertoire. il attend en argument le chemin du repertoire source et en 2eme argument le repertoire de destination.
cs_nander
Messages postés8Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 2 août 2006 2 août 2006 à 15:44
merci mais si tu regarde bien on est dans la partie reservée à linux donc mon code est fait pour tourner sous unix et visiblement shellexecute ne fonctionne pas sous unix!!
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 2 août 2006 à 15:53
c bizare, dans ce que j'ai marsque plus haut, il y a :
Extrait de la manpage de execve:
En cas de réussite, execve() ne revient pas à l'appelant
Ca veut peut etre dire que la commande a echouée?
essaye de faire ca dans ton prog:
...
printf("avant exec\n");
exec("progtest"); // je connai pas exactement la synthaxe, mais le but est d'executer un prog test
printf("apres exec\n");
...
et ton progtest du genre
main(...) {
printf("prog test\n");
return 0;
}
et verifie, si tt se passe comme prevu il devrait te mettre
>avant exec
>prog test