Esercizio 1, prova pratica 20.06.2013

From Sistemi Operativi
Jump to navigation Jump to search
Scrivere un programma che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.

Soluzione di D.Boldrin

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

typedef struct listnode {  //struttura dati per contenere tutti gli inode dei file di una directory
struct listnode *next;
int inode;
}listnode;

int main(int argc, char* argv[]){
struct stat fileStat;
int contanode=0;
char *filename=argv[1];
struct stat tp;
DIR *path;
struct dirent *dir_object;
path = opendir(argv[1]);


listnode *root;
root = (listnode*)calloc(1, sizeof(listnode));
listnode *tmp=root;
dir_object = readdir(path); //comincia la scansione della cartella
	while(dir_object != NULL){

		stat(dir_object->d_name, &tp);
			if (S_ISREG(tp.st_mode)){	//l'oggetto dir_object é un file,quindi lo salvo nella struttura
				contanode++;
				stat(dir_object->d_name, &fileStat);
				tmp->inode=(fileStat.st_ino);
				tmp->next=(listnode*)calloc(1, sizeof(listnode));
				tmp=tmp->next;
			}
	
	
	

		dir_object = readdir(path);
	}


printf("%d\n", contanode);
ordinaLista(root);
stampaLista(root);
}


void ordinaLista(listnode *pnt){

listnode *tmp=pnt;
int temp;
	while(tmp->next!=NULL){
		
		while(pnt->next!=NULL){
		if(pnt->inode<tmp->inode){
			temp=pnt->inode;
			pnt->inode=tmp->inode;
			tmp->inode=temp;
			}
		else{
		pnt=pnt->next;
		}
		}
	tmp=tmp->next;
	pnt=tmp;
	}
}


void stampaLista(listnode *pnt){

	while(pnt->next!=NULL){
		printf("%d\n",pnt->inode);
		pnt=pnt->next;
	}
}

Problema: Se come parametro gli passo l'indirizzo di una directory diverso da quella in cui si trova il file.c, non funziona, o meglio esegue, termina ma non trova alcun file all'interno della directory (anche se sono sicuro che i file ci sono).


Soluzione di blissett

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


#define MAX 1000


/* struttura che salvera nome e i_node di ogni file presente nella directory */
typedef struct i_node {
		int num;
		char *nome;
}i_node;


static int confronto (i_node* elem1, i_node* elem2)
	{
		return (elem1->num - elem2->num);	
	}

	
int main (int argc, char *argv[]) 
	{
		int x=0;
		int y=0;	
		DIR *root;
		char *buf=malloc (100*(sizeof(char)));
		struct dirent *d;
		i_node A[MAX];

		if (argv[1]==NULL) 
			{	
				
				getcwd(buf, MAX);		/* prendo directory corrente e la salvo in buf */
				if ((root = opendir (buf)) == NULL)
					{
						perror("opendir");
						return -1;	
					}
			}
		else 
			{
				buf =argv[1];
				if ((root = opendir (buf)) == NULL)
					{
						perror("opendir");
						return -1;	
					}	
				chdir(buf);		/*cambio directory corrente con quella passato a linea di comando*/
			}

		
		/*  SE VOGLIO STAMPARE SOLO I FILE REGOLARI
		while ((d=readdir (root))!=NULL)
			{			
				stat(d->d_name,&f);
				if (S_ISREG(f.st_mode))	
					{
						A[x].nome = d->d_name;
						A[x].nodo = d->d_ino;			
						x++;
					}
			
			}
		*/
	

		/* scorro tutta la directory */
		while ((d=readdir (root))!=NULL) 
			{			
						A[x].nome = d->d_name;
						A[x].num = d->d_ino;			
						x++;			
			}

		qsort(A, x--, sizeof(i_node), confronto);  /* riodina seguendo la funzione "confronto" */

		while (y<=x)
			{
				printf ("\n/%s ------ %d \n", A[y].nome, A[y].num);
				y++;	
			}
	
	}

--Blissett (talk) 09:36, 18 March 2015 (CET)