Difference between revisions of "ProvaPratica 2013.01.25"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
m (Aggiunta soluzione di un'altro studente e migliorata organizzazione pagina.)  | 
				|||
| Line 1: | Line 1: | ||
| − | Esercizio 1  | + | ==Esercizio 1==  | 
| + | ===Soluzione di GiuliaN.===  | ||
<syntaxhighlight lang="C">  | <syntaxhighlight lang="C">  | ||
/*  | /*  | ||
| Line 61: | Line 62: | ||
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...  | Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...  | ||
| − | + | ===Soluzione di ababa===  | |
| + | <source lang="c">  | ||
| + | #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);  | ||
| + |     }  | ||
| + | }  | ||
| + | |||
| + | </source>  | ||
Latest revision as of 08:13, 9 May 2017
Esercizio 1
Soluzione di GiuliaN.
/*
http://www.cs.unibo.it/~renzo/so/pratiche/2013.01.25.pdf
 
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.
Esempio:
$ ls -l /proc/9801/exe
lrwxrwxrwx 1 renzo renzo 0 Jan 22 18:26 /proc/9801/exe -> /bin/bash
l'output del programma listexe dovrebbe essere:
$ listexe
.....
9801 /bin/bash
9933 /usr/bin/vim
.....
(alcuni link simbolici possono essere non leggibili per sicurezza, verranno omessi).*/
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[]){
	struct dirent **namelist;
	int n;
	struct stat buf;
	char dir[1024];
	char path[1024];
	char exe[1024];
	
	n = scandir("/proc", &namelist, NULL, 0);
	
	if(n<0)
		perror("scandir");
	
	else{	
		while(n--){
			sprintf(dir, "/proc/%s",namelist[n]->d_name);
			
			stat(dir,&buf);
			if(S_ISDIR(buf.st_mode)){
				sprintf(path, "%s/exe",dir);
				readlink(path, exe, 1024);
				printf("%s %s\n",namelist[n]->d_name,exe);
				free(namelist[n]);
				}
			}
		free(namelist);
		}
}
Non so se è corretto, ma sembra funzionare, però stampa anche directory che non credo vadano bene...
Soluzione di ababa
#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);
    }
}