PID

PID - C++ - Programmation

Marsh Posté le 13-09-2006 à 15:27:14    


Bonjour  
 
J'ai fais un prog qui lance une ligne de commande grace à system(..) et je souhaite récuperer le PID associé
pour pouvoir ensuite "killer" ce processus.. Je n'ai pas trouvé de solution efficace sur le net alors si quelqu'un sait...
 
Merci

Reply

Marsh Posté le 13-09-2006 à 15:27:14   

Reply

Marsh Posté le 13-09-2006 à 16:01:45    

le PID associé à quoi ?
 


---------------
Töp of the plöp
Reply

Marsh Posté le 13-09-2006 à 16:12:44    

au nouveau programme lancé par la ligne de commande dans system

Reply

Marsh Posté le 13-09-2006 à 16:15:20    

sous quel os ?


---------------
Töp of the plöp
Reply

Marsh Posté le 13-09-2006 à 16:54:13    

ubuntu

Reply

Marsh Posté le 13-09-2006 à 16:54:54    

Je pense que ce sera plus facile avec un script qu'en c++, à moins que tu n'aies pas le choix.


---------------
Töp of the plöp
Reply

Marsh Posté le 13-09-2006 à 16:56:27    

fork puis exec ...
(fork retourne un pid_t)
 
C'est plus simple

Reply

Marsh Posté le 13-09-2006 à 16:58:55    

oui je veux utiliser un script c++ mais par exemple getpid me donne le pid du prossess père donc je suis coincé..

Reply

Marsh Posté le 13-09-2006 à 17:24:52    

d'jo a écrit :

oui je veux utiliser un script c++ mais par exemple getpid me donne le pid du prossess père donc je suis coincé..


 [:ciler]  
 
 
et dans le process fils, il donne pas le bon pid ? j'ai dis une connerie.


Message édité par zapan666 le 13-09-2006 à 17:25:56

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 13-09-2006 à 22:36:01    

d'jo a écrit :

oui je veux utiliser un script c++ mais par exemple getpid me donne le pid du prossess père donc je suis coincé..

Fork te renvoit
- le pid du fils forké si tu es le père
- 0 si tu es le fils
 

Code :
  1. switch (pid=fork())
  2. {
  3.   case -1: /* erreur */
  4.     perror (...);
  5.     /* traitement de l'erreur */
  6.   case 0: /* fils */
  7.     exec( ); /* on recouvre le process par la commande qu'on veut */
  8.     /* si on arrive ici, c'est qu'il y a eu une erreur */
  9. }
  10. /* Ici on est dans le père, et la variable pid contient le pid du fils */


---------------
TriScale innov
Reply

Marsh Posté le 13-09-2006 à 22:36:01   

Reply

Marsh Posté le 13-09-2006 à 22:56:16    

franceso a écrit :

Fork te renvoit
- le pid du fils forké si tu es le père
- 0 si tu es le fils
 

Code :
  1. switch (pid=fork())
  2. {
  3.   case -1: /* erreur */
  4.     perror (...);
  5.     /* traitement de l'erreur */
  6.   case 0: /* fils */
  7.     exec( ); /* on recouvre le process par la commande qu'on veut */
  8.     /* si on arrive ici, c'est qu'il y a eu une erreur */
  9. }
  10. /* Ici on est dans le père, et la variable pid contient le pid du fils */



 
ouais mais il veut killer le programme qu'il lance via le exec je crois, en fait


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 14-09-2006 à 09:06:26    

zapan666 a écrit :

ouais mais il veut killer le programme qu'il lance via le exec je crois, en fait


Ben justement le père connait le pid de son fils puisque c'est la valeur de retour de fork().


---------------
TriScale innov
Reply

Marsh Posté le 14-09-2006 à 18:16:51    

franceso a écrit :

Ben justement le père connait le pid de son fils puisque c'est la valeur de retour de fork().


 
et si tu termine le fork, tu termine automatiquement le exec ? bah si c'est ça, ouep, c'est ça que je ferais  [:dawa]


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 15-09-2006 à 10:22:32    

zapan666 a écrit :

et si tu termine le fork, tu termine automatiquement le exec ? bah si c'est ça, ouep, c'est ça que je ferais  [:dawa]

Ouais: fork crée un nouveau process qui est exactement dans le même état que le père. exec ne fait que recouvrir le processus fils avec un nouvel exécutable (mais sans changer son pid, ses file descriptors, etc.)


---------------
TriScale innov
Reply

Marsh Posté le 15-09-2006 à 19:13:08    

d'jo a écrit :

