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