Fondamenti Fondamenti di di Sistemi Sistemi Operativi Operativi DEI DEI--Politecnico Politecnicodi diBari Bari Linux - La Shell Bash • • Esempio comando fork() Esercizi G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 1 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari • Esecuzioni di programmi Nell'esecuzione dei programmi il sistema operativo UNIX effettua normalmente le seguenti operazioni 1) creazione di un nuovo processo 2) esecuzione del programma nello spazio del nuovo processo 3) attesa della terminazione del processo 4) terminazione dell'esecuzione del processo G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 2 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari fork() 1/2 • Nella creazione di un nuovo processo è possibile utilizzare la system call fork() • Il nuovo processo è detto processo “figlio” mentre il processo che ha invocato la fork è detto processo “genitore” • fork è una system call speciale che viene invocata una volta, ma in caso di successo ritorna due volte e restituisce due valori diversi – una volta nel genitore restituendo il PID del figlio – una volta nel figlio restituendo 0 • Ogni processo può avere più figli e non esistono system call che elenchino i figli di un dato processo, mentre ogni processo ha sempre un unico genitore il cui PID viene restituito da getppid • La fork restituisce il PID del figlio per consentire al genitore di tenere traccia del processo generato G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 3 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari • fork () 2/2 Cosa succede dopo la fork? – In entrambi i processi viene eseguita l'istruzione successiva alla fork – Il modo più semplice per distinguerli ed eseguire istruzioni diverse nel genitore e nel figlio è controllare il valore di ritorno della fork • Ordine d'esecuzione – Utilizzando fork non è possibile sapere se il figlio inizierà l'esecuzione prima o dopo il padre, poiché l'ordine dipende esclusivamente dall'algoritmo di scheduling del kernel – Se si desidera imporre una sequenza precisa d'esecuzione è necessario sincronizzare i due processi utilizzando qualche forma di comunicazione interprocesso o utilizzare la system call vfork G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 4 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Esempio di fork() #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define LEN_BUFFER 32 // dimensione dell'array 'comando' int main(int argc, char *argv[]) { char comando[LEN_BUFFER]; int pid; while (1) { printf("myShell::Digita un comando da eseguire (scrivi 'quit' per uscire): "); scanf("%s", comando); Sotto UNIX, tutti i processi nascono tramite una chiamata alla funzione fork() dal proprio processo padre, tramite la quale è possibile “sdoppiare” il processo e generare un processo figlio (che nel nostro esempio sarà il comando da eseguire). // controlla se "comando" == "quit", in tal caso esci if (strcmp(comando, "quit") == 0) break; // la chiamata fork() genera un altro processo con il medesimo codice del padre // l'unica differenza tra il padre e il figlio sarà il valore restituito da fork() // ritorna 0 al nuovo processo figlio, mentre al padre ritorna l'ID del processo figlio appena creato // in caso di errore, ritorna -1 pid = fork(); // termina in caso di errore nella chiamata fork() if (pid == -1) { printf("Errore nella fork()"); exit(1); } // se pid vale zero, ci troviamo nel processo figlio if (pid == 0) { execlp(comando, comando, NULL); // se il comando appena eseguito termina con successo non arriveremo mai a questo punto, in caso contrario segnaliamo //errore printf("Errore nell'esecuzione di %sn", comando); exit(2); } // se pid non vale zero, siamo nel processo padre che aspetta semplicemente il figlio else wait(NULL); } exit(0); } G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 5 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari 1. Esercizi Si supponga che la cwd sia /home/utente1. Descrivere l’albero delle directory risultante dopo che sono stati lanciati i seguenti comandi: mkdir dir1 touch file1 f1 / mv f? dir1/ cd dir1 mkdir dir2 ../dir2 home/ cp ../f* ../dir2/ cd dir2 utente1/ cp ../f* . dir1/ f1 file1 dir2/ dir2/ file1 f1 G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 6 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Esercizi 2. Visualizza l'elenco di tutti gli utenti del sistema (solo il nome utente) $ sed ‘s/:.*/ /’ /etc/passwd 3. Visualizza l'elenco degli utenti del sistema ed accanto al nome utente le relative shell $ sed ‘s/:.*:/ /’ /etc/passwd 4. Visualizza l'elenco in formato esteso delle directory anche nascoste presenti sotto la directory corrente $ ls -la | grep ‘^d’ 5. Visualizza i file regolari che sono accessibili in lettura a qualsiasi utente $ ls -la | grep ‘^-(r..)\{3\}’ 6. Utilizzano esclusivamente ls e sed visualizza l'elenco in formato esteso dei file presenti sotto la directory corrente eliminando la colonna dei permessi $ ls -la | sed ‘s/.\{10\}//’ G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 7 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Esercizi 7. Si cancellino i risultati errati dopo aver eseguito il seguente comando (motivare la risposta): $ ls –l *a?b.sh -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 acb.sh -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 acb.sh.acb.shx -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 x.abb.shx -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 x.acb.sh I risultati errati sono: -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 acb.sh.acb.shx -rw-rw-r- - 1 utente1 did 2048 2001-05-17 20:29 x.abb.shx Perché il comando chiede che siano visualizzati i file il cui nome presenta le seguenti caratteristiche: stringa + ‘a’ + carattere + ‘.sh’ • • • • *: una qualsiasi stringa di caratteri a: il carattere a ? : un solo carattere, qualsiasi .sh: la sequenza di caratteri .sh G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 8 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Esercizi 8. Il file di testo text.txt contiene le seguenti parole casa cane gatto mondo volpe ciccio Indicare l’output del seguente comando $ grep ‘a\|[ae]$’ text.txt L’output è: casa cane gatto volpe G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 9 Fondamenti di Sistemi Operativi Esercizi DEI - Politecnico di Bari 9. Si supponga di avere il file studenti.matricole contenente una serie di cognomi, nomi e numeri di matricola separati dal carattere «;». Quale effetto ha il comando: cat studenti.matricole | grep ‘^.*;5[1-3].\{4\}$’ >> /studenti Il comando stampa le stringhe che iniziano per una sequenza qualunque di caratteri, sono seguite dal «;» e da 51 o 52 o 53 e terminano con 4 cifre, quindi le matricole che iniziano per 51 o 52 o 53 10. Mostrare una lista di tutti i file chiamati’’ core’’ in tutto il file system. Non visualizzare i messaggi di errore find / -name core 2> /dev/null 11. Trovare i file che hanno un nome che inizi con “a”e termini con “o presenti nella directory corrente • dell’utente –find . -name ‘‘ a*o’ G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 10 Fondamenti di Sistemi Operativi DEI - Politecnico di Bari Esercizi 12. Descrivere cosa produce l’esecuzione di ciascun comando contenuto nel seguente script file cd mkdir dir echo pippo > pluto ln pluto ./dir/pluto ln -s pluto ./dir/pippo rm ./dir/pippo more pluto more ./dir/p???? 1. 2. 3. 4. 5. 6. 7. 8. Vai nella home directory Crea una directory di nome dir Crea il file pluto e scrive al suo interno la stringa ‘pippo’ Crea un link fisico al file pluto presente nella home directory all’interno della directory /dir . Il nome del link fisico è pluto Crea un link simbolico al file pluto presente nella home directory all’interno della directory /dir . Il nome del link simbolico è pippo Elimina il file pippo presente in dir Visualizza (a pagine) il contenuto del file pluto presente nella home directory Visualizza (a pagine) tutti i file di 5 lettere che iniziano con la lettera p presenti nella directory dir G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 11 Fondamenti di Sistemi Operativi Esercizi DEI - Politecnico di Bari 13. Dato un file di testo text.txt contenente un elenco di iscritti a un circolo sportivo, scrivere un unico comando che permette di cercare tutti gli iscritti che hanno in cognome che inizi per vocale oppure che si chiamino ROSSI. grep ‘^[aeiou] \|\<ROSSI$’ text.txt 14. Scrivete un unico comando (pipeline) per fornire il numero di file (e directory) a cui avete accesso, contenuti nella vostra home directory; find ~ 2>/dev/null | wc -l 15. Scrivete un unico comando (pipeline) per fornire la lista dei file della home directory il cui nome è una stringa di 3 caratteri seguita da una cifra. ls ~/???[0-9] G. Piscitelli - M. Ruta - A. Cinquepalmi A.A. 2013-2014 12
© Copyright 2024 Paperzz