IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lister les processus dans un programme C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut lister les processus dans un programme C
    Bonjour,

    J'espère pouvoir être aidé !

    Je travaille pour un TomTom sous Linux (none) 2.6.13 assez bridé tout de même.
    Je compile sous Cygwin sur un PC sous Windows 7 (et pas de volonté de changer d'OS pour les "répondeurs" à la petite semaine).

    Je réalise une lib de hooking des fonctions open, close, read, write, memcpy, que je charge via LD_PRELOAD au démarrage du système.

    J'essaye de lister tous les processus et j'y arrive partiellement avec un dirent de /proc et j'obtiens ainsi la liste des processus.

    Je fais cette lecture à chaque appel du memcpy et j'ai monté un flag personnel (pas un sémaphore) pour éviter que le code ne soit réentrant, on ne sait jamais.

    Je souhaitais lire les /proc/pid/stat via fopen et fscanf, puis par open et read, mais rien ne fonctionne, clairement j'inscris chaque action par printf et j'ai redirigé dans le lanceur les sorties standard et d'erreur vers un fichier de log.

    Je sais donc précisément que ça "coince" sur le fopen ou le open, mais pourquoi ? Si vous pouvez m'aider, j'apprécierai.

    J'ai essayé de faire un ipcs via system, mais cette fonction n'est pas imlémenté dans ce linux.

    J'ai essayé de le refaire à la main, mais sysctl n'est pas compilable sous cygwin, il manque les déclarations MAXCOMLEN, KERN_PROC, KERN_PROC_ALL et struct kinfo_proc.

    Je suis ouvert à toute suggestion et merci de donner des éléments concrets pour m'aider à avancer, j'ai trop vécu de phrases lapidaires et inutiles sur les forums.

    A celui qui comprend mon problème, je le remercie d'avance de m'avoir lu et son débiteur éternel s'il sait me solutionner ce problème.

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour,

    Citation Envoyé par Bigvivi68 Voir le message
    J'espère pouvoir être aidé !

    Je travaille pour un TomTom sous Linux (none) 2.6.13 assez bridé tout de même.
    Je compile sous Cygwin sur un PC sous Windows 7 (et pas de volonté de changer d'OS pour les "répondeurs" à la petite semaine).
    Bon. J'imagine que ce problème te pèse depuis un moment, et que tu ne travailles probablement pas sur ton système de prédilection. Mais tu comprends que traiter les gens qui pourraient se pencher sur ton cas de « répondeurs à la petite semaine », c'est quand même pas le meilleur moyen d'obtenir de l'aide.

    Ensuite, sans changer d'O.S. (et notamment d'éditeur de texte pour tes programmes, je suppose que c'est important), tu peux quand même utiliser un hyperviseur pour faire tourner un vrai noyau dans une fenêtre. Étant donné que tu as l'air de descendre à un niveau assez bas (proche du système), il a des chances que tu atteignes un peu les limites de Cygwin.

    Sinon, si tu fais ça professionnellement, peut-être as-tu un serveur Linux dans ta compagnie auquel tu pourrais te connecter depuis ta machine. Ce serait quand même beaucoup plus confortable.

    Je réalise une lib de hooking des fonctions open, close, read, write, memcpy, que je charge via LD_PRELOAD au démarrage du système.
    À la différence de memcpy(), les quatre premières fonctions sont en fait des appels système (du noyau). Cela dit, ils sont quand même bufferisés par la libc, donc tu devrais quand même retomber sur tes pattes.

    Je fais cette lecture à chaque appel du memcpy et j'ai monté un flag personnel (pas un sémaphore) pour éviter que le code ne soit réentrant, on ne sait jamais.
    En garantissant l'atomicité de l'opération, j'imagine. Enfin, ça n'importe que peu pour le moment.

    Je souhaitais lire les /proc/pid/stat via fopen et fscanf, puis par open et read, mais rien ne fonctionne, clairement j'inscris chaque action par printf et j'ai redirigé dans le lanceur les sorties standard et d'erreur vers un fichier de log.

    Je sais donc précisément que ça "coince" sur le fopen ou le open, mais pourquoi ? Si vous pouvez m'aider, j'apprécierai.
    C'est-à-dire ? On ne sait même pas encore ce que tu cherches à faire au final !

    Quelles sont les valeurs de retour de ces fonctions ? Que vaut errno ? On peut voir ton code ? On peut voir les fichiers de log en question, au moins ?

    J'ai essayé de faire un ipcs via system, mais cette fonction n'est pas imlémenté dans ce linux.
    Pourquoi faire ?

    J'ai essayé de le refaire à la main, mais sysctl n'est pas compilable sous cygwin, il manque les déclarations MAXCOMLEN, KERN_PROC, KERN_PROC_ALL et struct kinfo_proc.
    Doit-on comprendre que tu développes exclusivement sous Cygwin pour embarquer ton application ensuite sur un TomTom que tu ne vois pas actuellement ?

    Je suis ouvert à toute suggestion et merci de donner des éléments concrets pour m'aider à avancer, j'ai trop vécu de phrases lapidaires et inutiles sur les forums. A celui qui comprend mon problème, je le remercie d'avance de m'avoir lu et son débiteur éternel s'il sait me solutionner ce problème.
    Certainement, mais c'est trop nébuleux pour le moment. Donne-nous des détails clairs et on tâchera de t'aider.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Obsidian :
    Mais tu comprends que traiter les gens qui pourraient se pencher sur ton cas de « répondeurs à la petite semaine », c'est quand même pas le meilleur moyen d'obtenir de l'aide.
    Absolument loin de moi d'insulter qui que ce soit et à l'inverse obtenir la réponse type "t'as qu'à ... changer de système, de compilateur, etc .." qui revient en permanence sur les forums sans plus de remarques constructives à le don de m'exaspérer car n'apporte rien au problème et si la demande est arrivée sur un forum, c'est que la majorité des développeurs à qui cela arrive n'en ont pas la possibilité pour des raisons certaines.
    Je ferme cette parenthèse hors du sujet principal de ma demande.

    Voici le log obtenu :
    WRAPPER.SO: MEMSHARE init start
    WRAPPER.SO: MEM_ID=32769 pmemshare=0x4043c000
    WRAPPER.SO: MEMSHARE refresh start
    SHMID_DS: uid 0, gid 0, cuid 0, cgid 0, mode 0666
    SHMID_DS: segsz 32, lpid 580, cpid 580, nattch 1
    SHMID_DS: atime: Mon Jun 13 08:28:26 2011
    dtime: Mon Jun 13 08:28:26 2011
    ctime: Mon Jun 13 08:28:26 2011

    WRAPPER.SO: MEMSHARE haven't client.
    WRAPPER.SO: MEMSHARE version =1.000000
    WRAPPER.SO: MEMSHARE alived =1
    WRAPPER.SO: MEMSHARE ts_fd =0
    WRAPPER.SO: MEMSHARE fb_fd =0
    WRAPPER.SO: MEMSHARE fb_mmap_min =(nil)
    WRAPPER.SO: MEMSHARE fb_mmap_max =(nil)
    WRAPPER.SO: MEMSHARE locked =0
    WRAPPER.SO: MEMSHARE overrided =0
    --- 29 processus ---
    ok pour 1
    Voici la fonction où le code s'arrête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /* Affiche les informations relatives a un processus selon /proc/<pid>/stat */
    /* ATTENTION: NE MARCHE PAS DANS LD_PRELOAD, peut-être à cause d'un accès non 
       exclusif aux primitives hookées */
    static void print_procinfo(const char *procdir) {
     
    char 	fullpath[sizeof ("/proc/") + NAME_MAX + sizeof ("/stat") + 1];
    char 	name[NAME_MAX + 1];
    FILE *	F = NULL;
    pid_t	pid;
     
    	sprintf( fullpath, "/proc/%s/stat", procdir );
    printf("ok pour %s", procdir);
    fflush(stdout); 
    	if(( F = fopen( fullpath, "r" )) != NULL ) { /* Clairement, ça ne marche que jusque là ! open doit attendre et ne sort plus, pourquoi ? mystère ? */
    		if( fscanf( F, "%d (%[^)]s)", &pid, name ) == 2 ) 
    			printf( "pid=%-6d\tname=%s\n", pid, name );
    		else
    			printf("Error on fscanf fullpath=%s\n", fullpath);
    		close (F);
    	}
    	else
    		printf("Error on fopen fullpath=%s\n", fullpath);
    }
    Et le code de l'appel dans le memcpy hooké :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void *memcpy( void *dest, const void *src, size_t count ) {
     
    void *ret;
     
    	/* memcpy is called before the constructor can initialize hook._memcpy (glibc 2.3.2) */
    	if ( ! hook._memcpy )
    		hook._memcpy = dlsym( RTLD_NEXT, "memcpy" );
     
     
    	if (!exclusif && dest >= hookttn_local.fb_mmap_min && dest < hookttn_local.fb_mmap_max && hookttn_local.locked) {
    		if (trace) debug( __FILE__, __FUNCTION__, __LINE__, "WRAPPER.SO: memcpy locked ( %p, %p, %u ) -> %p.", dest, src, count, ret);
    		ret = dest;
    	}
    	else {
    		ret = wrapper._memcpy( dest, src, count );
    	}
     
    	if (!exclusif && dest >= hookttn_local.fb_mmap_min && dest < hookttn_local.fb_mmap_max) {
    		exclusif++;
    		memshare_server_refresh();
    		exclusif--;
    	}
     
    	return ret;
    }
    Merci pour les différentes remarques car :
    1. J'ai oublié de préciser que l'extraction des données sur un noyau standard linux fonctionne parfaitement, le code n'est pas en cause, c'est le noyau et là je ne sais pas trop comment m'y prendre. Je veux bien reprendre à la main certaines fonctions, mais si un "fopen" ou "open" ne rend pas la main pour lire les errno et compagnie, je ne sais pas trop comment avancer sur le bug.

    2. la réécriture de l'ipcs était une recherche pour lister les processus ayants attachés un segment de mémoire partagée et s'assurer qu'il y a toujours ou non au moins un client sur celle-ci (en dehors du serveur qui est ouvert par l'init de la lib).

    Donc, je demande un avis éclairé si c'est réalisable sous Cygwin tel que je me propose de le faire, ou s'il existe une autre manière, non limitée par ce compilateur émulant linux sous windows, de surveiller les processus en cours de fonctionnement.
    Dans l'état actuel, j'y arrive par le dirent, c'est suffisant, mais je souhaitais garantir tout ça en surveillant le parent (ppid) et le nom (name) du processus pour ma fonction de traçage. Ainsi quand le code sera distribué, il sera plus facile de faire effectuer une trace sur un environnement "exotique" et détecter les cas particuliers que je n'aurais pas pris en compte lors du développement initial.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les processus - programme qui se fige
    Par filaos974 dans le forum Allegro
    Réponses: 0
    Dernier message: 25/10/2007, 19h15
  2. [VB.NET 2.0] Comment lister les processus sur PPC ?
    Par catzguy dans le forum Windows Mobile
    Réponses: 6
    Dernier message: 16/04/2006, 00h38
  3. Lister les processus et les PID dans une listview .
    Par maxoudu328 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 16/10/2005, 16h03
  4. Comment tuer les processus dans l'état sleeping sans EM ?
    Par David Guillouet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/02/2005, 09h42
  5. [reseaux] Lister les processus sur une machine donnée
    Par BEAUJAULT dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 29/07/2004, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo