Corso di Sistemi Operativi Programmazione di sistema e concorrente

Università di Roma “La Sapienza”
Dipartimento di Informatica e Sistemistica
Corso di Sistemi Operativi
Programmazione di
sistema e concorrente
Lezione I
I sistemi Unix
A.A. 2003/2004
Dati personali
• Fabiano Sarracco
([email protected])
• Home-page:
http://www.dis.uniroma1.it/~sarracco
• Ricevimento:
– Giovedì 14:30-16:00
– Via Salaria 113, stanza 253
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
2
Scopo del corso
• Programmazione dei sistemi UNIX
• Applicazione tecniche di
programmazione concorrente
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
3
Testi di riferimento
• A.Silberschatz, P.Galvin. “Sistemi Operativi”,
Addison Wesley, 1994.
• F.Quaglia, C.Demetrescu. “Programmazione in
ambiente UNIX”
• S.Goldt et al. “The Linux Programmer’s Guide”
(cap.6)
• S.J.Leffler et al. “An advanced 4.3BSD
Interprocess Communication Tutorial”
• W. Richard Stevens, "UNIX Network
Programming", Volume: 1, Prentice Hall PTR, 2nd
edition
• …
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
4
Argomenti del corso
• Panoramica sui sistemi UNIX (L1):
– Struttura del sistema;
– Principali comandi;
– Shell scripting;
• Programmazione C in UNIX (L2)
• UNIX System Calls:
– Gestione dei processi (L3);
– Gestione dei file (L4);
– Comunicazione e sincronizzazione fra processi;
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
5
Argomenti del corso
Comunicazione e sincronizzazione
• Gestione di eventi asincroni (L5):
– Segnali
• Costrutti per la sincronizzazione (L6):
– Semafori
• Costrutti per la comunicazione (L6-7):
– PIPE e FIFO
– Code di messaggi
– Memoria condivisa
• Costrutti per la comunicazione in sistemi distribuiti
(L8):
– Socket
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
6
Panoramica sui sistemi
UNIX
La struttura del sistema UNIX
Comandi di UNIX
Storia
dei
sistemi
UNIX
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
8
Brevi cenni storici
• 1969: nascita di UNIX ai Bell Laboratories. Scritto
da Ken Thompson (e Dennis Ritchie) in Assembly
per un PDP-7. Derivato da MULTICS.
• 1976: prima versione pubblica (versione 6) riscritta
in C.
• 1983: UNIX System V e Berkeley BSD che
fornisce memoria virtuale.
• 1991: Linus Torvalds sviluppa la prima versione di
Linux.
• 1993: Versione 4.4BSD
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
9
Concetti fondamentali
• Sistema multitasking time-sharing;
• Supporto per processi multipli (scheduling con
priorità) ed IPC;
• Sistema multi-utente;
• File system con directories strutturate ad albero;
• Dispositivi trattati come file (speciali) ⇒ stesse
system call per scrivere su un file, terminale o
stampante;
• Interfaccia utente (shell) semplice e sostituibile;
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
10
Concetti fondamentali
• Sistema multitasking time-sharing:
– Nucleo centrale (kernel): fornisce le funzioni di base
per gestire le risorse del sistema (scheduling dei
processi, file system, gestione della memoria)
– Interfaccia programmatore basata su System Call.
– Il resto delle funzionalità è dato come programmi di
sistema (utilities): usano le system calls fornite dal
kernel
⇒ interfaccia utente semplice e flessibile.
– Ogni processo ha un pid che lo identifica univocamente
dagli altri.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
11
Struttura a livelli
Applicazioni
astrazione
Utilities
Librerie
Interfaccia con il kernel (System Calls)
Signals
Terminal
handling
I/O System
CPU
scheduling
File System
Swapping block
I/O System
Disk & Tape
drivers
Page
replacement
Demand
paging
Virtual
memory
Virtual machine
SO
Interfaccia kernel-hardware
Terminali
Devices
Memoria
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
HW
12
Concetti fondamentali
• Sistema multiutente:
– Attributi utente: login name, password, group
name, userID, groupID, home directory
assegnati dal SysAd (gli userID e groupID
numerici rimasti per ragioni storiche);
– Ogni risorsa (file, dispositivi, etc.) ha associato
un utente proprietario e dei privilegi di
accesso che stabiliscono quali utenti possono
farne uso: maschera di 3 gruppi (user, group,
others) di 3 bit rwx.
– Utente speciale root o superuser (avente
userID = 0).
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
13
File System
• Struttura ad albero contenente files e directory
• Fornsice una visione logica, non fisica
• Directories fondamentali:
– bin
versione eseguibile dei programmi distribuiti in
UNIX
– dev
collezione di file “speciali” come terminali,
stampanti, etc
– etc
informazioni essenziali al funzionamento del
sistema (/etc/passwd, /etc/groups)
– home home directories per gli utenti
– mnt
directory per i mounted devices (cd, floppy)
– tmp
file di lavoro temporanei
– usr
file di sistema (applicazioni, utility, …)
– var
file di sistema modificabili
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
14
File System
• Filename: sequenza di caratteri tranne ‘/’ ed il
carattere nullo (ASCII 0, NUL)
• Pathname: sequenza di filename separati da ‘/’
– assoluto: inizia per ‘/’;
– relativo: non inizia per ‘/’;
• Ogni processo ha una directory corrente di lavoro
rispetto a cui vengono risolti i pathname relativi
• In ogni nuova directory creata vengono
automaticamente creati due nomi di file:
– ‘.’ si riferisce alla directory stessa
– ‘..’ si riferisce alla directory genitore
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
15
Avvio di UNIX
1. Il Kernel viene caricato da combinazione
firmware/software. Questo crea un’istanza
di /etc/init
2. init legge il file /etc/inittab e crea
un’istanza di /etc/getty per ogni
terminale disponibile
3. getty stampa il messaggio “login:”;
quando questo viene inserito crea
un’istanza di /bin/login
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
16
Avvio di UNIX
4. login stampa “password:”, e ne
attende l’immissione; verifica utente e
password in /etc/passwd e lancia il
programma iniziale associato a
quell’utente, tipicamente una shell
5. Inizia una sessione di lavoro
6. Quando un utente esce dalla shell
(logout), il kernel segnala ad init di
riavviare la sequenza getty/login per
quel terminale.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
17
Avvio di UNIX - Schema
processo
kernel
pid=0
processo
init
pid=1
processo
getty
processo
login
processo
shell
processo
getty
processo
login
processo
shell
processo
getty
processo
login
processo
shell
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
18
Shell
• La shell (conchiglia) racchiude il kernel, è lo strato
con cui l’utente entra in contatto quando vuole
interagire con il sistema.
• E’ un interprete di comandi, che fornisce:
– un’interfaccia verso un ricco insieme di utility
– un linguaggio di programmazione, con variabili, funzioni
e costrutti per il controllo del flusso, per “combinarle”.
• Due tipi di funzionamento:
– interattivo: i comandi sono digitati da tatsiera dall’utente
– non interattivo: i comandi sono contenuti in file di testo,
detti script, utilizzabili in modo (quasi) indistingubile
rispetto ai comandi ordinari (es. quelli in /bin/)
Possibilità di personalizzare l’ambiente di lavoro.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
19
Caratteristiche della shell
• Due tipi di comandi:
– Comandi interni (o builtin): sono particolari comandi
eseguiti direttamente dalla shell;
– Comandi esterni: sono nomi di programmi eseguibili
che portano a termine il comando;
• Consente di inviare l’input e l’output di un
comando verso file o verso altri comandi
(reindirizzamento):
– comando > output
– comando < input
– comando | altrocomando
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
20
Operazioni della shell
1. Legge l’input:
•
•
•
dalla tastiera del terminale utente
da una stringa passata come argomento (opzione -c)
da un file di script
2. Scompone l’input in parole ed operatori.
3. Effettua l’espansione degli alias.
4. Esegue i necessari reindirizzamenti, rimuovendo
gli operatori ed i loro operandi dalla lista degli
argomenti.
5. Esegue il comando.
6. Aspetta che l’esecuzione termini e quindi ne
rileva lo stato.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
21
Tipi di shell
• Esistono diverse shell:
–
–
–
–
Bourne shell (sh)
Korn shell (ksh)
C shell (csh ed il suo successore tcsh)
Bourne Again SHell (bash)
E’ la shell (quasi) standard in ambiente Linux.
Compatibile con sh, ne migliora aspetti interattivi e
programmativi.
• Presentano numerosi aspetti comuni. Differiscono
per la sintassi, per alcuni comandi interni e per
alcune caratteristiche e funzionalità più
sostanziali.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
22
Comandi interni
fondamentali
• cd - cambia la directory corrente
• pwd - mostra la directory corrente
• export - imposta una variabile di
ambiente
• kill - invia un segnale ad un processo
– kill -9 - “uccide” un processo
• logout - esce dalla shell
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
23
Utilities fondamentali
• ls - mostra i files contenuti nella directory
corrente
• ps - mostra i processi in esecuzione
• cp - copia un file
• mv - sposta (o rinomina) un file
• rm - elimina un file
• mkdir - crea una directory
• rmdir - elimina una directory
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
24
Altri comandi
awk ricerca ed elabora
pattern in un file
cal mostra il calendario del
mese corrente
cat mostra o unisce dei
files
chgrp modifica il gruppo
associato ad un file
chmod modifica i permessi
di accesso ad un file
cmp confronta due file
chown modifica il
proprietario di un file
compress comprime file
cut estrae colonne da un
file
date legge/imposta la data
nel sistema
diff mostra le differenze
fra files
df mostra la quantità di
spazio disponibile su disco
du mostra informazioni sullo
spazio utilizzato su disco
file classifica i file
find cerca file
fsck controlla e ripara il file
system
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
25
Altri comandi
grep ricerca pattern in un
file
groups mostra i gruppi a
cui appartiene l’utente
gzip comprime i file
head mostra le righe iniziali
di un file
ln crea un collegamento ad
un file
lp(r) stampa file
lprm rimuove un lavoro
dalla coda di stampa
more mostra un file una
schermata alla volta
paste unisce le colonne in un
file singolo
sed editor di stream
sort ordina e/o unisce file
spell ricerca errori di
ortografia in un file
split divide un file in più
parti
tail mostra la ultime righe di
un file
tar aggiunge o estrae file da
un file di archivio
tr trasforma caratteri
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
26
Altri comandi
umask imposta i permessi di
creazione su di un file
uniq rimuove duplicati
wc conta le righe, le parole
ed i caratteri di un file
whatis elenca le pagine di
manuale per un comando
whereis mostra il percorso
completo di un eseguibile
which localizza un
programma eseguibile
utilizzando "PATH"
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
27
Metacaratteri
MC Significato
Reindirizz.
>
Esempio
Wildcard
Ridirezione dell’output
ls >temp
Ridirezione dell’output (append)
ls >>temp
<
Ridirezione dell’input
wc -l | text
|
Concatenazione
ls | more
*
Stringa di 0 o più caratteri, ad
eccezione del punto
ls a*.c
?
Un singolo carattere ad eccezione del
punto
ls a?.c
[…]
Un singolo carattere fra quelli elencati
ls [a-zA-Z].txt
{…}
Le stringhe enumerate fra parentesi
ls *.{doc,txt}
>>
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
28
Metacaratteri
MC Significato
;
Esempio
Sequenza di comandi
cd;pwd;ls
||
Esecuzione condizionale. Esegue il
comando se il precedente fallisce
gcc prog.c || echo
errore
&&
Esecuzione condizionale. Esegue il
comando se il precedente termina con
successo
gcc proc.a &&
a.out
Raggruppamento di comandi
(cd;pwd;ls) >
mydir.txt
#
Introduce un commento
ls # lista di file
\
Fa in modo che la shell non interpreti in
modo speciale il carattere che segue
ls file.\*
!
Ripetizione dei comandi memorizzati
nella history list
!ls
(…)
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
29
Shell scripting
• Script: programma scritto ed eseguito nella sua forma
sorgente senza compilazione (interpretato).
• Le istruzioni contenute in uno shell script vengono
interpretate ed eseguite dalla shell;
• Il formato dello script dipende dal tipo di shell utilizzata;
per distinguere il tipo di interprete, la prima riga dello script
contiene il percorso della shell che deve interpretare lo
script
#!/bin/sh
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
30
Esecuzione di script
Due modi per eseguire uno script:
• passare lo script come argomento
all’interprete;
– ad es. lo script bash di nome pippo può essere
eseguito con /bin/sh pippo
• specificare il tipo di interprete all’interno
dello script, rendere eseguibile lo script con
chmod +x pippo, chiamare lo script con il
suo nome, come un qualsiasi altro comando
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
31
Modalità di esecuzione
Shell
foo
cmd 1
Sottoshell
Shell
cmd N
foo
Sottoshell
Shell
…
Esecuzione 1:
> foo
cmd 1
foo
cmd 1
…
…
cmd N
cmd N
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
Esecuzione 2:
> foo &
Esecuzione 3:
> source foo
32
Variabili
• Un variabile è una coppia
<nome-variabile, stringa di caratteri>
• Si accede al contenuto con $nome-variabile
• case sensitive : var1 diversa da Var1
• Le variabili non vanno dichiarate
• Inizializzazione: var=stringa, tra virgolette (o
apostrofi) se contiene caratteri speciali;
• Assegnazione: var=$altravar
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
33
Variabili d’ambiente
• Le variabili sono locali alla shell o allo script
in cui sono definite
• La variabili d’ambiente sono variabili
globali
• Insieme di variabili di ambiente speciali per
la shell: PS1, HOME, PATH, PWD, UID
• Per esportare una variabile locale in una
d’ambiente si utilizza il comando export
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
34
Parametri
• E possibile passare dei parametri ad uno script
• Vengono memorizzati nelle variabili speciali $n
(con n intero positivo)
– $0 contiene il nome dello script
– $1 contiene il primo parametro
• Se uno script ha più di 9 parametri si usa il
comando shift per fare lo shift a sinistra dei
parametri ed accedere ai successivi
• Ad esempio, con la riga di comando
pippo par1 par2,
i parametri assumeranno i seguenti valori:
$0=pippo, $1=par1, $2=par2,
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
35
Variabili di stato automatiche
$#
Numero di parametri forniti allo script sulla
riga di comando
$*
Lista di tutti i parametri passati allo script
$?
exit status dell’ultimo comando eseguito
dalla shell
$$
PID della shell corrente (/tmp/tmp$$)
$!
PID dell’ultimo comando eseguito in
background
$-
Opzioni della shell corrente
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
36
Quoting
• Per visualizzare una stringa si possono usare
indistintamente due comandi:
– echo "frase”
– echo ‘frase’
si usano le virgolette se la frase contiene
apostrofi; si usa l’apostrofo se la frase contiene
virgolette
• Tutto ciò che è racchiuso da una coppia di accenti
gravi (`) viene interpretato come un comando;
in questo modo è possibile assegnare ad una
variabile il risultato di un comando
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
37
Strutture condizionali
•
•
•
•
if comando_test
then
comandi_vero
else
comandi_falso
fi
Esegue il comando_test
Se il suo exit status è 0, esegue il blocco
comandi_vero
Altrimenti, esegue il blocco comandi_falso
break per uscire direttamente dal costrutto
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
38
Comando test
• Se la condizione che si vuole specificare non è
esprimibile con exit status, si può utilizzare il
comando
test espressione
che restituisce un exit status pari a 0 se
espressione è vera (1 altrimenti)
• Espressioni di controllo su file:
-e
-f
-d
-r
-w
-x
f restituisce vero se f esiste
f restituisce vero se f è un file ordinario
f restituisce vero se f è una directory
f restituisce vero se f è leggibile dall’utente
f restituisce vere se f è modificabile dall’utente
f restituisce vero se f è eseguibile dall’utente
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
39
Comando test
• Espressioni su stringhe:
-z s → s ha lunghezza nulla
-n s → s ha lunghezza non nulla
s1=s2 → s1 è uguale a s2
s1!=s2 → s1 è diversa da s2
• Espressioni su valori numerici:
n1 -eq n2 → n1 è uguale a n2
n1 -ne n2 → n1 è diverso da n2
n1 -lt n2 → n1 è minore di n2
n1 -gt n2 → n1 è maggiore di n2
n1 -le n2 → n1 è minore o uguale a n2
n1 -ge n2 → n1 è maggiore o uguale a n2
• Operatori su espressioni:
e1 -a e2 → sono vere sia e1 che e2
e1 -o e2 → è vera e1 o e2
!e → non è vera e Corso di Sistemi Operativi - Esercitazioni (Lez.1)
40
Strutture cicliche
• Per realizzare dei cicli all’interno di shell script si
utilizza principalmente il costrutto
for var in lista do … done
• Un altro costrutto per realizzare i cicli è
while c_t do … done
in questo caso l’argomento di while è un "test"
analogo a quello del costrutto if
• Un costrutto analogo, ma con il test invertito è
until c_t do … done
in entrambi i casi il test è sempre all’inizio del ciclo
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
41
Esempio
• Progettare uno script che prende due
parametri, una directory d ed un intero n.
• Lo script deve fornire il nome di tutti i file
regolari contenuti in d ai quali avete
accesso, aventi dimensione (in byte)
maggiore o uguale ad n.
• Si controlli inoltre che i parametri passati
sulla linea di comando siano due e che il
primo sia una directory.
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
42
Esercizio: saferm
• Scrivere uno script per l’eliminazione file che,
invece di cancellare definitivamente i file, li sposti
in una directory nascosta (.trash) nella home
• Opzioni disponibili (e relativi parametri da
indicare):
–
–
–
–
saferm
saferm
saferm
saferm
-L
-P
-R files
files
mostra il contenuto del cestino
svuota il cestino
ripristina i file indicati
cestina i files indicati
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
43
Esercizio: saferm
• Le varie opzioni sono esclusive. Nel caso di due o
più opzioni selezionate si generi un messaggio di
errore con l’usage dello script
• Se un nome di file da inserire nel cestino esiste
già, rinominate il file esistente concatenandovi la
sua data
• Per i più bravi: scrivere su un file la dimensione
massima del cestino. Superata tale dimensione il
sistema deve:
– dare una notifica all’utente
– eliminare i file più vecchi (più grandi) fino a raggiungere la
dimensione desirerata
Corso di Sistemi Operativi - Esercitazioni (Lez.1)
44