CRIVELLO Un intero n > 1 non è primo se esiste un numero primo 1 < k < n per cui k divide n (ovvero il resto della divisione di n per k è 0). Sulla base di questa considerazione, completare il seguente programma C per il calcolo dei primi MAX numeri primi (crivello di Eratostene): crivello.c.
STRDUP Scrivere una funzione C con prototipo char *strdup(char *s) che copi il contenuto della string s in un area di memoria allocata dinamicamente, di lunghezza pari a quella di s, e restituisca un puntatore alla nuova copia.
STRCAT Scrivere una funzione C con prototipo void strcat(char *s, char *t) che copi il contenuto della stringa t alla fine della stringa s, in modo che al ritorno dalla funzione s sia la concatenazione delle due stringhe originali. Si assuma che s punti a un blocco di memoria grande abbastanza da contenere la concatenazione di s e t.
JOIN Scrivere una funzione C con prototipo char *join(int n, char *s[]) che, prendendo in input un array s di n elementi (ciascuno dei quali è una stringa), restituisca una nuova stringa, allocata dinamicamente, e contenente la concatenazione di tutte le stringhe in s.
EXSTUDENTE
FMYCAT Si converta il programma mycat sviluppato nell'esercizio precedente in modo da usare le funzioni della libreria standard di I/O (fopen(), fread(), fwrite(), fclose()) invece delle corrispondenti funzioni POSIX (open(), read(), write(), close()).
MISURE DI PRESTAZIONI Usando il comando time della Shell, si misuri il tempo impiegato da mycat e da fmycat per copiare alcuni grandi file. Quale versione è più veloce? Come cambiano le prestazioni al variare della dimensione del buffer in mycat? Che conclusioni possiamo trarre da queste misure?
LSB Si scriva un programma lsb che, invocato senza argomenti, stampi il nome di tutti i file contenuti nella directory corrente, ciascuno preceduto dalla sua lunghezza (in bytes) e dallo spazio effettivamente occupato su disco (sempre in bytes). Se invece vengono forniti degli argomenti, ciascuno di essi sarà il nome di una directory, e il programma deve stampare gli stessi dati per i file contenuti in ciascuna di esse.
FIND Si scriva un programma find che, invocato con find ext, cerca nella directory corrente e in tutte le sottodirectory un file con estensione .ext. Ogni volta che si trova una voce corrispondente, il programma deve stampare il nome completo del file e la sua lunghezza.
MICROSHELL-0 Si implementi una microshell che abbia il seguente comportamento:
MICROSHELL-1 Si aggiunga alla shell sviluppata al punto precedente la capacità di fare redirezione di I/O con la consueta sintassi: < file redirige lo standard input, > file redirige lo standard output.
MICROSHELL-2 Si aggiunga alla shell sviluppata al punto precedente la capacità di eseguire comandi in background con la consueta sintassi: cmd args... & esegue cmd args... in background.
PERF Si scriva un programma perf cmd opzioni che conti quante volte può essere eseguito cmd opzioni nell'arco di 10 secondi (redirigendo lo standard output e lo standard error di cmd opzioni su /dev/null). Il programma deve stampare il numero di esecuzioni complete entro il tempo dato. Opzionalmente, si confronti la velocità di macchine diverse nell'esecuzione dello stesso comando.
SIGMEM Si scrivano due programmi, lettore e scrittore che comunichino tramite segnali e memoria condivisa. Entrambi i programmi devono mappare in memoria lo stesso file /tmp/lps04.ls (creandolo se non esiste). Quindi, lettore legge una riga dal suo standard input, la scrive in memoria condivisa, e invia un segnale (si scelga con cura quale!) allo scrittore. Quest'ultimo attenderà il segnale, leggerà la stringa dalla memoria condivisa, e la stamperà sul suo standard output. Suggerimento: si consideri come può fare lettore a conoscere il pid di scrittore...
TALK Si scriva un programma talk che, invocato con talk nomepipe, legga delle stringhe da tastiera e le scriva sulla pipe con nome nomepipe. Si usi il comando cat nomepipe per svuotare la pipe all'altra estremità. Si noti come, con due istanze di talk sia possibile implementare un servizio di comunicazione bidirezionale.
Il programma talk deve creare la pipe indicata se questa non esiste già; in questo caso, al momento dell'uscita (per EOF sul suo standard input o a causa di un Ctrl-C) deve rimuovere dal file system la pipe che ha creato.