Récupérer le PID d'un programme [C][Windows] - C - Programmation
Marsh Posté le 04-06-2007 à 16:12:14
ReplyMarsh Posté le 04-06-2007 à 16:15:31
très constructif... çà fait une demi-journée que je fais du google.
Marsh Posté le 04-06-2007 à 16:18:58
Pourquoi tu lances pas ton process avec un fork, qui te retournerait directement le pid ?
Marsh Posté le 04-06-2007 à 16:39:28
fork existe sous windows ? dans quelle bibli ?
Marsh Posté le 04-06-2007 à 16:44:36
Autant pour moi;
createthread + terminer le thread si la fonction met trop de temps ?
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.
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...
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
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
je te conseille de suivre la méthode de darkalt, au moins t'es sûr de ce que tu fais
Marsh Posté le 04-06-2007 à 17:00:30
MagicBuzz a écrit : ah ben ça va faire comme PS hein |
une méthode ? ou çà ? je ne vois qu'un lien vers msdn
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. |
Ma méthode c'est d'utiliser des threads
Marsh Posté le 04-06-2007 à 17:03:29
_darkalt3_ a écrit : Ma méthode c'est d'utiliser des threads |
ah mais je suis ouvert !
cependant je ne vois pas ou je met ma ligne de commande pour lancer mon appli.
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)
Marsh Posté le 04-06-2007 à 17:06:42
dridri a écrit : ah mais je suis ouvert ! |
C'est pas une ligne de commande, c'est du code à rajouter dans ton appli.
Marsh Posté le 04-06-2007 à 17:07:24
MagicBuzz a écrit : t'as regardé du côté de "CreateProcess()" et "CreateThread()" ? |
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...
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.
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)
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
Marsh Posté le 04-06-2007 à 17:09:51
_darkalt3_ a écrit : Ca te fait pas récuperer de pid ! |
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 ?
Marsh Posté le 04-06-2007 à 17:10:41
MagicBuzz a écrit : En une seule recherche sur Google : |
encore du c++, galère a convertir. bon merci
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. |
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
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. |
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)
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. |
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".
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 .
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
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
-- Mise à part convertir du C++ en C en espérant que ça marche
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 |
Le partage des données, entre autres.
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.
je demande juste à l'OS de me donner le PID qu'il vient d'attribuer, çà me paraissait pas complexe...
par ailleurs la conversion c++ => c n'est pas tres drôle, l'inverse est souvent plus aisé.
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 :
|
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.
Marsh Posté le 05-06-2007 à 10:15:19
ReplyMarsh Posté le 05-06-2007 à 10:18:44
ReplyMarsh Posté le 05-06-2007 à 11:01:30
_darkalt3_ a écrit : up quoi ? |
up que les threads j'ai pas envie d'y passer la nuit
en VisualBasic :
Code :
|
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.
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
|
Ouais, ben ici t'es en catégorie C.
dridri a écrit : |
C'est un forum, pas une hotline.
Dégoûte pas les gens de passer du temps à tes problèmes.
Marsh Posté le 05-06-2007 à 11:06:30
_darkalt3_ a écrit : Ouais, ben ici t'es en catégorie C. |
de demander la lune au C (en comparaison au VB). me fais pas dire ce que j'ai pas dit
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 |
Exprime toi mieux alors
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 :
|
il suffit donc de récupérer le dword dwProcessId qui correspond au PID (qu'on peut obtenir avec la commande tasklist).
Code :
|
résolu !
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