Bonjour  
 
J'ai fais un prog qui lance une ligne de commande grace à system(..) et je souhaite récuperer le PID associé
pour pouvoir ensuite "killer" ce processus.. Je n'ai pas trouvé de solution efficace sur le net alors si quelqu'un sait...
 
Merci


C'est dommage de killer systématiquement un processus lancé. Il ne s'arrête pas tout seul ???
 

franceso a écrit :

Code :
  1. switch (pid=fork())
  2. {
  3.   case -1: /* erreur */
  4.     perror (...);
  5.     /* traitement de l'erreur */
  6.   case 0: /* fils */
  7.     exec( ); /* on recouvre le process par la commande qu'on veut */
  8.     /* si on arrive ici, c'est qu'il y a eu une erreur */
  9. }
  10. /* Ici on est dans le père, et la variable pid contient le pid du fils */



 
Cette solution est parfaite. Il faut juste signaler que "exec" est un nom générique car la fonction "exec" n'existe pas en tant que telle. Ce terme recouvre en fait la famille des fonctions "exec" qui sont "execv", "execl", "execve", "execle", "execvp" et "execlp". A toi de choisir celle qui te convient le mieux.
De plus, ne pas oublier de rajouter en ligne 11 (donc dans le père) l'instruction "kill(pid, SIGTERM)"

Message cité 1 fois
Message édité par Sve@r le 15-09-2006 à 19:17:19

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-09-2006 à 10:27:56    

Sve@r a écrit :

C'est dommage de killer systématiquement un processus lancé. Il ne s'arrête pas tout seul ???
 
 
 
Cette solution est parfaite. Il faut juste signaler que "exec" est un nom générique car la fonction "exec" n'existe pas en tant que telle. Ce terme recouvre en fait la famille des fonctions "exec" qui sont "execv", "execl", "execve", "execle", "execvp" et "execlp". A toi de choisir celle qui te convient le mieux.
De plus, ne pas oublier de rajouter en ligne 11 (donc dans le père) l'instruction "kill(pid, SIGTERM)"


 
En fait je ne veux pas killer le processus automatiquement mais j'ai besoin de mémoriser le pid du processus engendré par :

Code :
  1. sytem(programme);


Comme ca ,si je souhaite killer le progamme lancé de mon programme principal plus tard il me suffit de récuperer son pid .
fork dédouble l'application  mais ne me donne pas le pid du programme executé dans system donc cette solution n'est pas bonne pour mon cas

Message cité 1 fois
Message édité par d'jo le 19-09-2006 à 10:29:17
Reply

Marsh Posté le 19-09-2006 à 11:10:02    

d'jo a écrit :


Comme ca ,si je souhaite killer le progamme lancé de mon programme principal plus tard il me suffit de récuperer son pid .
fork dédouble l'application  mais ne me donne pas le pid du programme executé dans system donc cette solution n'est pas bonne pour mon cas


 
 
Si justement :)
 
fork te crée un 2ème process et te renvoie un PID X
si suite a ce fork tu fait un exec de l'autre programme il ecrasera le 2eme process et aura comme pid X (celui que fork retourne)
 
Au final tu aura un programme principal d'ou tu pourra killer le 2eme process (celui de PID X)

Reply

Marsh Posté le 19-09-2006 à 11:15:44    

ah...
Quand tu dis exec() cela équivaut à system() ? Je ne connait pas exec().
 (je suis sous ubuntu au cas ou)

Message cité 1 fois
Message édité par d'jo le 19-09-2006 à 11:16:30
Reply

Marsh Posté le 19-09-2006 à 11:48:41    

En fait mon prog fais un truc du style :

Code :
  1. string prog;
  2. ... //en fonction des choix que je veux
  3. system (prog.c_str());


 
et je viens de regarder les fonctions de exec ne me permettent pas de faire ca...

Reply

Marsh Posté le 19-09-2006 à 12:19:45    

d'jo a écrit :

ah...
Quand tu dis exec() cela équivaut à system() ? Je ne connait pas exec().
 (je suis sous ubuntu au cas ou)


 
non :)
 
System crée un nouveau process et reviens apres la fin de l'execution du programme externe.
 
exec remplace ton process par celui lancé (d'ou l'importance de faire un fork avant !) ce qui te permet de le controler (et donc de le tuer si  
il te gène)
 
Lit ça : http://www.linux-kheops.com/doc/ma [...] tem.3.html
et ça http://www.linux-kheops.com/doc/ma [...] xec.3.html
 
Ca devrais t'éclairer.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed