Prova pratica 17 07 14

From Sistemi Operativi
Revision as of 16:43, 2 April 2015 by Davide.quadrelli2 (talk | contribs) (Created page with "==Esercizio 1 == <source lang="text"> Scrivere un programma che per ogni file .c nella directory corrente chiami il compilatore gcc per generare il file oggetto (.o) a meno ch...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Esercizio 1

Scrivere un programma che per ogni file .c nella directory corrente chiami il compilatore gcc per generare il file oggetto (.o) a
meno che esista gia' nella directory un file oggetto relativo allo stesso sorgente che sia piu' nuovo (ultima modifica) del
sorgente.
Tutti I parametri devono essere passati al compilatore.
Es:
genobj -I . -ggdb
se nella directory corrente esistono I file uno.c e due.c e il file due.o deve richiamare
gcc -I. -ggdb -c uno.c
e, solo se due.o ha ultima modifica precedente a due.c, deve chiamare
gcc -I. -ggdb -c due.c

Soluzione di Davide Quadrelli

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

#define MAX 256
#define DIM_MAX 1000
#define dim_last_data 4

int main (int argc, char *argv[]){
	int i,len,com_size,bol=0;	
	struct stat o_data,f_data;
	struct dirent *cur_file;
	char name[MAX];
	char prefix[DIM_MAX]="gcc ";
	char *comm;
	FILE *o;
	FILE *obj=NULL;
	DIR *dir=opendir("./");
	/*store in prefix the common part of every command to launch*/
    for (i=1;i<argc;i++){
        strcat(prefix,argv[i]);
        strcat(prefix," ");
    }
    com_size=strlen(prefix);
    /*search in the current directory C files*/
    while(cur_file=readdir(dir)){
        if(cur_file->d_type==DT_REG){
            /*it's a file*/
            bol=0;
            strcpy(name,cur_file->d_name);
            printf("file found: %s ",name);
            len=strlen(name);
            if(strcmp(&(name[len-2]),".c")==0){
                /*C file found*/
                printf("... source code found ...");
                /*check if the file has already an uptaded object file*/
                name[len-1]='o';
                if ((o=fopen(name,"r"))==NULL){
                    /*the corrispondent object file doesn't exists*/
                    bol=1;
                    name[len-1]='c';
                }else{
                    fclose(o);
                    /*get the stat data of the object file*/
                    if(stat(name,&o_data)){
                        write(STDERR_FILENO,"ERRORE STAT",11);
                        exit(-1);
                    }
                    /*get the stat data of the C file*/
                    name[len-1]='c';
                    if(stat(name,&f_data)){
                        write(STDERR_FILENO,"ERRORE STAT",11);
                        exit(-1);
                    }
                    /*check if the object file must be re-created*/
                    if(o_data.st_mtime<f_data.st_mtime){
                        bol=1;
                    }
                }
            }
            if(bol){
                /*prepare and exec the command*/
                comm=(char *)malloc(com_size+len+dim_last_data);
                strcpy(comm,prefix);
                strcat(comm,"-c ");
                strcat(comm,name);
                system(comm);
                printf("object file created.\n%s",comm);
            }
            printf("\n\n");
        }
    }
return 0;
}

Esercizio 3

Il comando che dovrete implementare come script shell o programma python e' mytx.
Tale comando elenca tutti i file di una directory.
mytx ddd ddd.tx
Ogni riga del file di output (secondo parametro) deve contenere la lunghezza, uno spazio e il nume del file. Dopo l'ultima riga
deve inserire una riga bianca.
ddd.t2 deve contenere l'elenco dei file regolari. Il primo campo e' un numero intero seguito da uno spazio, tutto cio' che segue
fino alla fine riga e' il nome del file.
es.
12 file1
235 file di prova

Soluzione di Davide Quadrelli

#!/bin/bash
#Interpreto la richiesta del testo come segue:
#implementare mytx ddd ddd.tx ove ddd è una directory, ddd.tx è un file
#mytx deve elencare i file della directory ddd scrivere nel file ddd.tx di output una riga per file contenente
#la lunghezza del file, uno spazio e il nome del file. ddd.tx deve terminare con una riga bianca.

if [[ -d $1 ]] ; then
	ls $1
	old=`pwd`
	cd $1
	files=`ls`
	for var in $files ; do
		if [[ -f $var ]]; then
			wc -c ${var} 1>> ${old}/${2}
		fi
	done
	echo >> ${old}/${2}

else
	echo "inserire come primo parametro la directory e come secondo il file da scrivere"
fi