−Indice
Esercitazione 4
Questa esercitazione tratta le system call che operano su file.
L'accesso ai file ed alle directory deve essere effettuato esclusivamente utilizzando le system call viste a lezione. La soluzione deve includere la gestione degli arrori con una delle tecniche discusse.
Esercizio 0: perror()
Usare la perror() per stampare i messaggi di errore relativi a ENOENT, EIO ed EPERM.
Esercizio 1: mycat
Scrivere un programma C che implementa l'utility mycat
, con il seguente comportamento
bash:~$ mycat file
prova ad aprire file e, se ci riesce, stampa il suo contenuto sullo standard output.
Se attivata in modo errato, mycat
stampa un breve messaggio di uso, ad es.
bash:~$ mycat file1 file2 Uso: mycat file Stampa il contenuto di un singolo file su stdout
Esercizio 2: mycat (2)
Estendere mycat
(Esercizio 1) in modo da accettare una lista di file
bash:~$ mycat file1..fileN
per ogni file che riesce ad aprire, mycat
stampa il contenuto
su stdout preceduto da una breve intestazione es.
************************** * filek * **************************
Per ogni file che non riesce ad aprire, mycat
stampa un messaggio di errore sullo standard error.
Inoltre si implementi l'opzione [-o fileout]
che permette di specificare un file (fileout
) di
output diverso dallo standard output.
NOTA: L'opzione -o
puo' essere specificata in una posizione arbitraria della lista degli argomenti, per il parsing della linea di comando e' possibile utilizzare la funzione di libreria getopt
(vedi man 3).
Esercizio 3 : mystat
Realizzare il comando mystat
mystat file1 ... fileN
che stampa vari attributi contenuti nell'i-node dei file con path file1 … fileN.
In particolare, devono essere stampati almeno : il numero di i-nodo,
il tipo del file (regolare, directory etc.) , la maschera di protezione, (es. rw-r–r–
),
l'user identifier (uid
), il group identifier (gid
) ed il tempo dell'ultima modifica.
Suggerimenti: fare qualche esperimento con il comando `stat' (man 1),
usare la system call stat
, convertire il tempo di accesso in una stringa
stampabile con la funzione di libreria ctime()
, in time.h
, usare getpwid()
e getgrgid()
per convertire uid
e gid
nei nomi corrispondenti.
Estensione: (compilazione separata e make)
Suddividere il programma sviluppato su due file :
uno contenente un main minimale che chiama una funzione per stampare gli attributi definita nell'altro file.
Scrivere il relativo makefile
. Usare objdump/readelf
per esplorare le varie
parti dei moduli oggetto generati. Cosa contiene l'eseguibile?