Difference between revisions of "Esercizio 1, prova pratica 20.06.2013"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<source lang="text"> 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 progr...")
 
Line 3: Line 3:
 
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.
 
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.
 
</source>
 
</source>
 
+
==Soluzione di D.Boldrin==
 
<source lang="c">
 
<source lang="c">
 
#include <stdio.h>
 
#include <stdio.h>

Revision as of 13:30, 15 March 2015

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).