Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <string>
- #include <map>
- #include <sys/types.h>
- #include <dirent.h>
- #include <pwd.h>
- int strToInt(std::string value){
- std::istringstream temp(value);
- int returned;
- temp >> returned;
- return returned; // Retourne la valeur si value était un nom "numérique", 0 dans le cas contraire.
- }
- int main(int argc, char* argv[]){
- std::ifstream subInput; // Ouverture des fichiers /proc/<PID>/status
- std::stringstream fileName; //
- std::string buffer, name, value; // Name et Value sont des variables que l'on utilise pour parser le fcihier /proc/<PID>/status
- std::map<std::string,std::string> process; // "tableau associatif", on associe chaque propriété du processus à sa valeur
- DIR *dir;
- struct dirent *subDir;
- dir = opendir("/proc/"); // On ouvre le /proc pour lister les processus
- while(subDir = readdir(dir)){ // tant qu'il y a des sous dossiers
- if(strToInt(subDir->d_name)){ // On vérifie si le nom du dossier est numérique
- fileName.str(""); // Vide le flux du nom du fichier
- fileName << "/proc/" << subDir->d_name << "/status"; // Récupération du status correspondant au processus qu'on lit
- subInput.open(fileName.str().c_str(), std::ios::in);
- while(!subInput.eof()){ // Lecture de l'intégralité du fichier status du processus
- /*
- 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,
- pourquoi ne pas directement lire les valeurs de la ligne dans les variables ?
- 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.
- Si quelqu'un à une autre méthode (sans utiliser sscanf ou fscanf) cela m'interesse.
- */
- std::stringstream bufferString;
- getline(subInput,buffer);
- bufferString << buffer;
- bufferString >> name >> value;
- process.insert(std::pair<std::string,std::string>(name,value)); // On associe la propriété à sa valeur
- }
- std::cout << process["Name:"] << " " << process["Pid:"] << " " << getpwuid(strToInt(process["Uid:"]))->pw_name << std::endl;
- /*
- 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
- http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/getpwuid.3.html
- */
- subInput.close();
- process.clear();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement