Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1669 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Connaitre le nom d'un PID

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Connaitre le nom d'un PID

n°2089625
Noobs69
Posté le 15-07-2011 à 17:21:14  profilanswer
 

Bonjour,
 
Je compile sous cygwin.
J'arrive à lister tous les processus actifs par leur PID.
 
Je cherche à connaitre le nom des processus à l'intérieur d'un programme C, donc pas de ps ou autre chose dans un bash shell.
 
Je suis dans un hook et je n'ai donc pas la possibilité de faire un open ou fopen, cela bloque tout sans raison, mais je ne trouve pas la source du problème.
 
Je cherche donc à lire le nom du processus par d'autres moyens, mais je n'arrive pas le faire sous cet environnement.
 
Donc si quelqu'un peut m'aider à compiler les fonctions suivantes en cygwin, merci du coup de main :
 
1. find_task_by_pid ou find_task_by_vpid,
2. get_task_comm.
 
#include <linux/sched.h> ne fonctionne pas sous cygwin, donc pas d'accès aux fonctions permettant de lire un struct task_struct.
 
Merci pour votre aide.

mood
Publicité
Posté le 15-07-2011 à 17:21:14  profilanswer
 

n°2089628
tpierron
Posté le 15-07-2011 à 17:52:59  profilanswer
 

Probablement pas possible de faire ça de manière portable, mais en utilisant l'API Win32, tu peux faire un truc du genre:
 

Code :
  1. #include <windows.h>
  2. #include <Tlhelp32.h>
  3. #include <stdio.h>
  4.  
  5. int main(int nb, char * argv[])
  6. {
  7.     if (nb < 2)
  8.     {
  9.         fprintf(stderr, "usage: %s <pid>: find process name from its ID\n", *argv);
  10.         return 1;
  11.     }
  12.     HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  13.     PROCESSENTRY32 buf;
  14.  
  15.     if (Process32First(snap, &buf))
  16.     {
  17.         do {
  18.             if (buf.th32ProcessID == atoi(argv[1]))
  19.             {
  20.                 fprintf(stderr, "name = %s\n", buf.szExeFile);
  21.                 break;
  22.             }
  23.         }
  24.         while (Process32Next(snap, &buf));
  25.     }
  26.     CloseHandle(snap);
  27.  
  28.     return 0;
  29. }

n°2089631
Noobs69
Posté le 15-07-2011 à 18:12:33  profilanswer
 

Autant pour moi, je compile sous Windows avec cygwin, mais à destination d'un système embarqué sous linux.
 
Et la portabilité n'est pas de mise dans ma recherche.

n°2089688
shaoyin
Posté le 16-07-2011 à 15:01:30  profilanswer
 

Si ton programme doit fonctionner sous Linux, tu peux ouvrir le fichier "cmdline" situé dans le répertoire /proc/<pid du processus>.
 
Il y a un peu de traitement de chaîne pour extraire le nom de ton processus, mais cela devrait convenir.

n°2089703
Noobs69
Posté le 16-07-2011 à 17:21:00  profilanswer
 

Non, je ne peux pas.
Tout ça fonctionne bien dans un programme standard, mais dans la lib de hook que j'utilise, tout open ou fopen plante tout et je n'arrive à trouver pourquoi.
J'ai déjà la liste des processus et j'essaye donc de lire le champ COMM de stat_struct d'une façon ou d'une autre.
 
La seule chose qui fonctionne dans /proc/<pid>/ c'est la lecture de exe via readlink, sinon, tout le reste dépend d'un open ou fopen et donc c'est mort pour moi.
 
Peux-tu m'aider à compiler les fonctions de lecture de COMM sous cygwin et la libc 2.3.2 ?

n°2089708
breizhbugs
Posté le 16-07-2011 à 17:59:02  profilanswer
 

Tu devrais préciser quel librairie ( librairie de hook?) tu utilises et éventuellement donner du code...
Tu dis que "open/fopen" plantent tout, tu fais des contrôles sur les retours de fonction, ou ca plante DANS la fonction?


Message édité par breizhbugs le 16-07-2011 à 17:59:48

---------------
Seul Google le sait...
n°2089711
Noobs69
Posté le 16-07-2011 à 18:09:19  profilanswer
 

Ca plante DANS la fonction.
Ca rentre, ca ne sort plus jamais.
 
Je compile sous cygwin avec :
gcc-3.3.4
glibc-2.3.2/arm-linux/bin/gcc
 
Je crée un hook de la fonction gettimeofday ainsi :
 

Code :
  1. int gettimeofday (struct timeval *tv, struct timezone *tz) {
  2. int ret;
  3. if ( ! hook._gettimeofday )
  4.  hook._gettimeofday = (int (*)())dlsym( RTLD_NEXT, "gettimeofday" );
  5. if (test == 0) {
  6.  test++;
  7.  process_run(123);
  8.  test--;
  9. }
  10. ret = wrapper._gettimeofday( tv, tz );
  11. return ret;
  12. }
  13. int process_run(pid_t proc_id) {
  14. struct dirent **namelist=NULL;
  15. int n;
  16. if ( ( n = scandir( "/proc", &namelist, is_procdir, reverse_numsort ) ) < 0) {
  17.  perror( "process_run: scandir /proc " );
  18.  return (0);
  19. }
  20. while(n--) {
  21.  procinfo(atoi(namelist[n]->d_name));
  22.  free(namelist[n]);
  23. }
  24. free(namelist);
  25. return (found ? 1 : 0);
  26. }
  27. static void print_procinfo(int procdir) {
  28. char  fullpath[sizeof "/proc/" + NAME_MAX + 1 + sizeof "/stat"];
  29. char  name[NAME_MAX + 1];
  30. FILE * F = NULL;
  31. pid_t pid;
  32. int fd=0;
  33. char target_name[252];
  34. /* C'est un simple essai pour vérifier que readlink fonctionne bien (et c'est le cas) */
  35. sprintf( fullpath, "/proc/%d/exe", procdir );
  36. printf("proc=%s\n", fullpath);
  37. fd = readlink( fullpath, target_name, sizeof(target_name)-1);
  38. target_name[fd]='\0';
  39. printf("target=[%d]%s\n", fd, target_name);
  40. sprintf( fullpath, "/proc/%d/stat", procdir );
  41. printf("proc=%s\n", fullpath);
  42. fflush(stdout);
  43. /* Clairement, ça ne marche que jusque là ! fopen doit attendre et ne sort plus, pourquoi ? mystère ? */
  44. /* Meme essai avec open et close, même problème */
  45. if(( F = fopen( fullpath, "r" )) != NULL ) {
  46.  if( fscanf( F, "%d (%[^)]s)", &pid, name ) == 2 )
  47.   printf( "pid=%-6d\tname=%s\n", pid, name );
  48.  else
  49.   printf("Error on fscanf fullpath=%s\n", fullpath);
  50.  fclose (F);
  51. }
  52. else
  53.  printf("Error on fopen fullpath=%s\n", fullpath);
  54. }


 
Et je charge via LD_PRELOAD=malib.so.
 
Quelqu'un a une idée ?
 
Soit de faire fonctionner fopen ou open,
Soit de remplacer par d'autres fonctions pour lire le nom du processus.
 
A votre bon coeur !


Message édité par Noobs69 le 16-07-2011 à 18:31:10
n°2089759
shaoyin
Posté le 17-07-2011 à 12:02:22  profilanswer
 

Si ton programme doit fonctionner sous Linux, et que tes problèmes actuels sont liés à Cygwin, n'aurais-tu pas intérêt à le développer directement dans un environnement Linux pur (dans une machine virtuelle, par exemple) ? J'ai l'impression que tu introduis plein de difficultés inutiles, à travailler dans un environnement inadapté...

n°2089761
Noobs69
Posté le 17-07-2011 à 12:27:52  profilanswer
 

Devant l'insistance des gurus d'ici et d'ailleurs, j'ai fini par aller chez un ami compiler sous ubuntu, du pur linux et ...
 
... tout pareil !!!
 
Maintenant quelles solutions me restent-ils ?
Je vais finir par abandonner l'idée de ce soft.
Il n'y a personne qui compile ce type de code ici ?


Message édité par Noobs69 le 17-07-2011 à 16:34:50
n°2089765
breizhbugs
Posté le 17-07-2011 à 13:03:38  profilanswer
 

Ton programme, en fait, il correspond à quel genre de programme (désolé je suis nul en prog linux)?  
- un programme ou librairie charger dans chaque autre programme pour modifier l'usage de gettimeofday qu'ils ont? -> peut être n'ont ils pas les droits de partage suffisant pour fopen?
- un driver? -> même si c'est pas un driver, si la lib se charge trop tôt est ce que fopen peut agir ou simplement exister a ce niveau là?


Message édité par breizhbugs le 17-07-2011 à 13:06:43

---------------
Seul Google le sait...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Connaitre le nom d'un PID

 

Sujets relatifs
connaitre les propriétés d'un objetCréer un site sans connaitre la programmation?
sql : selectall_hashref (sans connaitre le nom des colonnes)connaitre les instances d'une classe
[Résolu][Socket] connaitre l'IP de connexionConnaitre les API désormais incluses dans le JDK 1.6
connaitre la taille d'un fichier en C[Excel]Connaître la dernière ligne d'un tableau
connaitre l'utilisateur mssql[ORACLE] Connaitre la date d'ajout d'une colonne
Plus de sujets relatifs à : Connaitre le nom d'un PID


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR