Burgundy & Pinot Noir Bouvier Marsannay Longeroies

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