Prozess ID ausgeben



  • Ich möchte die ProzessID eines Programmes auslesen (Linux). Habe dafür diese Funktion als Beispiel. Das geht auch so, bis auf das Problem das zwar die Prozesse so angezeigt werden können, aber irgendwie will das das nicht gehen. Es müsste doch eigentlich beim Stringvergleich aine Ausgabe erfolgen, aber da kommt nichts. Hat jemand einen Tipp, oder wie gehts besser (getpid()=??

    void getList()
    {
    	DIR *dir;
    	struct dirent *entry;
    
    	dir = opendir("/proc");	
    	if (dir) 
    	{
    		do
    		{
    			entry = readdir(dir);
    			if (entry)
    			{
    				string dir_x = entry->d_name;
    
    				string filename = "/proc/" + dir_x +"/cmdline";
    				string filter = "ausgeführtes_programm";
    
        				ifstream f;
         				string s;
    
         				f.open(filename.c_str(), ios::in); 
    
    				if (f)
    				{
            				getline(f, s); 
    					if (!s.empty())
    					{
    						if (s == filter) cout << s <<" "<< dir_x<<endl;
    						f.close();
     						return ;
    					}
    					f.close();
    				}
    			}						
    		}
    		while (entry);
    	}
    		closedir(dir);
    
    }
    

  • Mod

    Nette Idee, doch ich kann dir einen Einzeiler als Ersatz anbieten:

    http://linux.die.net/man/3/getpid



  • Aber damit wird doch nur die eigene ID ausgegeben, ich will aber die von'em anderen Programm ausgeben.



  • Also so gehts dann!

    void getList()
    {
    	DIR *dir;
    	struct dirent *entry;
    
    	dir = opendir("/proc");	
    	if (dir) 
    	{
    		do
    		{
    			entry = readdir(dir);
    			if (entry)
    			{
    				string dir_x = entry->d_name;
    
    				string filename = "/proc/" + dir_x +"/cmdline";
    				string filter = "ausgeführtes_programm";
    
        				ifstream f;
         				string s;
    
         				f.open(filename.c_str(), ios::in); 
    
    				if (f)
    				{
            				getline(f, s); 
    					if (!s.empty())
    					{
    						if (strcmp(filter.c_str(), s.c_str()) == 0)
    						{
    							cout << s <<" "<< dir_x<<endl;
    							f.close();
    							return 0;
    						}
    					}
    					f.close();
    				}
    			}						
    		}
    		while (entry);
    	}
    		closedir(dir);
    
    }
    


  • Eine Mischung aus C und C++... Sehr reudig.


  • Mod

    Das ist doch wohl nicht dein Ernst, oder?

    if (strcmp(filter.c_str(), s.c_str()) == 0)
    


  • Zudem: Müsste vor deinem return -Statement mitten in der Funktion nicht noch ein

    closedir(dir);
    

    stehen? Bei dieser C-Style-Funktion nehme ich an, dass du sonst ein Ressourcenleak hast.

    Tipp: In C++ gibts RAII, da hast du solche Probleme nicht.


Anmelden zum Antworten