System calls (SC) che operano su file. Per gli esercizi proposti si richiede di realizzare un Makefile.
Implementare utilizzando le chiamate di sistema open
read
write
close
l'equivalente del comando Unix cat
:
mycat file1 [fileN].
Scrivere un programma, utilizzando chiamate di sistema, che implementi l'equivalente del comando Unix cp
. Il programma deve accettare 3 argomenti come segue:
mycp_sc filein fileout [buffersize]
L'argomento 'buffersize' e' la dimensione del buffer da utilizzare per le letture e scritture con le SC read
e write
(se non specificato assegnare un valore di default, es. 256bytes):
Realizzare quindi lo stesso programma, utilizzando le chiamate di libreria fread
ed fwrite
. Chiamiamo questa seconda versione 'mycp_std'. Confrontare le performance (usando il comando time
) del programma 'mycp_sc' e 'mycp_std' al variare del parametro 'buffersize' (provare un po' di casi: 1 4 8 16 32 ….. 8192). Che cosa si nota ?
Opzionale: scrivere uno script bash che lanciato da una regola del makefile esegue mycp_sc e mycp_std scrivendo i risultati in due file separati. Plottare i dati dello 'user' e 'sys' time con gnuplot
.
Scrivere un programma C chiamato 'lsdir' che, dato come argomento un nome di directory, visita ricorsivamente tutto il sottoalbero di file e directory che ha come root la directory passata come argomento e stampi sullo standard output le informazioni nel seguente formato:
Directory: <nomedir1> file1 size permessi file2 size permessi ------------------ Directory: <nomedir2> file1 size permessi file2 size permessi ------------------
Durante la visita dell'albero di directory non cosiderare le directory .
e ..
.
Scrivere un programma C che prende come argomento un intero N>1. L'intero N rappresenta il numero di processi figli che devono essere creati in totale. I processi vanno creati come segue: il processo main stampa il suo pid e crea un figlio attendendone quindi la sua terminazione, il processo figlio a sua volta stampa il suo pid e crea un altro figlio attendendone la terminazione e cosi' via fino ad ottenere N processi figli in tutto. L'output formattato che si richiede che venga stampato sullo standard output e' il seguente:
./family 4 ---- 20894: creo un processo figlio --- 20895: creo un processo figlio -- 20896: creo un processo figlio - 20897: creo un processo figlio 20898: sono l'ultimo discendente 20898: terminato con successo - 20897: terminato con successo -- 20896: terminato con successo --- 20895: terminato con successo ---- 20894: terminato con successo