Killer un processus pére sans perdre le fils

cs_nander Messages postés 8 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 2 août 2006 - 1 août 2006 à 15:39
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 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.

9 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
2 août 2006 à 10:39
ca depend si tu utilise des processus legers( thread) ou lourds (fork()).
je pense pas que tu puisse avec des threads, mais j'en suis pas sur
0
cs_nander Messages postés 8 Date d'inscription jeudi 16 janvier 2003 Statut Membre Derniè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.
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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
0
cs_nander Messages postés 8 Date d'inscription jeudi 16 janvier 2003 Statut Membre Derniè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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_nander Messages postés 8 Date d'inscription jeudi 16 janvier 2003 Statut Membre Derniè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.
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
2 août 2006 à 15:37
Lol, y'a bien plus simple que ça, tu ouvres MAJ.exe avec shellexecute et tu quitte ton exe toi meme. Je te jure que ça marche ;-)
0
cs_nander Messages postés 8 Date d'inscription jeudi 16 janvier 2003 Statut Membre Derniè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!!
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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

et c'est tout. sinon ya un pb kekpart
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
2 août 2006 à 15:59
ouille dsl
impossible d'executer un programme sans être le pere de celui çi ?
Spécial comme truc quand meme ...
0
Rejoignez-nous