GNU/Linux >> Tutoriels Linux >  >> Linux

API Linux pour lister les processus en cours d'exécution ?

http://procps.sourceforge.net/

http://procps.cvs.sourceforge.net/viewvc/procps/procps/proc/readproc.c?view=markup

Est la source de ps et d'autres outils de processus. Ils utilisent en effet proc (ce qui indique que c'est probablement le moyen le plus conventionnel et le meilleur). Leur source est assez lisible. Le fichier

/procps-3.2.8/proc/readproc.c

Peut être utile. Aussi une suggestion utile comme posté par ephemient est lié à l'API fournie par libproc , qui devrait être disponible dans votre référentiel (ou déjà installé je dirais) mais vous aurez besoin de la variante "-dev" pour les en-têtes et autres.

Bonne chance


Si vous ne voulez pas lire à partir de '/proc. Ensuite, vous pouvez envisager d'écrire un module Kernel qui implémentera votre propre appel système. Et votre appel système doit être écrit de manière à obtenir la liste des processus en cours, tels que :

/* ProcessList.c 
    Robert Love Chapter 3
    */
    #include < linux/kernel.h >
    #include < linux/sched.h >
    #include < linux/module.h >

    int init_module(void) {
        struct task_struct *task;
        for_each_process(task) {
              printk("%s [%d]\n",task->comm , task->pid);
        }
        return 0;
    }
   
    void cleanup_module(void) {
        printk(KERN_INFO "Cleaning Up.\n");
    }

Le code ci-dessus est tiré de mon article ici sur http://linuxgazette.net/133/saha.html. Une fois que vous avez votre propre appel système, vous pouvez l'appeler depuis votre programme d'espace utilisateur.


Voilà (C/C++):

Vous auriez pu le trouver ici :http://ubuntuforums.org/showthread.php?t=657097

Essentiellement, ce qu'il fait est de parcourir tous les dossiers numériques dans /proc/<pid> , puis il fait un readlink sur /proc/<pid>/exe , ou si vous voulez les arguments de ligne de commande cat /proc/<pid>/cmdline

Les descripteurs de fichiers ouverts par le processus sont en /proc/<pid>/fd/<descriptor> , et vous obtenez le nom du fichier en faisant un lien de lecture sur chaque lien symbolique, par ex. readlink /proc/<pid>/fd/<descriptor> . fd peut être un périphérique, tel que /dev/null, un socket ou un fichier, et potentiellement plus.

#include

ssize_t readlink(const char *path, char *buf, size_t bufsiz);
En cas de succès, readlink() renvoie le nombre d'octets placés dans buf.
En cas d'erreur, -1 est renvoyé et errno est défini pour indiquer l'erreur.

C'est d'ailleurs le même que readproc.c fait (ou du moins a fait).
Bien sûr, j'espère qu'ils l'ont fait sans possibilité de débordement de tampon.

#ifndef __cplusplus
    #define _GNU_SOURCE
#endif

#include <unistd.h>
#include <dirent.h>
#include <sys/types.h> // for opendir(), readdir(), closedir()
#include <sys/stat.h> // for stat()

#ifdef __cplusplus
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdarg>
#else
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
#endif


#define PROC_DIRECTORY "/proc/"
#define CASE_SENSITIVE    1
#define CASE_INSENSITIVE  0
#define EXACT_MATCH       1
#define INEXACT_MATCH     0


int IsNumeric(const char* ccharptr_CharacterList)
{
    for ( ; *ccharptr_CharacterList; ccharptr_CharacterList++)
        if (*ccharptr_CharacterList < '0' || *ccharptr_CharacterList > '9')
            return 0; // false
    return 1; // true
}


int strcmp_Wrapper(const char *s1, const char *s2, int intCaseSensitive)
{
    if (intCaseSensitive)
        return !strcmp(s1, s2);
    else
        return !strcasecmp(s1, s2);
}

int strstr_Wrapper(const char* haystack, const char* needle, int intCaseSensitive)
{
    if (intCaseSensitive)
        return (int) strstr(haystack, needle);
    else
        return (int) strcasestr(haystack, needle);
}


#ifdef __cplusplus
pid_t GetPIDbyName(const char* cchrptr_ProcessName, int intCaseSensitiveness, int intExactMatch)
#else
pid_t GetPIDbyName_implements(const char* cchrptr_ProcessName, int intCaseSensitiveness, int intExactMatch)
#endif
{
    char chrarry_CommandLinePath[100]  ;
    char chrarry_NameOfProcess[300]  ;
    char* chrptr_StringToCompare = NULL ;
    pid_t pid_ProcessIdentifier = (pid_t) -1 ;
    struct dirent* de_DirEntity = NULL ;
    DIR* dir_proc = NULL ;

    int (*CompareFunction) (const char*, const char*, int) ;

    if (intExactMatch)
        CompareFunction = &strcmp_Wrapper;
    else
        CompareFunction = &strstr_Wrapper;


    dir_proc = opendir(PROC_DIRECTORY) ;
    if (dir_proc == NULL)
    {
        perror("Couldn't open the " PROC_DIRECTORY " directory") ;
        return (pid_t) -2 ;
    }

    // Loop while not NULL
    while ( (de_DirEntity = readdir(dir_proc)) )
    {
        if (de_DirEntity->d_type == DT_DIR)
        {
            if (IsNumeric(de_DirEntity->d_name))
            {
                strcpy(chrarry_CommandLinePath, PROC_DIRECTORY) ;
                strcat(chrarry_CommandLinePath, de_DirEntity->d_name) ;
                strcat(chrarry_CommandLinePath, "/cmdline") ;
                FILE* fd_CmdLineFile = fopen (chrarry_CommandLinePath, "rt") ;  // open the file for reading text
                if (fd_CmdLineFile)
                {
                    fscanf(fd_CmdLineFile, "%s", chrarry_NameOfProcess) ; // read from /proc/<NR>/cmdline
                    fclose(fd_CmdLineFile);  // close the file prior to exiting the routine

                    if (strrchr(chrarry_NameOfProcess, '/'))
                        chrptr_StringToCompare = strrchr(chrarry_NameOfProcess, '/') +1 ;
                    else
                        chrptr_StringToCompare = chrarry_NameOfProcess ;

                    //printf("Process name: %s\n", chrarry_NameOfProcess);
                    //printf("Pure Process name: %s\n", chrptr_StringToCompare );

                    if ( CompareFunction(chrptr_StringToCompare, cchrptr_ProcessName, intCaseSensitiveness) )
                    {
                        pid_ProcessIdentifier = (pid_t) atoi(de_DirEntity->d_name) ;
                        closedir(dir_proc) ;
                        return pid_ProcessIdentifier ;
                    }
                }
            }
        }
    }
    closedir(dir_proc) ;
    return pid_ProcessIdentifier ;
}

#ifdef __cplusplus
    pid_t GetPIDbyName(const char* cchrptr_ProcessName)
    {
        return GetPIDbyName(cchrptr_ProcessName, CASE_INSENSITIVE, EXACT_MATCH) ;
    }
#else
    // C cannot overload functions - fixed
    pid_t GetPIDbyName_Wrapper(const char* cchrptr_ProcessName, ... )
    {
        int intTempArgument ;
        int intInputArguments[2] ;
        // intInputArguments[0] = 0 ;
        // intInputArguments[1] = 0 ;
        memset(intInputArguments, 0, sizeof(intInputArguments) ) ;
        int intInputIndex ;
        va_list argptr;

        va_start( argptr, cchrptr_ProcessName );
            for (intInputIndex = 0;  (intTempArgument = va_arg( argptr, int )) != 15; ++intInputIndex)
            {
                intInputArguments[intInputIndex] = intTempArgument ;
            }
        va_end( argptr );
        return GetPIDbyName_implements(cchrptr_ProcessName, intInputArguments[0], intInputArguments[1]);
    }

    #define GetPIDbyName(ProcessName,...) GetPIDbyName_Wrapper(ProcessName, ##__VA_ARGS__, (int) 15)

#endif

int main()
{
    pid_t pid = GetPIDbyName("bash") ; // If -1 = not found, if -2 = proc fs access error
    printf("PID %d\n", pid);
    return EXIT_SUCCESS ;
}

Si vous ne le faites pas, je suppose que l'API que vous utiliserez finira par lire le système de fichiers /proc. Voici quelques exemples de programmes faisant cela :

  • qps
  • htop
  • procps

Mais malheureusement, cela ne constitue pas une API.


Linux
  1. Comment définir des limites sur les processus d'exécution de l'utilisateur sous Linux

  2. 3 façons de lister les utilisateurs sous Linux

  3. Commande Linux ps

  4. Comment répertorier les processus attachés à un segment de mémoire partagée sous Linux ?

  5. Comment afficher la liste des processus en cours d'exécution Python ?

Comment trouver et tuer les processus en cours d'exécution sous Linux

Commande SS sous Linux

Surveillance des processus sous Linux

Processus en cours d'exécution

Comprendre les processus sous Linux

Comment trouver les principaux processus en cours d'exécution par utilisation de la mémoire et du processeur sous Linux