[C][Windows] Récupérer le PID d'un programme

Récupérer le PID d'un programme [C][Windows] - C - Programmation

Marsh Posté le 04-06-2007 à 16:10:08    

Bonjour,
 
je suis entrain d'écrire un service en C sous windows qui récupère des demandes dans une base oracle (çà fonctionne très bien), lance une application en fonction de la demande et kill cette application si son temps d'éxecution est supérieur à une valeur donnée.
 
Ce que je voudrais faire :
au lancement de l'application (par une ligne de shell), on récupère le PID.
 
On pourra alors stocker dans la base de données (dans la ligne de la demande bien sûr) pour le récupérer ensuite et killer l'application.
 
MSDN parle d'une structure SHELLEXECUTEINFO mais je n'ai pas saisi comment la remplir ni y accéder. Ce n'est peut-être pas la solution.


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 16:10:08   

Reply

Marsh Posté le 04-06-2007 à 16:12:14    

Reply

Marsh Posté le 04-06-2007 à 16:15:31    


très constructif... çà fait une demi-journée que je fais du google.


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 16:18:58    

Pourquoi tu lances pas ton process avec un fork, qui te retournerait directement le pid ?


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

Marsh Posté le 04-06-2007 à 16:39:28    

fork existe sous windows ? dans quelle bibli ?


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 16:44:36    

Autant pour moi;
createthread + terminer le thread si la fonction met trop de temps ?


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

Marsh Posté le 04-06-2007 à 16:48:34    

sinon, l'instruction "tasklist" permet de retourner la liste des process comme le PS d'unix.
 
par contre, elle est présente sous Vista, mais aucune idée sur les versions plus anciennes.
 
de la même façon, taskkill permet de tuer un process via son pid comme le kill d'unix.

Reply

Marsh Posté le 04-06-2007 à 16:51:35    

oula... mais je maîtrise pas les threads moi :(
 
MagicBuzz -> çà m'oblige à parser le retour de tasklist, mais comment savoir si tel process de word (par exemple) vient d'etre lancé par mon service ou s'il était déja présent...

Message cité 2 fois
Message édité par dridri le 04-06-2007 à 16:52:49

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 16:52:22    

dridri a écrit :

oula... mais je maîtrise pas les threads moi :(


Ah bah c'est le moment de s'y mettre :)

 

http://msdn2.microsoft.com/en-us/library/ms682453.aspx


Message édité par _darkalt3_ le 04-06-2007 à 16:52:53

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

Marsh Posté le 04-06-2007 à 16:57:40    

dridri a écrit :

MagicBuzz -> çà m'oblige à parser le retour de tasklist, mais comment savoir si tel process de word (par exemple) vient d'etre lancé par mon service ou s'il était déja présent...


ah ben ça va faire comme PS hein :D
 
je te conseille de suivre la méthode de darkalt, au moins t'es sûr de ce que tu fais ;)

Reply

Marsh Posté le 04-06-2007 à 16:57:40   

Reply

Marsh Posté le 04-06-2007 à 17:00:30    

MagicBuzz a écrit :

ah ben ça va faire comme PS hein :D
 
je te conseille de suivre la méthode de darkalt, au moins t'es sûr de ce que tu fais ;)


une méthode ? ou çà ? je ne vois qu'un lien vers msdn :o

Message cité 1 fois
Message édité par dridri le 04-06-2007 à 17:01:10

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:01:19    

dridri a écrit :

une méthode ? ou çà ? je ne vois qu'un lien vers msdn qui ne contient meme pas d'exemple.  :o


Ma méthode c'est d'utiliser des threads :o


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

Marsh Posté le 04-06-2007 à 17:03:29    

_darkalt3_ a écrit :

Ma méthode c'est d'utiliser des threads :o


ah mais je suis ouvert !  :)  
cependant je ne vois pas ou je met ma ligne de commande pour lancer mon appli.


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:06:36    

t'as regardé du côté de "CreateProcess()" et "CreateThread()" ?
 
http://www.developpez.net/forums/a [...] t-332.html
(il s'agit d'un autre problème, mais ces deux fonction sont citées)

Reply

Marsh Posté le 04-06-2007 à 17:06:42    

dridri a écrit :

ah mais je suis ouvert !  :)
cependant je ne vois pas ou je met ma ligne de commande pour lancer mon appli.

 

C'est pas une ligne de commande, c'est du code à rajouter dans ton appli.

Message cité 1 fois
Message édité par _darkalt3_ le 04-06-2007 à 17:07:07

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

Marsh Posté le 04-06-2007 à 17:07:24    

MagicBuzz a écrit :

t'as regardé du côté de "CreateProcess()" et "CreateThread()" ?
 
http://www.developpez.net/forums/a [...] t-332.html
(il s'agit d'un autre problème, mais ces deux fonction sont citées)


et il est ou mon PID ?

_darkalt3_ a écrit :

C'est pas une ligne de commande, c'est du code à rajouter dans ton appli.


faut que je balance ma ligne de code quelque part n'empeche...

Message cité 1 fois
Message édité par dridri le 04-06-2007 à 17:08:02

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:08:04    

dridri a écrit :

et il est ou mon PID ?


Ca te fait pas récuperer de pid !
 
Ca te permet de lancer ce que tu veux en tâche de fond, et de tuer la tâche si elle met trop de temps.


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

Marsh Posté le 04-06-2007 à 17:08:42    

En une seule recherche sur Google :
http://goff.nu/techarticles/develo [...] ocess.html
 
Ca ouvre une application et la tue au bout de X secondes.
 
(par contre ça à l'air d'être du C++ et pas du C)

Message cité 1 fois
Message édité par MagicBuzz le 04-06-2007 à 17:10:00
Reply

Marsh Posté le 04-06-2007 à 17:09:05    

Ben tu te renseignes sur les thread avec les liens qu'on t'a refilé, et tu modifies ton code en conséquence [:spamafote]


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

Marsh Posté le 04-06-2007 à 17:09:51    

_darkalt3_ a écrit :

Ca te fait pas récuperer de pid !
 
Ca te permet de lancer ce que tu veux en tâche de fond, et de tuer la tâche si elle met trop de temps.


admettons. çà me donne un thread dans lequel je met ce que je veux. Dans mon thread je veux mettre mon appli.
Comme je suis incapable de trouver le PID de mon appli (dans mon thread), je crée donc un thread par appli.
Y'a une limite au nombre de threads ?


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:10:41    

MagicBuzz a écrit :

En une seule recherche sur Google :
http://goff.nu/techarticles/develo [...] ocess.html
 
Ca ouvre une application et la tue au bout de X secondes.
 
(par contre ça à l'air d'être du C++ et pas du C)


encore du c++, galère a convertir. bon merci  :jap:


Message édité par dridri le 04-06-2007 à 17:11:20

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:11:01    

dridri a écrit :

admettons. çà me donne un thread dans lequel je met ce que je veux. Dans mon thread je veux mettre mon appli.
Comme je suis incapable de trouver le PID de mon appli (dans mon thread), je crée donc un thread par appli.
Y'a une limite au nombre de threads ?


La limite est en fonction de la version de Windows et d'une clé de la BDR.
 
M'enfin tant que t'as pas plus de 100 process, ça devrait aller

Reply

Marsh Posté le 04-06-2007 à 17:12:38    

dridri a écrit :

admettons. çà me donne un thread dans lequel je met ce que je veux. Dans mon thread je veux mettre mon appli.
Comme je suis incapable de trouver le PID de mon appli (dans mon thread), je crée donc un thread par appli.
Y'a une limite au nombre de threads ?


 
En fait ton thread contient un pointeur vers une fonction, qui fait ce que tu veux.
 
Oui, il y a bien sur une limite au nombre de thread (à priori celle du système)


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

Marsh Posté le 04-06-2007 à 17:13:04    

MagicBuzz a écrit :

La limite est en fonction de la version de Windows et d'une clé de la BDR.
 
M'enfin tant que t'as pas plus de 100 process, ça devrait aller


tu veux dire thread donc.
Va falloir que je me trimballe des pointeurs sur mes threads pour pouvoir les retrouver. çà va être fun çà.
La question de départ est quand même : "je veux récupérer le PID de l'appli que je viens de lancer".


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:13:58    

dridri a écrit :

Va falloir que je me trimballe des pointeurs sur mes threads pour pouvoir les retrouver. çà va être fun çà.


en fait des handles
 

dridri a écrit :

La question de départ est quand même : "je veux récupérer le PID de l'appli que je viens de lancer".


A priori ca peut pas marcher comme ca .


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

Marsh Posté le 04-06-2007 à 17:16:01    

Nan, le truc que je t'ai filé en exemple, c'est bien des PROCESS et pas des THREADS.
 
Si WORD tourne dans un THREAD, tu le verras de toute façon dans le gestionnaire des tâches, alors que là il y est.
 
Darkalt3 me corrigera si je dis une connerie.
 
Mais en tout cas, si y'a bien une diff entre "CreateThread" et "CreateProcess" c'est pour une raison :spamafote:
 
PS : Et je vois pas en quoi mon lien te pose problème... Tu demandes combien de cuillères mettre pour faire du café, moi je te ramène un distributeur automatique de café, t'as plus rien à faire :o
 
-- Mise à part convertir du C++ en C en espérant que ça marche :D

Message cité 1 fois
Message édité par MagicBuzz le 04-06-2007 à 17:18:00
Reply

Marsh Posté le 04-06-2007 à 17:23:20    

MagicBuzz a écrit :

Mais en tout cas, si y'a bien une diff entre "CreateThread" et "CreateProcess" c'est pour une raison :spamafote:


 
Le partage des données, entre autres.


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

Marsh Posté le 04-06-2007 à 17:32:02    

j'ai beaucoup d'autres points qui vont me prendre du temps dans mon dev. j'ai pas vraiment le temps d'apprendre a gérer les threads.  :sweat:  
je demande juste à l'OS de me donner le PID qu'il vient d'attribuer, çà me paraissait pas complexe...  :cry:
 
par ailleurs la conversion c++ => c n'est pas tres drôle, l'inverse est souvent plus aisé.


Message édité par dridri le 04-06-2007 à 17:35:16

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 04-06-2007 à 17:40:01    

ptet une solution du coté de CreateProcess :

Citation :

If CreateProcess succeeds, it returns a PROCESS_INFORMATION structure containing handles and identifiers for the new process and its primary thread.

Code :
  1. typedef struct _PROCESS_INFORMATION {
  2.   HANDLE hProcess;
  3.   HANDLE hThread;
  4.   DWORD dwProcessId;
  5.   DWORD dwThreadId;
  6. } PROCESS_INFORMATION,
  7. *LPPROCESS_INFORMATION;

dwProcessId
    A value that can be used to identify a process. The value is valid from the time the process is created until all handles to the process are closed and the process object is freed; at this point, the identifier may be reused.
dwThreadId
    A value that can be used to identify a thread. The value is valid from the time the thread is created until all handles to the thread are closed and the thread object is freed; at this point, the identifier may be reused.


Message édité par dridri le 04-06-2007 à 17:41:20

---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 05-06-2007 à 10:15:19    

up


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 05-06-2007 à 10:18:44    

up quoi ?
t'en es où ?


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

Marsh Posté le 05-06-2007 à 11:01:30    

_darkalt3_ a écrit :

up quoi ?
t'en es où ?


up que les threads j'ai pas envie d'y passer la nuit
en VisualBasic :

Code :
  1. pid = Shell(Chr(34) + "C:\Windows\System32\notepad.exe" + Chr(34))


me renvoit son PID.
J'ai l'impression de demander la lune.
 
Comme j'ai pas le temps, j'ai trouvé une solution bien bourrine : je copie mon application sous un nouveau nom "Moteur_ID_de_demande" ce qui me crée des applications uniques que je peux killer grâce à leur nom.
J'avoue que c'est débile.   :jap:


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 05-06-2007 à 11:03:32    

dridri a écrit :

up que les threads j'ai pas envie d'y passer la nuit
en VisualBasic :

Code :
  1. pid = Shell(Chr(34) + "C:\Windows\System32\notepad.exe" + Chr(34))


me renvoit son PID.


Ouais, ben ici t'es en catégorie C.
 

dridri a écrit :


J'ai l'impression de demander la lune.


C'est un forum, pas une hotline.
Dégoûte pas les gens de passer du temps à tes problèmes.


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

Marsh Posté le 05-06-2007 à 11:06:30    

_darkalt3_ a écrit :

Ouais, ben ici t'es en catégorie C.
 
 
C'est un forum, pas une hotline.
Dégoûte pas les gens de passer du temps à tes problèmes.


de demander la lune au C (en comparaison au VB). me fais pas dire ce que j'ai pas dit :o


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le 05-06-2007 à 11:07:36    

dridri a écrit :

de demander la lune au C (en comparaison au VB). me fais pas dire ce que j'ai pas dit :o


Exprime toi mieux alors :o


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

Marsh Posté le 12-06-2007 à 09:43:48    

Bon voilà la solution :
 
createprocess stocke les infos de processus dans pi (PROCESS_INFORMATION), dont la structure est :

Code :
  1. typedef struct _PROCESS_INFORMATION { // pi  
  2.     HANDLE hProcess;
  3.     HANDLE hThread;
  4.     DWORD dwProcessId;
  5.     DWORD dwThreadId;
  6. } PROCESS_INFORMATION;


il suffit donc de récupérer le dword dwProcessId qui correspond au PID (qu'on peut obtenir avec la commande tasklist).
 

Code :
  1. //Ouverture du process
  2.    if (!CreateProcess("C:\\Windows\\System32\\notepad.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  3.    {
  4.    printf("CreateProcess a echoue" );
  5.    return 0;
  6.    }else{
  7.    printf("CreateProcess notepad.exe avec PID : %d\n",pi.dwProcessId);
  8.    }


 
résolu !


---------------
Feed-back HA/Ventes HFR | http://www.nexen.org Lans dans le nord de la France
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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