Sistemi operativi  Fabiano Dalla Piazza
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Sistemi operativi Fabiano Dalla Piazza

on

  • 298 views

 

Statistics

Views

Total Views
298
Views on SlideShare
298
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Sistemi operativi Fabiano Dalla Piazza Document Transcript

  • 1. Sistemi operativi/*Esame di sistemi operativi:scrivere una shell semplificata(comandi dir-type-copy-move) a menù.Complessità 0.3.a cura di Fabiano Dalla Piazza cdl in ingegneria informaticaIl programma è composto da un programma principale MAIN e quattro sottoprogrammi:COPIA,SPOSTA,DIRET e VISUALIZZA.Il Main chiede quale comando eseguire,su qualefile eseguirlo e memorizza queste richieste.In base al comando digitato chiamail relativo sottoprogramma.Il sottoprogramma Copia(Copy) riceve in ingresso i filedi ingresso e destinazione e li apre rispettivamente in lettura e scritturaassociandogli un flusso di dati rispettivamente in ingresso e uscita.Poi copiaun carattere alla volta e quando non ci sono più caratteri azzera e chiudeloggetto associato in lettura e chiude quello in scrittura.Il comando Sposta(Move)è una combinazione dei comandi copia e dopo elimina il file di origine.Così ripeteinizialmente la stessa procedura del comando Copia,inserendo però dei controllisullavvenuta procedura di copiatura.Se questa è accaduta, elimina il file dipartenza,altrimenti termina con un nulla di fatto.Il comando Visualizza(Type)riceve in ingresso il nome del file da visualizzare,crea uno stream di datiin ingresso collegato al file,copia i caratteri su schermo,infine azzera loggettoassociato e lo chiude.Il comando Diret(Dir dell Ms Dos o Ls Unix) riceve il nomedella directory da aprire in ingresso,vi accede,verifica che il file sia unadirectory e se lo è,apre il file in lettura(in UNIX una directory è sempre un file).Legge i file contenuti nella directory,descrive le sue caratteristiche e chiude ladirectory.direttive al preprocessore per le librerie*/#include <iostream.h>#include <conio.h>#include <fcntl.h>#include <stdio.h>#include <fstream.h>#include <sys/types.h>#include <sys/stat.h>#include <dirent.h>#include <time.h>#include <string.h>/*prototipi di funzioni*/void copia(char s3[],char s4[]);void sposta(char s3[],char s4[]);void diret(char *nome);void visualizza(char s[]);/*programma principale*/void main(){/*dichiarazione delle variabili*/char s;1agina p
  • 2. Sistemi operativichar s1[16],s2[16],s3[16],s4[16];char *nome;/*interfaccia:viene richiesta la digitazione di un tasto*/cout << "Scegliere il tasto da digitare:n"<< "c)Comando Copy per copiare un filen"<< "d)Comando Dir per visualizzare un direttorion"<< "m)Comando Move per spostare un filen"<< "t)Comando Type per visualizzare un filen"<< "u)Per uscire" << endl;/*cicla se non viene digitato il tasto u,e in base al tasto esegui il comando*/while((s=getch())!= u){/*scelta multipla*/switch(s){/*se è stato scelto il tasto c,il programma richiede il file da copiare,lo memorizza,richiede il file su cui copiare,chiama il sottoprogrammacopia ed esce dal ciclo switch*/case c:cout << "Quale file desideri copiare?n";cin >> s1;cout << "Il nome del file su cui copiare?n";cin >> s2;copia(s1,s2);break;/*se è stato scelto il tasto d,il programma chiede il nome delladirectory da listare,lo memorizza,chiama il sottoprogrammadiret ed esce dal ciclo switch*/case d:cout << "Digita il nome della directory da listaren";cin >> nome;diret(nome);break;/*se è stato scelto il tasto m,il programma chiede il nome delfile da spostare,lo memorizza,chiede su quale file spostarlo,chiama il sottoprogramma sposta ed esce dal ciclo switch*/case m:cout << "Quale file desideri spostare?n";cin >> s3;cout << "Su quale file desideri spostarlo?n";cin >> s4;sposta(s3,s4);break;/*se è stato scelto ilo tasto t,il programma chiede il nome delfile da visualizzare,lo memorizza,chiama il sottoprogrammavisualizza ed esce dal ciclo switch*/2agina p
  • 3. Sistemi operativicase t:cout << "Quale file desideri visualizzare?n";cin >> s1;visualizza(s1);break;/*se è stato scelto un tasto sconosciuto un messaggio avvisadellerrore ed esce dal ciclo switch*/default:cout << "Comando sconosciuto.Riprovan";break;}//switch}//while}//main/*sottoprogramma copia*/void copia(char s3[],char s4[]){/*dichiara le variabili intera,carattere e stream(flusso) di datiin ingresso(leggi) e uscita(scrivi)*/char c;int conta;fstream leggi;fstream scrivi;/*open associa alloggetto leggi(uno stream) loggetto s3(il file dacopiare;quindi viene aperto in lettura il file s3 da copiare*/leggi.open(s3,ios::in);/*se lapertura fallisce avverte lutente*/if(leggi.fail())cout << "Apertura file in lettura fallita!n";/*open associa alloggetto scrivi(uno stream) loggetto s4(il file sucui copiare;quindi viene aperto in scrittura il file su cui copiare*/scrivi.open(s4,ios::out);/*se lapertura fallisce avverte lutente*/if(scrivi.fail())cout << "Apertura file in scrittura fallita!n";/*inizializza la variabile che conta il numero dei caratteri*/conta=0;/*cicla finché non raggiunge fine file o fallisce*/do{/*legge un carattere alla volta sul file da copiare*/leggi >> c;/*condizioni di interruzione ciclo*/if(leggi.fail()||leggi.eof())break;3agina p
  • 4. Sistemi operativi/*eco su schermo*/cout << c;/*scrittura sul file di destinazione*/scrivi << c;/*Incrementa il contatore*/conta++;}while(1);cout << "nSono stati copiati " << conta << " caratteri"<< "n====FINE FILE====nAspetto taston";/*aspetta tasto,azzera lo stato del file da copiare(clear) e chiude lostream collegato ai file(close)*/getch();leggi.clear();leggi.close();scrivi.close();}//copia/*sottoprogramma sposta*/void sposta(char s3[],char s4[]){/*dichiara le variabili intere e booleana e gli stream verso file*/char c;int conta,rimosso;bool successo=true;fstream leggi;fstream scrivi;/*apre lo stream di dati in ingresso nel file da copiare*/leggi.open(s3,ios::in);/*se lapertura fallisce,avverte lutente e assegna alla variabilebooleana il valore di copiatura fallita(successo=false)*/if(leggi.fail()){cout << "Apertura file in lettura fallita!n";successo=false;}//if/*apre lo stream di dati in uscita nel file di destinazione*/scrivi.open(s4,ios::out);/*se lapertura fallisce,avverte lutente e assegna alla variabilebooleana il valore di copiatura fallita(successo=false)*/if(scrivi.fail()){cout << "Apertura file in scrittura fallita!n";4agina p
  • 5. Sistemi operativisuccesso=false;}//if/*inizializza la variabile che conta il numero di caratteri*/conta=0;/*cicla finché non sono a file file o fallisce*/do{/*legge un carattere alla volta dal file di origine*/leggi >> c;/*condizioni di fine ciclo*/if(leggi.fail()||leggi.eof())break;/*eco su schermo*/cout << c;/*copia sul file di destinazione*/scrivi << c;/*incrementa il contatore*/conta++;}while(1);/*se non ha copiato nulla, la copiatura è fallita*/if(conta == 0)successo=false;else cout << "nSono stati copiati " << conta << " caratteri";/*segnala il fine file,aspetta tasto a piacere,azzera lo stream delfile di lettura e chiude entrambi gli stream*/cout << "n====FINE FILE====nAspetto taston";getch();leggi.clear();leggi.close();scrivi.close();/*se la copiatura è avvenuta posso rimuovere il file di partenzae se la rimozione non è accaduta viene segnalato*/if(successo == true){rimosso=remove(s3);if(rimosso != 0)cout << "Il file originale non è stato rimosson";}//if/*se la copiatura non è avvenuta,non cancello il file di partenzae lo segnala*/else{cout << "Il file non è stato copiaton";}//else5agina p
  • 6. Sistemi operativi}//sposta/*sottoprogramma diret*/void diret(char *nome){/*dichiara le variabili intera(conta),puntatore a struttura dellentrydirectory(*z),puntatore a struttura directory(*dirlst),puntatori astruttura per la definizione del formato tempo*/struct stat stbuf;struct tm *timeinfo,*timeinfo1,*timeinfo2;DIR *dirlst=NULL;dirent *z=NULL;int conta;/*se la chiamata di sistema stat non ha successo,visualizzo ilmessaggio ed esco*/if(stat(nome,&stbuf) == -1){cout << "nNon riesco ad accedere alla directoryn";exit(1);}//if stat -1/*se è una directory*/if((stbuf.st_mode & S_IFMT) == S_IFDIR){/*apre la directory e fallisce,invia un messaggio ed esce*/if((dirlst = opendir(nome)) == NULL){cout << "nNon riesco ad aprire la directoryn";exit(1);}//if/*invia un messaggio e azzera il contatore*/cout << "nla directory " << nome << " contiene:" << endl;conta=0;/*cicla la directory in lettura restituendo un puntatorefinché non trova oggetti a cui puntare*/while((z=readdir(dirlst)) != NULL){/*se la directory è quella corrente o quella genitore escedal ciclo e riprende lesecuzione dallinizio,evitandolinnescarsi di un ciclo infinito*/if(strcmp(z->d_name,".") == 0 || strcmp(z->d_name,"..") == 0){continue;}//if strcmp/*incrementa il contatore di file e visualizzali*/++conta;cout << conta << ") file=" << z->d_name << endl;6agina p
  • 7. Sistemi operativi}//while/*se non ci sono file viene segnalato*/if(conta == 0) cout << "Non ci sono file nella directoryn";/*se ci sono scrive le caratteristiche della directory*/else{cout << "Numero di file contenuti nella directory=" << conta<< "nDimensione é di " << stbuf.st_size << " caratteri";time(&stbuf.st_ctime);timeinfo = localtime(&stbuf.st_ctime);cout << "nData di creazione=" << asctime(timeinfo);time(&stbuf.st_atime);timeinfo1 = localtime(&stbuf.st_atime);cout << "Data di ultimo accesso=" << asctime(timeinfo1);time(&stbuf.st_mtime);timeinfo2 = localtime(&stbuf.st_mtime);cout << "Data di ultima modifica=" << asctime(timeinfo2) << endl;}//else/*chiude la directory*/closedir(dirlst);}//if/*se non è una directory*/else{cout << "Il file richiesto non è una directoryn";exit(1);}//else}//diret/*sottoprogramma visualizza*/void visualizza(char s[]){/*dichiara le variabili intere,carattere e stream di dati*/fstream f;int linee,conta;char c;/*apre uno stream di dati in ingresso sul file da leggere*/f.open(s,ios::in);/*se lapertura fallisce lo segnala*/if(f.fail())cout << "Apertura file fallitan";/*ciclo valido finchè non sono a fine file o non fallisce*/for(;;){7agina p
  • 8. Sistemi operativi/*visualizzo il numero progressivo della linea*/cout << linee << .;/*ciclo di lettura caratteri*/for(;;){/*ottengo il carattere da leggere*/c=f.get();/*se sono a fine linea,fine file o cè un errore esco dalprimo ciclo*/if((c==10)||(f.eof())||(f.fail()))break;/*incrementa il contatore del numero di caratteri*/conta++;/*eco su schermo*/cout << c;}//for/*se sono a fine file file o cè un errore*/if(f.eof() || f.fail())break;/*incrementa il contatore del numero di linee*/linee++;/*ogni 60 caratteri va a caporiga*/if((linee%60)==0) cout << n;}//for/*toglie lultima linea(non completa)*/linee--;/*non conta lultimo carattere*/conta--;/*riepiloga i dati,aspetta un tasto qualunque,azzera lo stream e chiude*/cout << "Il file " << s << " ha " << conta << " caratteri e " << linee << " lineen";cout << "Aspetto tasto!n";getch();f.clear();f.close();}//visualizza8agina p