Sei sulla pagina 1di 11

SISTEMI OPERATIVI

Martino Trevisan

1 - READERS & WRITERS


Con precedenza ai readers mediante regioni critiche condizionali:
Class RW_precedenza_ai_Readers { private: int nr,nw; char busy; public: void start_read(void){ nr++; await(nw==0); } void start_write(void){ await(!busy&&nr==0); nw++; busy=TRUE; } void end_read(void){ nr--; } void end_write(void){ busy=FALSE; nw--; } void init(void){ busy=FALSE; nr=nw=0; } }

Mediante semafori con precedenza ai Readers:


Reader: wait(me1) nr++ if(nr==1)wait(w) signal(me1) LETTURA wait(me1) nr--; if(nr==0)signal(w) signal(me1) Writer: wait(me2) wait(w) SCRITTURA signal(w) wait(me2)

Mediante semafori con precedenza ai Writers:


Reader: wait(me3) wait(r) wait(me1) nr++ if(nr==1)wait(w) signal(me1) signal(r) signal(me3) LETTURA wait(me1) nr-if(nr==0)signal(w) signal(me1) Writer: wait(me2) nw++ if(nw==1)wait(r) signal(me2) wait(w) SCRITTURA signal(w) wait(me2) nw-if(nw==0)signal(me2) signal(r)

Mediante semafori con comportamento FIFO:


Reader: wait(me1) nr++ if(nr==1)wait(w) signal(me1) LETTURA wait(me1) nr--; if(nr==0)signal(w) signal(me1) Writer: wait(w) SCRITTURA signal(w)

3 - PRODUTTORE & CONSUMATORE


Con i semafori:
I(empty)=MAX I(full)=0 I(me1)=I(me2)=1 buffer[MAX] c=p=0 Produttore:

wait(empty) wait(me1) buffer[p]=message p=(p+1)%MAX signal(me1) signal(full) Consumatore:

wait(full) wait(me2) message=buffer[c] c=(c+1)%MAX signal(me2) signal(empty)

Con le regioni critiche condizionali:


buffer[MAX] count=0 p=c=0 Produttore:

region p when count<MAX do buffer[p]=message p=(p+1)%MAX count++ end Consumatore:

region p when count>0 do message=buffer[c] c=(c+1)%MAX count-end

2 - LA SHELL
SINTASSI:
Variabili: a=valore; a=valore; a=valore In a ci sar la stringa valore. Luso della virgoletta singola impedisce la sostituzione di variabili dentro la stringa echo $a Produce in output il valore di a Vettori: vet[1]=23 vet[2]=valore Sono operazioni valide vet[chiave]=valore I vettori possono essere indicizzati anche con stringhe echo ${vet[2]} Stampa il secondo elemento di vet for i in vet Ciclo su tutti gli elementi in vet Strutture logiche: Struttura if: Bisogna usare i comandi -eq -lt -gt -ge -le -ne al posto degli operatori. Opzioni su le: -s le esistente e non vuoto; -f le esistente e non una directory; -d una directory; -x le eseguibile; -w le scrivibile; -r le leggibile; if [ $a -e 5 ] then [..] else [..] fi Tuttavia si pu scrivere: if [ $var1 == $var2 ] Operatori logici: if [ cond1 ] || [ cond2 ] if [ cond1 ] && [ cond2 ] Costrutto if e grep: if grep pattern file.txt then..fi Ciclo for : Per tutti gli elementi di un vettore:

for i in vet do [..] done Ciclo numerico: for i in {1..3} Ciclo tradizionale: for((i=0;i<n;i++))do..done Ciclo for nei le forniti da una find: for f in $(find folder -name pattern)do..done Ciclo for sugli argomenti dello script: for arg in $* do..done Ciclo for saltando i primi n argomenti: c=1 for arg in $* do if [ $c -gt $n ] then echo $arg fi c=$((c+1)) done

CHMOD:
Modica dei permessi di un le Sintassi: chmod [opzioni] modalit file1 [file2 ...] Opzioni: -R : ricorsione nelle sottocartelle Esempi: chmod "u=rwx","g=rx","o=x" nomeFile chmod 777 file.txt

CHOWN:
Cambia il proprietario di un le Sintassi: chown [opzioni] utente[:gruppo] file1 [file2 ...]

Opzioni: -R : ricorsione nelle sottocartelle Esempi: chown -R alice /home/roberto/file chown carlo:vendite /home/roberto/file

CHGRP:
Cambia il gruppo di un le Sintassi: chgrp [opzioni] gruppo file1 [file2 ...] Opzioni: -R : ricorsione nelle sottocartelle Esempi: chgrp vendite /home/roberto/file

UMASK:
Imposta i permessi che vengono negati di default a nuovi le. Sintassi: umask maschera Esempio: umask 777

LS:
Lista dei le in una o pi directory. Sintassi: find [opzioni] [directory] Stampa su stdout. Se non specico directory usa la directory corrente. Opzioni: -l : elenco esteso -R : ricorsione nelle sottocartelle -r : ordinamento inverso -t : ordine temporale, non alfabetico

FIND:
Ricerca nel le system.

Sintassi: find [opzioni] dir1 [dir2 ...] [direttiva1] Direttive: -name modello: supera il test se il nome delloggetto soddisfa il modello; si usano * e ? -type tipo: supera il test se loggetto del tipo corrispondente: d: directory l: collegamento simbolico p: named pipe f: le regolare -user utente: supera il test se loggetto dellutente specicato -group gruppo: supera il test se loggetto del gruppo specicato -nouser , -nogroup: supera il test se loggetto non dellutente/gruppo specicato -atime giorni: supera il test se loggetto ha data di ultimo accesso corrispondente [in giorni]. +10 signica: maggiore di 10 giorni, -10 signica minore. -mtime giorni: supera il test se loggetto ha data di ultima modica corrispondente [in giorni]. +10 signica: maggiore di 10 giorni, -10 signica minore. -ctime giorni: supera il test se loggetto ha data di creazione corrispondente [in giorni]. +10 signica: maggiore di 10 giorni, -10 signica minore. -print: stampa il nome del le sullo STDOUT -exec comando arg {} arg \; : esegue il comando sostituendo {} coi le trovati. -maxdepth, -mindepth : specica massima e minima profondit nellalbero delle sotto-directory -size num: specica la dimensione. Uso + e - per specicare dimensione minore o maggiore del valore specicato Esempi: find . -type f -print Cerca e stampa tutti i le nella directory corrente. find /var/tmp -mtime -10 -exec rm -f {} \; Cerca e rimuove i le nella cartella tmp la cui ultima modica anteriore a 10 giorni fa.

GREP:
Ricerca e visualizzazione allinterno di un le. Sintassi: grep [opzioni] pattern [file] se non specico il le usa lo stdin Formato: ^ : inizio riga $ : ne riga . : carattere qualsiasi * : indica che il carattere precedene pu essere preso in numero arbitrario \. : sequenza per il caratterere ASCII . Opzioni: -H : indica il nome del le nella stampa -n : indica il numero della riga -i : non fa distinzione maiuscole minuscole -c : stampa solo il numero di righe trovate per ogni le

Esempi: grep testo file.txt Cerca la stringa testo dentro le.txt grep -n fine$ miofile Cerca (e stampa) tutte le righe che terminano con ne, stampa anche il numero della riga.

SORT
sort [opzioni] [file1 [file2 ...] ] Ordina linput per righe secondo il formato specicato. Se viene specicato uno o pi le, essi vengono usati come sorgente dei dati, altrimenti viene usato lo stdin. Il risultato ordinato viene reso tramite lo stdout. Opzioni: -o file : scrive su le e non su stdout -u : elimina duplicati -f : nessuna distinzione tra maiuscole e minuscole -r : ordinamento inverso -n : ordinamento numerico anzich alfabetico -k numero : seleziona il campo della linea da usare nellorinamento Esempi: sort -k 2 -n esempio.txt ordina un le usando il secondo campo della riga (ad esempio un le con righe del tipo Mario 15 e Anna 10). ls -l | sort -n -r -k 5 Ordina i dati provenienti dal comando ls tramite lo stdin. I dati sono ordinati secondo un ordinamento numerico inverso del quinto campo (la dimensione in questo caso).

SED:
sed [opzioni] formato [file] Manipolazione di usso, che sia stdin o le. Esegue operazioni su righe che corrispondono a un certo formato. Operazioni: indirizzo/d : elimina la riga indirizzo/p : stampa sulloutput la riga s/nome1/nome2 : sostituisce per ogni riga la prima occorrenza di nome1 con nome2 indirizzo/s/nome1/nome2 : sostituisce in tutte le righe specicate da indirizzo, nome1 con nome2 s/nome1/nome2/g : sostituisce tutte le occorrenze di nome1 con nome2 sed -n 3p : stampa solo la riga 3 Posso usare altri caratteri al posto di / per separare le direttive. Ad esempio sed s?.*/??g Uso ? al posto del / e elimino tutto ci che si trova prima di uno slash. Utile per risalire al nome di un le, scartando la directory di appartenenza.

Formato degli indirizzi: ^ : inizio riga $ : ne riga . : carattere qualsiasi * : indica che il carattere precedene pu essere preso in numero arbitrario \. : sequenza per il caratterere ASCII . \ : continua listruzione sulla riga sequente, cos posso usare la-capo (ad esemio in sostituzione) Esempi di formato: 8d : elimina lottava riga /^$/d : cancella tutte le righe vuote 1,/^$/d : cancella tutto no alla prima riga vuota s/00*/0/g : riduce ogni sequenza di zeri a un singolo zero s/ *$// : elimina tutti gli spazi alla ne di una riga s/GUI//g : elimina tutte le occorrenze di GUI

AWK
awk awk awk awk script [file] -f scriptfile [...] -v nomevar=val [...] param1 param2 ...

Elaborazione di usso basata sui campi e sulle righe I campi (separati da spazi) si indenticano con $1, $2 ecc... $0 identica lintera riga. Posso indicizzarli: se ho una variabile intera i posso scrivere $i FILENAME restituisce il nome del le corrente. NR restituisce il numero della riga corrente. Se usato nella sezione END, resituisce il numero delle righe NF resituisce il numero dei campi della riga corrente FS il delimitatore di campo, che posso modicare nella sezione BEGIN ARGC e ARGV funzionano in maniera uguale al C nel caso di passaggio di parametri anonimi. Se specico il nome delle variabili individualmente esso non interviene. Struttura: BEGIN{operazioni preliminari, inizializzazione variabili...} [formato] {corpo dello script, eseguito per ogni riga, se specifico un formato, allora lesecuzione sar vincolata al rispetto del formato} (condizione) {istruzioni eseguite se la condizione vera} END{operazioni finale, stampa dei risultati...} Sintassi: La sintassi simile a quella del C: if ( $1 == VAR ) {statement} di immediata comprensione {print primo campo: ,$1 > file.txt} ridirigo louput su le.txt anzich sullo stdout

Funzioni utili: length(s) : fornisce la lunghezza della stringa s. Se non passiamo nessun argomento resituisce la lunghezza di $0 sprintf(frm, param) : stampa il formato e restituisce la stringa (uguale al C) getline : setta $0, NF, NR sulla successiva riga del le getline var : seta var, NR sulla riga successiva match(s,r) : cerca la regular expression s dentro r e ne restituisce la posizione (oppure 0 se non la trova) tolower(str) , toupper(str) : signicato immediato Esempi: awk {print $3} file.txt stampa il terzo campo di ogni riga di le.txt awk {totale += $1} END{print totale} stampa la somma di tutti i terzi campi dello stdin BEGIN { cont=0 } /pippo/ {cont++} END { print "La parola pippo ricorre",cont, "volte" } Stampa il numero di volte che occorre la parola pippo awk /main()/{print FILENAME} *.c prende tutti i le *.c della cartella corrente e se una riga contiene /main() stampa il nome del le awk (NR % 2) {print} Stampa le righe dispari. Si potrebbe anche formulare con ((NR % 2) == 1) awk {if ($1>max){max = $1}} END {print max} Stampa il valore massimo del primo campo

Comandi utili:
wc -c [file] conta i bit provenienti da stdin o da le wc -l [file] conta il numero di righe provenienti da stdin o da le cut -f num -d delim [file] stampa solo il campo specicato in num usando il delimitatore delim. Per num posso usare anche espressioni come 1,3 o 2-5 o 1,2-7 head -n num [file [files..]] stampa le prime num righe tail -n num [file [files..]] stampa le ultime num righe tail -c +num [file [files..]] stampa tutti i byte oltre i primi num comando > /dev/null inibisce loutput del comando rev inverte la stringa che arriva dallo stdin basename stringa ritorna la posizione del le in stringa dirname stringa ritorna il nome del le in stringa togliendo il percorso $? il valore di ritorno dellultimo comando eseguito grep ^pattern$ file if [ $? -e 0] then .. fi

Potrebbero piacerti anche