Advertisement
Guest User

Process Under Linux

a guest
Jul 1st, 2012
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8. #include <pwd.h>
  9.  
  10. int strToInt(std::string value){
  11.     std::istringstream temp(value);
  12.     int returned;
  13.     temp >> returned;
  14.     return returned; // Retourne la valeur si value était un nom "numérique", 0 dans le cas contraire.
  15. }
  16. int main(int argc, char* argv[]){
  17.    
  18.     std::ifstream subInput; // Ouverture des fichiers /proc/<PID>/status
  19.     std::stringstream fileName; //  
  20.     std::string buffer, name, value; // Name et Value sont des variables que l'on utilise pour parser le fcihier /proc/<PID>/status
  21.     std::map<std::string,std::string> process; // "tableau associatif", on associe chaque propriété du processus à sa valeur
  22.     DIR *dir;
  23.     struct dirent *subDir;
  24.     dir = opendir("/proc/"); // On ouvre le /proc pour lister les processus
  25.     while(subDir = readdir(dir)){ // tant qu'il y a des sous dossiers
  26.         if(strToInt(subDir->d_name)){ // On vérifie si le nom du dossier est numérique
  27.             fileName.str(""); // Vide le flux du nom du fichier
  28.             fileName << "/proc/" << subDir->d_name << "/status"; // Récupération du status correspondant au processus qu'on lit
  29.             subInput.open(fileName.str().c_str(), std::ios::in);
  30.             while(!subInput.eof()){ // Lecture de l'intégralité du fichier status du processus
  31.                 /*
  32.                    ce passage est le plus "complexe" du code, en effet, on récupère la ligne du fichier, et on la stocke dans un stringstream,
  33.                    pourquoi ne pas directement lire les valeurs de la ligne dans les variables ?
  34.                    Car comme vous avez pu le constater, une propriété à parfois plusieurs valeurs, il y aurait donc un problème lors de la lecture du fichier.
  35.                    Si quelqu'un à une autre méthode (sans utiliser sscanf ou fscanf) cela m'interesse.
  36.                 */
  37.                 std::stringstream bufferString;
  38.                 getline(subInput,buffer);
  39.                 bufferString << buffer;
  40.                 bufferString >> name >> value;
  41.                 process.insert(std::pair<std::string,std::string>(name,value)); // On associe la propriété à sa valeur
  42.             }
  43.             std::cout << process["Name:"] << " " << process["Pid:"] << " " << getpwuid(strToInt(process["Uid:"]))->pw_name << std::endl;
  44.             /*
  45.                Affichage du résultat, tout simplement, petite subtilité pour récupérer le nom d'utilisateur à partir de l'UID, je vous revois à la fonction
  46.                http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/getpwuid.3.html
  47.             */
  48.             subInput.close();
  49.             process.clear();
  50.         }
  51.     }
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement