Connaitre le nom d'un PID

Connaitre le nom d'un PID - C - Programmation

Marsh Posté le 15-07-2011 à 17:21:14    

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.

Reply

Marsh Posté le 15-07-2011 à 17:21:14   

Reply

Marsh Posté le 15-07-2011 à 17:52:59    

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. }

Reply

Marsh Posté le 15-07-2011 à 18:12:33    

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.

Reply

Marsh Posté le 16-07-2011 à 15:01:30    

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.

Reply

Marsh Posté le 16-07-2011 à 17:21:00    

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 ?

Reply

Marsh Posté le 16-07-2011 à 17:59:02    

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...
Reply

Marsh Posté le 16-07-2011 à 18:09:19    

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
Reply

Marsh Posté le 17-07-2011 à 12:02:22    

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é...

Reply

Marsh Posté le 17-07-2011 à 12:27:52    

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
Reply

Marsh Posté le 17-07-2011 à 13:03:38    

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...
Reply

Sujets relatifs:

Leave a Replay

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