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...")
 
 
(One intermediate revision by one other user not shown)
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>
Line 87: Line 87:
  
 
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).
 
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 ==
 +
<source lang="c">
 +
#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++;
 +
}
 +
 +
 +
</source>
 +
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 09:36, 18 March 2015 (CET)

Latest revision as of 09:36, 18 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).


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)