Sunteți pe pagina 1din 50

Sistemul de Operare UNIX.

Probleme Generale
Generalităţi
Principalele comenzi UNIX
Elemente ale limbajului de comandă UNIX
(Shell)
Proceduri Shell
Vedere generală asupra sistemului UNIX

Sisteme de Operare. Teorie şi Aplicaţii 109.1 Robert.Gyorodi@ul.ie


Istoric
Dezvoltat prima dată în 1969 de către Ken Thompson şi Dennis
Ritchie de la Bell Laboratories; a incorporat caracteristici ale altor
sisteme de operare, în special MULTICS.
A treia versiune a fost scrisă în C, care a fost dezvoltat la Bell
Labs în special pentru suportul UNIX.
Cel mai influent grup de dezvoltare în afara Bell Labs şi AT&T
UNIX — University of California at Berkeley (Berkeley Software
Distributions).
4BSD UNIX a rezultat din fonduri DARPA pentru a dezvolta un
sistem UNIX standard pentru folosinţă guvernamentală.
Dezvoltat pentru VAX, 4.3BSD este una dintre versiunile cele mai
influente şi a fost portat pe multe alte platforme.
Mai multe proiecte de standardizare încearcă să consolideze
diferitele variante de UNIX pentru a conduce la o singură
interfaţă de programare UNIX.

Sisteme de Operare. Teorie şi Aplicaţii 109.2 Robert.Gyorodi@ul.ie


Istoric

Sisteme de Operare. Teorie şi Aplicaţii 109.3 Robert.Gyorodi@ul.ie


Cauzele răspândirii S.O. UNIX
Agreat de utilizatori
O gamă bogată de instrumente software ce se pot utiliza cu uşurinţă,
putându-se combina pentru a se obţine noi posibilităţi
Acoperă o gamă largă de aplicaţii:
baze de date
reţele
grafică
inteligenţă artificială
simulare
probleme de gestiune
statistică
instruire asistată de calculator
Conceput ca sistem multiuser şi multitasking
Portabil, fiind scris în limbajul C, sistemul funcţionând aproape
identic pe mainframe-uri, mini sau microcalculatoare
Foarte mult folosit în universităţi

Sisteme de Operare. Teorie şi Aplicaţii 109.4 Robert.Gyorodi@ul.ie


Considerente de realizare a S.O. UNIX
Necesitatea standardizării şi unificării mediilor de
operare şi în general a interfeţei cu utilizatorul
Transportabilitatea fişierelor între diverse sisteme de
calcul, menţinând identică structura volumelor şi
fişierelor
Asigurarea unor niveluri superioare de portabilitate a
produselor program
Folosirea unei game largi de arhitecturi de calcul, prin
interconectarea calculatoarelor de tipuri şi puteri
diferite, funcţionând sub acelaşi sistem de operare
Transparenţa produselor software faţă de evoluţia
hardware-ului

Sisteme de Operare. Teorie şi Aplicaţii 109.5 Robert.Gyorodi@ul.ie


Caracteristici generale ale S.O. UNIX
Sistem de operare de tip time-sharing, multitasking şi multiutilizator
Asigură protecţia fişierelor şi a modului de execuţie prin parole şi
drepturi de acces
Promovează modularitatea
Operaţiile de I / E sunt integrate în sistemul de fişiere, realizându-se
aşa numitele intrări / ieşiri generalizate
Sistem de gestiune a proceselor reentrante şi asincrone multiple, care
se pot sincroniza prin intermediul unui sistem de întreruperi logice
Gestiunea memoriei se face printr-un mecanism ce permite schimbul de
pagini între memoria RAM şi cea externă, gestionându-se spaţiul
afectat execuţiei proceselor şi controlându-se timpul de acces la
procesele în aşteptare
S-a realizat o interfaţă simplă prin intermediul componentei SHELL,
care nu este integrată în nucleul (KERNEL) sistemului de operare,
asigurându-se totodată o identitate a sintaxei tuturor comenzilor
Prin scrierea S.O. în limbajul C, s-a obţinut o portabilitate atât a
sistemului UNIX propriu-zis, cât şi a software-ului de aplicaţie dezvoltat
sub acest sistem, realizându-se astfel şi premisele dezideratului de
sistem deschis
Sisteme de Operare. Teorie şi Aplicaţii 109.6 Robert.Gyorodi@ul.ie
Principii de utilizare UNIX1
Lansarea sistemului UNIX are de obicei loc în patru etape:
Un program din memoria permanentă:
examinează configuraţia sistemului şi efectuează o serie de teste de bună
funcţionare
examinează perifericele în căutarea unui candidat pentru lansarea sistemului
verifică existenţa unui sistem de fişiere UNIX pe discul ales
citeşte şi încarcă în memorie nucleul S.O., aflat într-un fişier obişnuit, direct
executabil (/vmlinuz pentru S.O. Linux)
Nucleul S.O. primeşte controlul şi determină montarea sistemului de fişiere de pe discul
de pornire
Rădăcina acestui sistem de fişiere devine rădăcina întregii ierarhii de cataloage
accesibile unui utilizator
În acest moment există un singur proces, care devine procesul fictiv 0 (însărcinat
de obicei cu gestiunea memoriei virtuale).
Nucleul creează procesul init (prin încărcarea programului /etc/init), acesta este
singurul proces care nu este creat prin mecanismul uzual de duplicare (fork()).
Controlul este preluat de init, care continuă activităţile legate de lansarea
sistemului.
La sfârşitul acestei etape iniţializarea nucleului a luat sfârşit, sistemul funcţionând
normal, unicul proces utilizator prezent fiind init, care rulează cu privilegiile
superutilizatorului.

Sisteme de Operare. Teorie şi Aplicaţii 109.7 Robert.Gyorodi@ul.ie


Principii de utilizare UNIX2
init lansează un interpretor de comenzi (/bin/sh de exemplu), căruia îi
revine sarcina citirii şi executării fişierului de comenzi indirecte de
configurare /etc/rc, care conţine comenzi care asigură
verificarea (cu ajutorul comenzii fsck) a corectitudinii sistemului de
fişiere rădăcină, şi eventual corectarea automată a eventualelor erori
minore. Dacă fsck eşuează, atunci un interpretor de comenzi este lansat
cu intenţia ca operatorul să refacă manual consistenţa sistemului de
fişiere. În acest timp sistemul lucrează şi operatorul primeşte privilegiile
superutilizatorului
montarea (cu ajutorul comenzii mount) a celorlalte discuri din
configuraţie
iniţializarea altor echipamente periferice (interfeţe de reţea de exemplu)
lansarea în fundal a unui număr de procese (demoni). De exemplu,
sistemele din familia BSD lansează demonul inetd, destinat lansării
automate a proceselor înregistrate ca servicii la distanţă (ftp, rlogin etc.)
init creează (prin duplicare) câte un proces getty pentru fiecare terminal.
Fiecare getty aşteaptă introducerea unui nume de utilizator la terminalul
respectiv, afişând un prompt (de exemplu login:); această condiţie fiind
satisfăcută, getty se transformă în login, pentru a accepta utilizatorul în
sistem

Sisteme de Operare. Teorie şi Aplicaţii 109.8 Robert.Gyorodi@ul.ie


Procesul Login
Procesul login asociat terminalului în cauză, afişează un al doilea prompt (de
exemplu password:) şi aşteaptă introducerea unei parole. Parola citită este
cifrată, apoi login caută perechea (nume_utilizator, parolă_cifrată) în fişierul
/etc/passwd. Dacă este găsită perechea respectivă, atunci din acelaşi
/etc/passwd se citesc:
numărul de utilizator (uid-ul) utilizatorului şi numărul grupului (gid-ul) din care face
parte. login, care până acum rulase cu privilegiile superutilizatorului, îşi schimbă
apartenenţa, de acum înainte rulând sub uid-ul şi gid-ul utilizatorului în curs de
acceptare.
catalogul de referinţă al utilizatorului. login schimbă catalogul curent în catalogul de
referinţă al utilizatorului. Dacă schimbarea nu reuşeşte, catalogul curent este stabilit în
catalogul rădăcină.
numele interpretorului de comenzi (de exemplu /bin/sh sau /bin/bash).
login introduce în mediu o serie de valori (de exemplu HOME=catalogul de
referinţă, SHELL=numele absolut al interpretorului) şi se autoânlocuieşte (prin
exec()) cu interpretorul de comenzi al cărui nume a fost citit.
Moartea interpretorului de comenzi (datorită de ex. exit) determină:
înregistrarea într-un fişier a datelor referitoare la sesiunea proaspăt încheiată
trimiterea unui semnal de rupere a legăturii către toate procesele legate de terminalul
respectiv
lansarea (prin duplicare) a unui nou getty pentru acel terminal, astfel o nouă sesiune de
lucru poate începe.
Oprirea sistemului se face dând comanda shutdown
Sisteme de Operare. Teorie şi Aplicaţii 109.9 Robert.Gyorodi@ul.ie
Principalele comenzi UNIX1
În general există patru categorii de comenzi:
comenzi de informare
comenzi de lucru cu fişiere
comenzi de lucru cu procese
comenzi speciale

1. Listarea conţinutului unui catalog:


ls [-optiuni] [catalog sau fisier]
2. Copiere de fişiere:
cp fissrs ... fisdst
3. Afişarea conţinutului unui fişier:
cat [-optiuni] fis ...
4. Transferarea unui fişier dintr-un bloc în altul (rename din MS-DOS)
mv [-optiuni] fis1 ... dst

Sisteme de Operare. Teorie şi Aplicaţii 109.10 Robert.Gyorodi@ul.ie


Principalele comenzi UNIX2
5. Ştergerea unui fişier
rm [-optiuni] fis
6. Ştergerea cataloagelor
rmdir catalog
7. Schimbarea modului de protecţie al fişierului
chmod protectie fis
Protecţia se specifică fie ca număr fie ca un şir de caractere.
Drepturile de protecţie se referă la trei categorii de utilizatori:
proprietar
grupul proprietar
alţii
Drepturile posibile sunt (câte 3 biţi pe fiecare categorie):
citire: r
scriere: w
execuţie: x
Ex:
$ chmod 644 fis.txt
$ chmod o+r fisier
Sisteme de Operare. Teorie şi Aplicaţii 109.11 Robert.Gyorodi@ul.ie
Principalele comenzi UNIX3
8. Schimbarea proprietarului unui fişier
chown proprietar fisier
Dreptul de a executa această comandă îl are proprietarul curent al fişierului (care va
pierde astfel dreptul de proprietate) şi superutilizatorul.
9. Schimbarea catalogului curent
cd catalog
10. Aflarea catalogului curent (Print Working Directory)
pwd
11. Crearea unui nou catalog
mkdir catalog
12. Afişarea numelui utilizatorului curent
whoami
13. Listarea tuturor utilizatorilor care au momentan sesiuni deschise
who

Sisteme de Operare. Teorie şi Aplicaţii 109.12 Robert.Gyorodi@ul.ie


Principalele comenzi UNIX4
14. Obţinerea datei şi orei curente
date
15. Afişarea spaţiului liber pe fiecare dintre discurile montate sau
specificate
df [fisier_special]
Ex: $ df /dev/fd0 - obţinem spaţiul liber pe discheta din prima unitate
16. Montarea sistemului de fişiere
mount [fisier_special catalog]
Ex:
$ mount /dev/hda1 / - de obicei această comandă o face implicit sistemul
$ mount /dev/hda3 /mnt - discul /dev/hda3 va fi accesibil pe catalogul /mnt
17. Demontarea sistemului de fişiere
umount nume

Sisteme de Operare. Teorie şi Aplicaţii 109.13 Robert.Gyorodi@ul.ie


Principalele comenzi UNIX5
18. Afişarea mărită a unui text pe ecran
banner text
19. Afişarea calendarului
cal [an] [luna]
20. Manualul de utilizare on line
man comanda
Ex: $ man df
21. Afişarea pagină cu pagină a unui text
more
22. Un alt paginator mai puternic
less Ex:
$ mail xxxx
23. Poşta electronică Subject : Hello
mail nume Textul mesajului
.
Obs.:
Mesajul se termină cu caracterul '.' singur pe o linie,
la începutul liniei.
Sisteme de Operare. Teorie şi Aplicaţii 109.14 Robert.Gyorodi@ul.ie
Principalele comenzi UNIX6
24. Intrarea în sesiune
login nume
25. Ieşirea din sesiune
logout
26. Schimbarea parolei unui utilizator
passwd [utilizator]

Sisteme de Operare. Teorie şi Aplicaţii 109.15 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)1
O comandă din linia de comandă, este preluată de un program numit
shell, care examinează linia şi decide care program trebuie rulat pentru
a executa comanda şi ce argumente îi vor fi transmise
Procesoare de comenzi:
sh (Bourne Shell) - standard
csh (C Shell)
ksh (Khorn Shell)
bash (Bourne Again Shell)
Există o serie de caractere care au o semnificaţie specială pentru shell,
ele numindu-se metacaractere şi în principiu ar fi următoarele : < > | ^
&;?*[]()$`"'\
Dacă dorim ca vreunul din aceste caractere să fie interpretat ca şi un
caracter obişnuit într-un anumit context, el va trebui precedat de caracterul \
Ex:
$ echo ? - vor fi listate numele fişierelor care au numele format dintr-un
singur caracter.
$ echo \? - va fi afişat ?
Acesta este mecanismul de quoting (citare)

Sisteme de Operare. Teorie şi Aplicaţii 109.16 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)2
Tipare:
Caracterele "*", "?" şi "[...]" sunt caractere care se folosesc pentru
construcţia unor tipare
Când unul din aceste caractere este întâlnit în linia de comandă,
este înlocuit cu o listă de nume de fişiere care se potrivesc cu tiparul
din care face parte, urmând următoarele reguli:
* este înlocuit de zero sau mai multe caractere
? este înlocuit cu un singur caracter
[sir] se potriveşte cu orice caracter care este prezent în sir.
– Se permit şi specificarea unor intervale: [a-z]

Excepţie de la aceste reguli sunt caracterele "/" şi ".", care nu pot fi


substituite prin aceste caractere

Sisteme de Operare. Teorie şi Aplicaţii 109.17 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)3
Redirectarea dispozitivelor (intrare / ieşire / eroare) standard:
Pentru redirectare se folosesc caracterele "<" şi ">".
Ex:
$ ls -l >listing - provoacă crearea unui fişier având ca şi conţinut
ieşirea produsă de comanda ls -l
$ cat <myfile - determină comanda cat să citească din fişierul
myfile şi să afişeze liniile citite
Alte tipuri de redirectare:
>> fisier - adaugă ieşirea standard la sfârşitul fişierului
specificat (dacă fişierul nu există acesta va creat)
<<terminator - foloseşte următoarele linii ca şi intrare standard,
până când se întâlneşte linia care se potriveşte cu terminator-ul dat
Aceasta este folosită în fişiere de comenzi (shell scripts)
2>fisier - redirectează ieşirea de eroare standard în fişierul
specificat
Aceasta este defapt un caz special al cazului general de redirectare a
unui identificator de fişier (stderr == 2)

Sisteme de Operare. Teorie şi Aplicaţii 109.18 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)4
Canalele - altă formă de redirectare (pipelines)
Într-un canal două sau mai multe programe sunt executate împreună, ieşirea
unuia fiind intrarea următorului
În multe implementări ale UNIX-ului, programele dintr-un canal sunt
executate concurent
Ex:
$ ls -l > fistemp1
$ grep *.c < fistemp1 > fistemp2
$ wc -l < fistemp2
Secvenţa de mai sus ar putea fi rescrisă folosind facilitatea de canal astfel:
$ ls -l | grep *.c | wc -l
Rezultatul ambelor grupuri de comenzi ar fi un număr precizând câte fişiere
având extensia .c există în catalogul curent

Sisteme de Operare. Teorie şi Aplicaţii 109.19 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)5
Un utilizator poate rula explicit mai multe comenzi independente în
acelaşi timp
Aceasta este posibil datorită rulării comenzilor în fundal (background)
Pentru a specifica execuţia în fundal a unei comenzi, aceasta va fi
urmată de caracterul "&“
Dacă execuţia este în fundal, tastatura este imediat disponibilă pentru
introducerea unei noi comenzi
Ex:
$ ls -l /usr/bin &
[524]
$
Numărul [nr] este identificatorul de proces al comenzii date
Acest identificator poate fi folosit pentru manipularea acestor procese, de exemplu
pentru terminarea forţată a proceselor
Ex:
$ kill -9 524

Sisteme de Operare. Teorie şi Aplicaţii 109.20 Robert.Gyorodi@ul.ie


Elemente ale limbajului de comandă UNIX
(Shell)6
Pentru comenzile care se execută în fundal, trebuie procedat în aşa
fel încât ieşirea, respectiv intrarea lor să nu fie ecranul respectiv
tastatura, pentru aceasta se pot folosi redirectările
Ex:
$ ls -l /usr/bin > lista &
[524]
$
Pentru manipularea proceselor există câteva utilitare:
bg – permite trimiterea unui proces în background
fg – permite aducerea lor în foreground
ps – pentru a vedea situaţia proceselor (Process Status)
Pentru a putea specifica mai mult de o comandă pe o singură linie
acestea se pot despărţi prin caracterul ";" Doar ultima (grep) este
$ ls -l > lista ; grep *.c < lista & executată în fundal !!!

Pentru a grupa mai multe comenzi se pot folosi parantezele "(" şi ")".
$ (ls -l > lista ; grep *.c < lista)&
Tot grupul este executat în
fundal !!!

Sisteme de Operare. Teorie şi Aplicaţii 109.21 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)1
Crearea şi Executarea unui Fişier de Comenzi
Un script este creat prin crearea unui fişier text conţinând secvenţa
dorită de comenzi
Poate fi executat în două moduri:
Specificându-l explicit ca şi fişier de intrare pentru shell:
$ sh myscript sau
$ sh < myscript
Dând numele scriptului în linia de comandă a shell-ului
$ myscript
Pentru ca cea de a doua metodă să funcţioneze trebuie ca
utilizatorul să aibă dreptul de execuţie asupra respectivului fişier
$ chmod u+x myscript
– Când shell-ul încearcă să execute o comandă el verifică dacă
utilizatorul are dreptul de a executa acea comandă, dacă da atunci
verifică dacă comanda este un program executabil sau un script
» folosind primii doi octeţi din fişier
» aceşti doi octeţi constituie numărul magic – magic number

Sisteme de Operare. Teorie şi Aplicaţii 109.22 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)2
Variabile şi Parametri care pot fi Prevăzuţi în Pseudo-Programe
Shell
O variabilă poate fi creată simplu atribuindu-i o valoare
Dacă se foloseşte o variabilă înainte de a i se atribui o valoare,
atunci va avea ca şi valoare şirul vid
$ NAME=cristi
$ BIRTHDAY='1 Decembrie'
Pentru a folosi valoarea unei variabile într-o linie de comandă,
numele variabilei va fi precedată de caracterul "$"
$ echo $NAME s-a nascut pe $BIRTHDAY
cristi s-a nascut pe 1 Decembrie
Echivalent cu:
$ echo cristi s-a nascut pe 1 Decembrie
cristi s-a nascut pe 1 Decembrie

Sisteme de Operare. Teorie şi Aplicaţii 109.23 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)3
Shell-ul are mai multe variabile speciale, care sunt setate automat şi au
un rol special:
HOME - indică calea către directorul utilizatorului. Acesta este directorul care
devine directorul curent când se dă comanda cd fără parametri
PATH - conţine o serie de directoare separate prin caracterul ":", acestea
sunt locurile unde shell-ul va căuta după fişierele pentru comenzile care se
doresc a fi executate
PS1 - conţine promptul shell-ului, de obicei setat iniţial la "$ "
PS2 - este promptul de continuare, dacă comanda se extinde pe mai mult de
o singură linie, iniţial "> "
$ - este identificatorul de proces al shell-ului curent (nu se poate schimba !)
! - este identificatorul de proces al comenzii lansate cel mai recent în
background
? - este starea de ieşire a comenzii precedente
1-9 - sunt argumentele cu care a fost apelat script-ul
0 - este numele prin care a fost apelat script-ul
* - este înlocuit printr-o listă a tuturor argumentelor scriptului
# - reprezintă numărul de argumente din linia de comandă

Sisteme de Operare. Teorie şi Aplicaţii 109.24 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)4
Exemple simple:
$ myscript cristi cadre '1 Decembrie'
Valorile variabilelor speciale pentru exemplul de mai sus:
"$1" ar fi înlocuit prin "cristi"
"$2" ar fi înlocuit prin "cadre"
"$3" ar fi înlocuit prin "1 Decembrie"
"$0" ar fi înlocuit prin "myscript"
"$*" ar fi înlocuit prin "cristi cadre 1 Decembrie"
"$#" ar fi înlocuit prin "3“
Comanda shell read citeşte o linie de la intrarea standard şi o
asignează unei variabile
echo "Ce program doriti sa compilati ?"
read NAME
cc $NAME

Sisteme de Operare. Teorie şi Aplicaţii 109.25 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)5
Intrarea şi Ieşirea Standard
Moştenite de la shell-ul care a lansat scriptul
Şi pentru scripturi funcţionează aceleaşi redirectări ca şi la comenzile obişnuite
În scripturi se pot face redirectări ale comenzilor din script
Structuri de Control în Proceduri Shell
Construcţiile condiţionale
if
– foloseşte starea de ieşire (exit state) a unei comenzi
– o valoare de ieşire de 0 corespunde unei terminări normale (TRUE), pe când o
valoare diferită de 0 corespunde unei terminări anormale (FALSE)
if comanda
then
secventa de comenzi
elif comanda
then
secventa de comenzi
...
else
secventa de comenzi
fi

Sisteme de Operare. Teorie şi Aplicaţii 109.26 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)6
case
– corespunde unei instrucţiuni de selecţie multiplă
case word in
pattern11 | pattern12 | ... )
secventa de comenzi1
;;
pattern21 | pattern22 | ... )
secventa de comenzi2
...
esac
– valoarea specificată prin word este testată pe rând cu fiecare tipar şi
la prima potrivire se va executa secvenţa de comenzi
corespunzătoare

Sisteme de Operare. Teorie şi Aplicaţii 109.27 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)7
Cicluri
while şi until
– execută repetat o comandă
– testează starea de ieşire a acesteia şi dacă este 0 (diferit de 0 pentru
until) execută o secvenţă de comenzi corespunzătoare
– când starea de ieşire devine diferită de 0 (0 pentru until) shell-ul trece
la instrucţiunea de după ciclu
while comanda
do
secventa de comenzi
done

until comanda
do
secventa de comenzi
done

Sisteme de Operare. Teorie şi Aplicaţii 109.28 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)8
for
for nume_de_variabila in lista_de_cuvinte
do
secventa de comenzi
done
– secvenţa de comenzi este executată odată pentru fiecare cuvânt din
lista_de_cuvinte
– variabila va lua valori succesive din lista de cuvinte
– lista de cuvinte poate fi generată folosind tipare ca şi acelea folosite
pentru nume de fişiere
– lista de variabile poate lipsi, caz în care ca şi listă de variabile va fi
considerată lista de argumente cu care a fost lansat shell-ul (adică
$*)

Sisteme de Operare. Teorie şi Aplicaţii 109.29 Robert.Gyorodi@ul.ie


Exemple1
Următorul script va verifica apariţia valorii din variabila NAME într-un fişier numit namelist şi va afişa mesaje diferite depinzând de faptul dacă
s-a găsit sau nu acea valoare.

if grep -s $NAME namelist


then
echo $NAME corespunde
else
echo Nu am auzit niciodata de $NAME
fi

Următorul script exemplifică folosirea programului test, care poate fi folosit pentru a testa existenţa unui fişier, dacă acesta poate fi citit sau scris,
pentru verificarea egalităţii a două şiruri sau dacă un număr este mai mare, egal sau mai mic decât un alt număr ş.a.m.d. Pentru opţiunile
permise de programul test se poate consulta manualul online. Acest script va adăuga conţinutul fişierului messagefile la sfârşitul fişierului
summaryfile şi goleşte fişierul messagefile.

if test -r messagefile
then
if test -w summaryfile -a -w messagefile
then
cat messagefile >> summaryfile
cp /dev/null messagefile
else
echo Nu se poate scrie in fisierul summary sau message
fi
else
echo Fisierul messagefile nu poate fi citit
fi

Sisteme de Operare. Teorie şi Aplicaţii 109.30 Robert.Gyorodi@ul.ie


Exemple2
Următorul exemplu demonstrează folosirea tiparului '*' ca şi tipar implicit dacă nici un alt tipar nu se potriveşte, precum şi două moduri diferite
pentru a alege o opţiune indiferent de litere mari sau mici.

case $OPTION in
-p|-P)
print $FILE
;;
-[nN])
nroff $FILE
;;
*)
echo Optiune necunoscuta $OPTION
;;
esac

Exemplu pentru ciclul while

REPLY=da
while test $REPLY = da
do
echo "Suntem in ciclu !"
echo "Mai doresti sa ne mai invartim in ciclu ?"
read REPLY
done

Sisteme de Operare. Teorie şi Aplicaţii 109.31 Robert.Gyorodi@ul.ie


Exemple3
Exemple pentru ciclul for

for file in *
do
echo $file
mv $file $file.old
done

for argument
do
cat $argument
done

Sisteme de Operare. Teorie şi Aplicaţii 109.32 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)9
Comentarii
În script-uri se pot include şi comentarii, prin folosirea comenzii ":", aceasta este o
comandă care nu face nimic, astfel încât argumentele sale pot fi folosite ca şi comentarii
Argumentele acestei comenzi sunt prelucrate la fel ca şi argumentele altor comenzi
În unele shelluri se poate folosi ca si comentariu şi caracterul “#“ tot ce este după acest
caracter până la sfârşitul liniei este ignorat

Următorul exemplu pe lângă exemplificarea comentariilor, introduce şi o nouă comandă exit care determină terminarea execuţiei scriptului.

: 'exista cumva prea putine argumente ?'


if test $# -lt 3
then
echo Numar de argumente insuficiente
exit 1

: '... sau prea multe ?'


elif test $# -gt 5
then
echo Prea multe argumente
exit 2
fi

Sisteme de Operare. Teorie şi Aplicaţii 109.33 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)10
Substituţia Comenzilor
Este posibilă construcţia unei părţi a unei comenzi prin executarea unei alte
comenzi
Dacă o comandă care este încadrată între caractere '`' (accente grave), este
incorporată într-o linie de comandă, atunci ieşirea sa standard, cu trecerile la
linie nouă înlocuite prin spaţii, va fi introdusă în locul acesteia în linia de
comandă
Comanda din interiorul accentelor grave poate fi orice comandă validă, chiar
şi un canal (pipeline)

Următoarea comandă va afişa o listă de fişiere din directorul curent în ordine inversă.

$ echo `ls | sort -r`

Sisteme de Operare. Teorie şi Aplicaţii 109.34 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)11
Ordinea Evenimentelor
1. Se fac substituţiile de parametri şi variabile; toate apariţiile lui "$" urmat de
un nume, cifră sau una dintre numele de variabile speciale ca şi "*" sunt
substituite, în afara situaţiei în care caracterul "$" se găseşte înconjurat de
apostroafe sau este precedat de "\"
2. Se fac substituţiile comenzilor, în afara faptului când accentul grav apare
înconjurat de apostroafe sau precedat de "\“
Deci ambele substituţii menţionate până acum au loc şi în interiorul
unor şiruri înconjurate cu ghilimele
Acestea sunt diferenţele dintre şiruri înconjurate de apostroafe (single
quotation) şi şiruri înconjurate de ghilimele (double quotation)
3. Se fac substituţiile numelor de fişiere ("*", "?" şi "[...]"), în afara cazului când
aceste caractere speciale sunt înconjurate cu apostroafe sau ghilimele sau
precedate de "\“
Opţiunile shell-ului (cele mai folositoare)
-e Determină terminarea execuţiei imediat ce o comandă din script dă greş
-v Determină tipărirea fiecărei linii pe măsură ce este citită
-x Tipăreşte comenzile pe măsură ce ele sunt executate
Opţiunile pot fi setate şi din interiorul unui script folosind comanda set
set -vx
Sisteme de Operare. Teorie şi Aplicaţii 109.35 Robert.Gyorodi@ul.ie
Proceduri Shell (Shell Scripts)12
Redirectarea Întreruperilor
În unele script-uri poate fi utilă posibilitatea terminării "curate", în cazul în
care se întâmplă ceva neprevăzut
trap actiune lista_de_evenimente
lista_de_evenimente este o listă de întregi, corespunzătoare
semnalelor UNIX
actiune este comanda care să fie executată când apare un semnal din
lista de semnale
Dacă actiune este un şir gol atunci evenimentele corespunzătoare sunt
ignorate
Cele mai folositoare semnale sunt:
0 Ieşire din shell
2 Întrerupere de la terminal
3 Semnal de terminare de la terminal
15 S-a recepţionat semnalul Kill
Următorul exemplu demonstrează folosirea redirectării întreruperilor în cazul în care la terminarea unui script este necesară ştergerea
unui fişier temporar.

trap "echo Executie intrerupta; exit" 2 3


trap "rm -tmp-tmpfile" 0

Sisteme de Operare. Teorie şi Aplicaţii 109.36 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)13
Ambianţa sau Mediul de Lucru
În UNIX toate procesele posedă un mediu de lucru (ENVIRONEMENT), care este o
colecţie de nume care au asociate valori şir de caractere
Când shell-ul este pornit el îşi încarcă ambianţa iniţială, care constă din variabilele shell-
ului şi valorile iniţiale ale acestora
Mai departe el transmite acest mediu, această ambianţă, către toate comenzile pe care
le execută
De obicei noile variabile create într-un shell NU sunt incluse implicit în ambianţă
Dacă se doreşte includerea de noi variabile în ambianţă aceasta se face explicit
prin comanda export
$ export NAME BIRTHDAY
Comanda de mai sus adaugă variabilele NAME şi BIRTHDAY la ambianţa curentă a shell-
ului şi care va fi moştenită de orice comandă pe care acesta o va executa în continuare
Schimbarea ambianţei unui shell sau a unui program nu va avea efect asupra ambianţei
shell-ului sau programului care a lansat în execuţie acel shell sau program
Alterarea ambianţei unui shell dintr-un sub-program se poate realiza prin folosirea comenzii
eval
$ eval `name`
este echivalentă cu:
$ NAME=cristi

Sisteme de Operare. Teorie şi Aplicaţii 109.37 Robert.Gyorodi@ul.ie


Proceduri Shell (Shell Scripts)14
Lansarea shell-ului din login
Când se intră pentru prima oară în lucru în UNIX, sistemul porneşte un shell
Acest shell înainte de a citi de la terminal, va căuta în directorul de login
după un fişier numit .profile şi dacă acesta există va citi şi executa comenzile
din el
Acest lucru permite definirea unui ambient propriu
Un fişier .profile tipic va arăta astfel:
PATH=$HOME/bin:/etc:/bin:/usr/bin
USER=cristi
MAIL=/usr/spool/mail/$USER
export PATH USER MAIL

: dezactiveaza posibilitatea altor utilizatori de a scrie la terminalul curent


mesg n
: seteaza masca implicita de creere a fisierelor
umask 027

echo Utilizatorii care folosesc sistemul sunt:


who

echo "Buna cristi: ma bucur ca te vad din nou"

Sisteme de Operare. Teorie şi Aplicaţii 109.38 Robert.Gyorodi@ul.ie


Un exemplu de shell script1
Script-ul cptree face o copie al unui întreg arbore de directoare, pe multe sisteme acesta este disponibil ca şi un program
standard, cu mult mai multe opţiuni, dar acest script este destinat doar exemplificării unui script mai mare.

: Copiaza o ierarhie de directoare


: Argumentul optonal '-v' provoaca afisarea denumirii fisierelor
if test "$1" = -v
then
ECHO=echo
VERBOSE=-v
shift
: 'inlocuim $1 cu $2, $2 cu $3, etc'
else
ECHO=:
fi
if test $# -ne 2
then
echo mod de utilizare: cptree de_la la
exit 1
fi

Sisteme de Operare. Teorie şi Aplicaţii 109.39 Robert.Gyorodi@ul.ie


Un exemplu de shell script2
: daca primul argument este un director atunci copiaza
: toate fisierele in al doilea argument
if test -d $1
then
if test -f $2
then
: exista al doilea argument, dar nu este diector
echo cptree: $2 nu este director
exit 1
elif test ! -d $2
: al doilea argument nu exista – il cream
then
$ECHO mkdir $2
: Va afisa comanda, daca -v a fost setata,
: altfel va fi doar un comentariu
mkdir $2
fi
for FILE in `ls -a $1`
: Pentru a fi siguri ca avem fi fisierele care incep cu "."
do
if test $FILE = . -o $FILE = ..
then
: ignoram acest director si continuam
continue
fi
: apelam cptree in mod recursiv,
: transmitand optiunea VERBOSE.
cptree $VERBOSE $1/$FILE $2/$FILE
done
Sisteme de Operare. Teorie şi Aplicaţii 109.40 Robert.Gyorodi@ul.ie
Un exemplu de shell script3
elif test -r $1
then
: copiem un fisier
$ECHO cp $1 $2
cp $1 $2
else
echo cptree: nu poate citi din $1
exit 1
fi

Sisteme de Operare. Teorie şi Aplicaţii 109.41 Robert.Gyorodi@ul.ie


Arhitectura Sistemului UNIX
Sistemul de operare interacţionează direct cu hard-ul, oferind anumite
servicii programelor, izolându-le în acelaşi timp de partea hard
Din acest motiv programele sunt uşor portabile pe diferitele sisteme
UNIX
Structura pe nivele a sistemului 4.3BSD

Sisteme de Operare. Teorie şi Aplicaţii 109.42 Robert.Gyorodi@ul.ie


Sistemul de Fişiere
Sistemul de fişiere UNIX este
caracterizat prin:
structură ierarhică
tratarea consistentă a datelor
din fişiere
posibilitatea de creare şi
ştergere a fişierelor
posibilitatea creşterii dinamice
a dimensiunii fişierelor
protejarea datelor din fişiere
tratarea dispozitivelor
periferice ca şi fişiere

Sisteme de Operare. Teorie şi Aplicaţii 109.43 Robert.Gyorodi@ul.ie


Lucrul cu Fişiere
/* Exemplul ilustrează modalitatea de lucru cu fişiere prin copierea unui fişier sursă într-un fişier
destinaţie, folosind indicatoare logice – după cum se vede este asemănător lucrului cu fişiere din MS-DOS
*/

char buffer[4096];

main(int argc, char *argv[]) {


int fdnew, fdold;

if (argc != 3) {
printf(“Eroare !\n”);
exit(1);
}
fdold = open(argv[1], O_RDONLY);
if (fdold == -1) {
printf(“Eroare !\n”);
exit(1);
}
fdnew = creat(argv[2], 0666);
if (fdnew == -1) {
printf(“Eroare !\n”);
exit(1);
}
copy(fdold, fdnew);
exit(0);
}

copy(int fdold, int fdnew) {


int count;
while ((count = read(fdold, buffer, sizeof(buffer))) > 0)
write(fdnew, buffer, count);
}
Sisteme de Operare. Teorie şi Aplicaţii 109.44 Robert.Gyorodi@ul.ie
Mediul de Procesare
Un program este un fişier executabil
Un proces este o instanţă a unui program în execuţie
Se pot executa mai multe procese simultan, nefiind impusă o limită
asupra numărului de procese existente în sistem
Programul exemplifică folosirea apelului sistem fork - pentru crearea unui nou proces, precum şi a apelurilor sistem exec - pentru lansarea în
execuţie a unui alt program, wait - pentru aşteptarea terminării unui proces fiu.

main(int argc, char *argv[])


{
int pid, wpid, status;

pid = fork();
if (pid == 0)
execl(“copy”, “copy”, argv[1], argv[2]);
wpid = wait(&status);
exit(0);
}

Sisteme de Operare. Teorie şi Aplicaţii 109.45 Robert.Gyorodi@ul.ie


Servicii ale Sistemului de Operare
Controlul execuţiei proceselor permiţând:
crearea
terminarea
suspendarea
comunicarea interproces
Planificarea corectă a proceselor pentru execuţie
Procesele folosesc acelaşi procesor, astfel dacă procesorul execută un proces, nucleul
suspendă acest proces atunci când cuanta de timp a acestuia expiră şi planifică un alt
proces la execuţie
Alocarea memoriei pentru execuţia proceselor
Nucleul permite proceselor să pună în comun porţiuni din spaţiul lor de adrese în anumite
condiţii, dar protejează spaţiul de adrese privat împotriva acceselor nepermise, de
asemenea dacă sistemul, la un moment dat, are la dispoziţie prea puţină memorie liberă,
acesta eliberează memorie prin transferarea temporară a unui proces sau porţiuni ale
acestuia în memoria secundară, care de obicei este un disc şi care se numeşte disc de
swap (SWAPPING vs. PAGING)
Alocarea eficientă a memoriei secundare pentru depozitarea respectiv regăsirea
eficientă a datelor utilizatorilor
Acest serviciu reprezintă chiar sistemul de fişiere
Acordarea accesului controlat proceselor la dispozitivele periferice, cum ar fi
terminale, discuri, discuri de reţea sau alte periferice

Sisteme de Operare. Teorie şi Aplicaţii 109.46 Robert.Gyorodi@ul.ie


Restricţii Hardware
Execuţia unui proces utilizator în sistemele UNIX este divizată pe două
nivele:
nivelul utilizator - user
nivelul de nucleu - kernel
Când un proces execută un apel sistem, modul de execuţie al procesului se
schimbă din mod utilizator în mod kernel
La fel se întâmplă la tratarea întreruperilor, planificarea proceselor, gestionarea
memoriei, etc.
Multe arhitecturi de calculatoare suportă mai multe nivele decât cele două
menţionate, dar cele două moduri sunt necesare şi suficiente pentru sistemele
UNIX
Diferenţele dintre aceste două moduri sunt:
procesele în mod utilizator pot accesa instrucţiunile şi datele proprii, dar nu pot
accesa instrucţiunile şi datele nucleului sau ale altor procese
procesele în mod kernel pot accesa atât adresele utilizator cât şi adresele nucleului
unele instrucţiuni sunt instrucţiuni privilegiate şi execuţia lor în mod utilizator duce la
semnalarea unor erori

Sisteme de Operare. Teorie şi Aplicaţii 109.47 Robert.Gyorodi@ul.ie


Întreruperi şi Excepţii
Întreruperi
Sistemele UNIX permit dispozitivelor să întrerupă procesorul în mod
asincron
La apariţia unei întreruperi, nucleul îşi salvează contextul curent, determină
cauza întreruperii şi tratează întreruperea
După tratarea întreruperii, nucleul reface contextul şi continuă procesul
întrerupt
Când nucleul tratează o întrerupere el inhibă toate întreruperile cu prioritate
egală sau mai redusă decât întreruperea curentă, astfel încât în timpul
tratării pot să fie tratate doar întreruperi cu un nivel mai mare de prioritate
Excepţii
O condiţie de excepţie se referă la evenimentele cauzate de procese, ca şi
adresarea ilegală a unei zone de memorie, execuţia unei instrucţiuni
privilegiate, împărţirea la 0 şi altele
Aceste excepţii sunt diferite de întreruperi şi au loc în timpul execuţiei unei
instrucţiuni, sistemul încercând reluarea acelei instrucţiuni, după tratarea
excepţiei
Sistemul UNIX foloseşte acelaşi mecanism atât la tratarea întreruperilor
cât şi la tratarea excepţiilor

Sisteme de Operare. Teorie şi Aplicaţii 109.48 Robert.Gyorodi@ul.ie


Nivele de Execuţie ale Procesorului
Nucleul, în anumite condiţii, trebuie să nu permită apariţia de
întreruperi în timpul unei activităţi critice, care ar avea ca rezultat
structuri de date corupte
Nivelele tipice de întreruperi sunt:
întreruperi software
întreruperi de la terminale
întreruperi de la dispozitive de reţea
întreruperi de la discuri
întreruperi de la ceasul de timp real
întreruperi datorate erorilor hardware

Sisteme de Operare. Teorie şi Aplicaţii 109.49 Robert.Gyorodi@ul.ie


Gestionarea Memoriei
Nucleul se află întotdeauna în memorie
Când se compilează un program, compilatorul generează un set
de adrese pentru acel program care reprezintă adresele
variabilelor şi structurilor de date
Aceste adrese sunt generate pentru o maşină virtuală,
considerând că nici un alt program nu se va executa simultan pe
aceeaşi maşină fizică.
Când programul este rulat pe o maşină, nucleul va aloca spaţiu
în memoria principală, dar adresele virtuale generate de
compilator nu este necesar să fie identice cu adresele fizice pe
care le ocupă acesta în maşină
Nucleul în colaborare cu hardware-ul va iniţializa o translatare a
adreselor virtuale în adrese fizice, astfel încât adresele generate
de compilator vor indica adresele fizice de pe maşina respectivă

Sisteme de Operare. Teorie şi Aplicaţii 109.50 Robert.Gyorodi@ul.ie

S-ar putea să vă placă și