Esercizio 1, prova pratica 20.06.2013
Revision as of 13:30, 15 March 2015 by Davide.boldrin (talk | contribs)
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).