Esercizio 1 Prova Pratica 25-01-2013

From Sistemi Operativi
Jump to navigation Jump to search

Soluzione di ababa

Scrivere un programma listexe che fornisca in output l'elenco dei processi attivi nel sistema mettendo in output per ogni processo il pid e il path dell'eseguibile. L'informazione puo' essere trovata scandendo la directory proc, infatti ad ogni processo attivo corrisponde una directory in /proc che ha come nome il numero del processo (ad esempio al processo 9801 corrisponde la directory /proc/9801) e all'interno di queste directory il file exe e' un link simbolico all'eseguibile.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>

int main(void){

	int pid,max_size=10000;
	char *path, *dove=malloc(max_size);
	path="/proc";
	size_t size=max_size;
	struct dirent **namelist;
        int n;
	int c=0;
        n = scandir(path, &namelist, 0, alphasort);
    if (n < 0){
        perror("scandir");
    }
    else{
        while(n--){

        	DIR *cartella;
        	path=malloc(1000);
        	path[0]='\0';
			strcat(path,"/proc/");
       		strcat(path,namelist[n]->d_name);
       		//printf("%s\n",path);
       		cartella=opendir(path);
       		
       		if (cartella != NULL){
       			strcat(path,"/exe");
       			readlink(path,dove,size);
       			pid=atoi(namelist[n]->d_name);
       			if (pid!=0){
       				printf("%s ha pid: %d il path %s\n",namelist[n]->d_name,pid,dove);
       			}
       		}
       		
       		free(path);
        }  	
        printf("%d",c);
    }
}