ProvaPratica 2013.01.25

From Sistemi Operativi
Revision as of 16:26, 18 December 2013 by GiuliaN (talk | contribs)
Jump to navigation Jump to search

Esercizio 1

/*
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...

GiuliaN.