Sunteți pe pagina 1din 94

a a

sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
Sisteme
D
an de operare
a D
an
Preliminarii a
3 3
01 osm 20
1 sm
c)2 C ) Co
( C. (c C.
an an
D D
0 13 13
) 2 Dan Cosma, 2013
dr. ) 20
(c (c
!1 !2

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13Cui i se adresează cursul:
sm
20 s 0
) Co )2 C o
(c C. ( c Studenților din .
C anul III și tuturor
➥ persoanelorn interesate
an a să
D
Audiență și impact a Dmecanismele esențiale a
1 3 m înțeleagă
13 m
20 s 0 software moderne
os
Co 2
ale sistemelor
) ) C
(c C. (c C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!3 !4
a a
s m sm
Obiective .șiCoabilități câștigate
 Co
C C.
an an
D a D a
1 3 utilizarea la nivel de profesionist
m în domeniul 3 m
0 ingineriei software a sistemelor s 01 s
)2 
 Co )2 Co
de operare moderne

( c C . (c sau, altfel spus,C.poate ajuta la
a
înțelegerea conceptelor n fundamentale asociate an cariere de durată: 

construirea unei
D a D a
sistemelor de operare,
1 3 cu impact direct și esențial
m 
 3 m
20 de aplicații software moderne
 s 01 s
asupra dezvoltării
c) . Co 

c)2 Co

 ( C 
 ( C.
folosirea în programe, la nivel avansat, an a serviciilor an ➞ ➞ ➞

D D
oferite de sistemul de operare și
0 13 de bibliotecile de 13
funcții asociate
 )2 ) 20
➥ programare de sistem (c (system programming) (c
!5 !6

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13 m
20 s 20 s
) Co ) Co
(c C. (c C.
an an
D a D
Structura disciplinei Sisteme de operare a
3 m 3 m
01 ➡ s 20
1 s
c)2 Co c) Co
( C. ( C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!7 !8
a a
sm sm
Curs
 Co Laborator
 Co
C. .
C
an
-D14 săptămâni a câte 2 ore
a
an
- lucrări de laborator individuale

D→ surprind aspecte practice esențiale, a

0 13 → prezentări ale temelor fundamentale, sm explicații, exemple
 01
3 m
→ introduc concepte fundamentale spentru dezvoltarea de sisteme software,

2 o o
) .C )2 → ajută în mod direct formarea C dvs. ca ingineri software profesioniști

(c (c C.
- interactivitate

C - interactivitate

n răspunsuri -- nu ezitați să puneți întrebări !

→ discuții, analize, probleme,
a an răspunsuri -- nu ezitați să puneți întrebări !

→ discuții, analize, probleme,
- feedback
 D a D a
1 3 reclamații -- toate sunt binevenite, potmduce - feedback
 13 m
0
→ sugestii, observații,
o s 20 reclamații -- toate sunt binevenite, s
Copot duce la
la
) 2
îmbunătățirea cursului și a comunicării 
 C )
→ sugestii, observații,
(c C. îmbunătățirea(clucrărilor de laborator și a comunicării 
 .
C
an an
D D
0 13 1 3
)2 ) 20
(c (c
!9 !10

a a
sm s m
Co
Evaluare
 Feedback
 o
. C
- 3 testeC la laborator
 C.
an
→ programe complete, de mici dimensiuni, abordabile in aproximativ o oră 
 an
D a D a
1 3
→ testează abilitățile de programare sistem sau utilizare avansată a SO
m 13 m
20 s 0 s
Co ) 2 - e-mail: dan punct cosma Co at cs punct upt punct ro

acumulate la data programată a testului

) → definesc nota la laborator (medie ponderată a notelor la teste)

(c → pondere în nota finală: 35%
 C. ( c 
 C .

an - în direct, la curs a n
D
- examen în sesiune
 a D sau laborator
 a
3 m 3 m
01
→ o suită de întrebări care evaluează gradul de înțelegere a conceptelor s 20
1 s
)2
studiate și a tehnicilor învățate

c Co c) Co
( C.
→ o componentă practică, menită a evalua măsura în care ați asimilat ( C .
an an
cunoștințele de la laborator

→ pondere în nota finală: 65%

D D
13 3

0 1
- feedback

) 2 ) 20
(c
→ sugestii, observații, reclamații -- toate sunt binevenite, pot duce la (c
îmbunătățirea evaluării și depistarea eventualelor erori sau probleme 


!11 !12
a a
sm Bibliografie
 os
m
Co
Resurse

C
C. C.
an an
1. W.R.Stevens, S.A.Rago, Advanced Programming in the UNIX Environment,
D a D a
3- Site-ul cursului
 m Third 3 Edition; Addison Wesley, 2013%
m
01 s 0
 1 s
)2 Co de software engineering

→ pe portalul “LOOSE” al cursurilor
. ) 2 2. W. Stallings, Operating Systems: Internals . Co and Design Principles, 7 edition,
(c C
→ http://loose.upt.ro/~oose/pmwiki.php/SO/OperatingSystems
 c
( Prentice Hall, 2011
 C
th

- Site-ul laboratorului
 a n a n
Dde laborator complet
 a

D a
→ conține îndrumătorul
1 3 m 3. Eric S. Raymond: The Art
1 3 of UNIX Programming, Addison-Wesley, 2003%
m
20
→ http://labs.cs.upt.ro/labs/so/html/index.html
 s 20 s
Co C5
 o. Ioan Jurca:

c) . c) .
( C
4. A. Robbins: UNIX ( in a Nutshell, Fourth Edition; O'Reilly, 2005

Programarea de sistem in UNIX, Editura de Vest, Timisoara.C2005%
an an
D 
 D
13 6. A. S. Tannenbaum: Modern Operating Systems, 132 Edition, Prentice Hall, 2001

nd

) 20 )2
0
(c (c
!13 !14

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13 m
20 s 20 s
) Co ) Co
(c C. (c C.
an an
D
1.13Introducere sma D
Ce este un
1 3 sistem de operare ?ma
20 Co 2 0
C os
c) )
( C . (c C.
an an
D D
13 13
) 20 )2
0
(c (c
!15 !16
a a
sm sm
Co Calculatoarele sunt mașini complexe... Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
an an
D a D a
3 m 3 m
01 s 01 s
c)2 Co c)2 Co
( C. ( C.
http://xkcd.com/722/

an an
D D
0 13 13
) 2 ) 20
(c ... care(ctrebuie folosite eficient

!17 !18

a a
s m s m
CalculatorulCo CalculatorulCo
C. C.
an an
D a D a
0 13 s m 0 13 s m
)2 ProcesoCo Memori )2
Proceso
Proceso Co Memori Memori
( c C . ( c Proceso
C . Memori
an an
D a D a
1 3
Magistrală
m 1 3
Magistrală
m
20 s 20 s
c) Intrare- . Co c) Intrare- . Co
( (
ieșire (I/O) n C ieșire (I/O) n C
a a
D D
0 13 0 13
c)2 c)2
Disc (
Rețea Periferice ... Disc (
Rețea Periferice ...
(arhitectura 
 (arhitectură mai
„clasică”) complexă)
!19 !20
a a
sm m
CalculatorulCo C
Calculatorul... os
C. C.
an an
D a D a
0 13 sm 0 13 sm
)2 Co )2 Co
(c Ma C. Ma (c C.
an an
D a D a
3 m 3 m
01 . s 01 s
Co Co
.

c)2 c)2
( C. ( C.
an an
Ma D D
0 13 13
) 2 ) 20
(c . (c
(arhitectură și mai
(... altceva)
complexă)
!21 !22

a a
sm s m
Co Sistemul de operareCo
C. C .
an an

?
D a D a
13 m 3
O01colecție de programe care:%sm
20 s
) Co ) 2 - gestionează resursele
o
Chardware%
(c C. ( c
- creează abstracțiuni C .
an a n de nivel înalt pentru resurse

D a - controlează execuția D aplicațiilor% a
3 m 3 m
01 s - oferă o interfață1 spre aplicații%
20 cu utilizatorul s
c)2 Co c)
- oferă o interfață Co
( C. ( C .
an an
D D
... e nevoie de mecanisme care să1le 3 facă mai abordabile% în funcție de variantele de sistem,13diverse roluri pot fi
2 0 20
→ în utilizare% preluate de aplicații (exemplu:) interfața cu utilizatorul)
( c) (c
→ în dezvoltarea de aplicații
!23 !24
Ușurință în utilizare. Arhitectura pe straturi a software-ului unui sistem de calcul
a a
m m
C
Obiectivele sistemuluios de operare [2] Ce-ar fi dacă...? C os
C . C.
an an
D D
1 3• Ușurință în utilizare
 ma 1 3 m
a
20 os 0 Aplicații
Co
s
) → pentru a facilita accesul la resurse%
C )2
(c C. ( c .
C la
acces direct
• Eficiență
 an a n
hardware
D a D a
1 3 și gestionare a resurselor%
→ în modul de utilizare
m 3 m
20 s 01 Hardware% s
c) . Co I/O(c
2
) Memori % Stocare Co
• → capacitatea
Abilitatea( de a evolua
 C ...
C.
a n
de a i se adăuga în timp noi funcționalități, fără ca %
an
D
acest lucru să afecteze oferirea serviciilor sistem
D
1 3 13
) 20 ) 20
(c (c
[2] W. Stallings, Operating Systems: Internals and Design Principles, 7th edition, Prentice Hall, 2011

!25 !26

Ușurință în utilizare. Arhitectura pe straturi a software-ului unui sistem de calcul Ușurință în utilizare. Arhitectura pe straturi a software-ului unui sistem de calcul
a a
Acces direct la hardware% s m sm
. Co Co Aplicații
C.
%
C de complexe

- programe extrem
- duplicări n
a disc)

stocareDpe
de cod în funcționalitățile aplicațiilor diferite (ex: prelucrarea formatelor de
an
mare de versiunile de dispozitiveahardware

D Library API
a
13 de portabilitate

- dependență
0 sm 13 sm Servicii sistem
2
- lipsă
o
C de calcul

) - vulnerabilitate la evoluția în timp a sistemului ) 20 o
Biblioteci deCfuncții
(c - ... C. (c C.
an Sistem an
D a D de operare% a
1 3 m 1 3 Proces% m
20 s 20
Fișier s
Co Co
Pipes ...
c) . c) %
.
( C ( C
an an
D Hardware% D
13 13
) 20 I/O
Memori %
)2
0
Stocare ...
(c % (c

!27 !28
Ușurință în utilizare. Arhitectura pe straturi a software-ului unui sistem de calcul Eficiență
a a
m m
C os
Servicii ale sistemului de operare
C
Exploatarea resurselor os
C . C.
an
• Execuția și controlul programelor% an
- gestiunea eficientă a timpului procesor

D a D a a entităților/programelor
1 3 m 1 3 rulează în paralel sau secvențial în sistem

→ prin algoritmi potriviți de planificare la execuție
m
0 Gestiunea memoriei% s 0 s
Co Co
care

c) 2• . c) 2 - gestiunea eficientă a intrărilor . și ieșirilor



( C ( C
• Acces la dispozitivele a n I/O% aan memoriei

→ caching, reutilizarea resurselor care abstractizează dispozitive etc.


D a - gestiunea eficientă D a
1 3 m 3
→ eliberarea memoriei1nefolosite, swapping, scheme de memorie m
os
20 și controlat la date (fișiereCetc.)% 0 os virtuală
• Acces simplificat) 2 C
c)
etc.

( c C . - gestiunea (eficientă a comunicării între C. programe

• Detecția și tratarea erorilor% an → mecanisme rapide de comunicare sincronă și asincronă
an
D D
13 - ... 13
• Unelte de dezvoltare software%) 20 )2
0
(c (c
• Securitate, monitorizare, sincronizare etc.
!29 !30

Abilitatea de a evolua
a a
sm sm
Co
Sistemul de. operare are nevoie să evolueze când Co
C C.
an
- se modifică părți din hardware
 an
D a D a
1→ 3 ex: adăugarea unui dispozitiv (disc, stick
m de memorie, imprimantă, ...) nou
 13 m
0 o s 20 s
) 2 - apare nevoia de servicii. Cnoi
 ) Co
( c → ex: noi protocoale de conectare C la rețea, facilități îmbunătățite pentru (c C.
n
a a datelor pe disc etc.

utilizator, formate noi de organizare
an
- trebuie corectate erori
 D a D
Scurt istoric3 al sistemelor de operare a
1 3 m 1 m
20 s 20 s
Co Co
→ ex: rezolvarea unor probleme de securitate, rezolvarea unor bug-uri

- optimizări
 (c) . ( c) .
C C
→ ex: algoritmi mai rapizi de acces la disc, răspuns mai
a n rapid al interfeței cu an
utilizatorul etc.
 D D
13 1 3
) 20 ) 20
Sistemele de operare moderne includ (c nativ mecanisme avansate de (c
actualizare (update, upgrade) și gestiune a pachetelor software
!31 !32
a a
sm sm
Co Co
C. • C. Apariția sistemului UNIX 

1969-1971:
an
• D<1955: Mainframe, fără sistem de operare
 an
➞ Ken Thompson (Bell Labs) incepe să lucreze la un nou SO, după ce Bell

a D
Laboratories se retrage din proiectul Multics

a
3 ➞ utilizate pe rând, programele introduse manual, cu cartele sau
3
sm m
➞ Co-autor: Dennis Ritchie, care va crea și limbajul C (1971-1973), pentru a-l
01 benzi magnetice%
o 01 s
)2 )2 Co
folosi la scrierea UNIX (prima versiune de UNIX era scrisă în asamblare, iar
C
(c C. cu operare in loturi (c C.
aplicațiile într-un limbaj interpretat numit “B”)

• Anii ’50-’60: Mainframe, ➞ Prima versiune UNIX: pe calculatorul PDP 7 (DEC), 1969-1970 (“UNICS” -
(“batch systems”)
an Program monitor an
“UNiplexed Information and Computing Service”)

➞ monitorul, un “SO”
 D a D
➞ Începe să se răspândească gratuit, la nivel de surse%
a
3 m 3 m
01 s 1 s
rezident permanent in 

• 1971: UNIX pe20PDP 11

2 Co Coal Bell Labs%
Compilator, programe utilizator
memorie, care permitea 

c) . c)
➞ folosit pentru procesare .
(
lansarea de “job”-uri%
C ( de text la departamentul de patente
C
• Cca. 1955: Mainframe cu sisteme an de operare • 1972: UNIX raportează 10 instalări
 an
D ➞ distribuirea sa gratuită îl face extrem de popular D
dedicate 1 3 1 3 în industrie și universități

20 20
➞ multitasking nativ, multiuser%
) )
(c (c
!33 !34

a • a
1980: MS-DOS

s m sm
• ~1971 Cocalculatoare personale, datorită producției de masă de
- anii
.
’80: “Revoluția” Home Computer

C o
➞ IBM contractează Microsoft pentru scrierea unui SO destinat noilor
calculatoare personale (PC) dezvoltate de companie, după ce o discuție
C.
➞ apar primele
C similară cu creatorul CP/M eșuează; Microsoft reține dreptul de a vinde

an de operare”: interpretor BASIC stocat in ROM, capabil să ruleze an


microprocesoare
 sistemul MS-DOS separat de hardware

➞”sistemul
D oferind o simplă interfață de comandă a pentru utilizator
 D
➞ bazat pe QDOS (“Quick and Dirty OS”), o clonă de CP/M, dezvoltată
a
1 3
programe,
jocuri, limbaje de programare,sm 13 m
de Tim Paterson, in 6 săptămâni, pentru compania la care lucra


20➞ exemple: Apple II, ZX Spectrum, Commodore


➞aplicații: interpretoare, compilatoare

20 s
Co Co
➞ QDOS cumpărat de Bill Gates (Microsoft) cu 50 000 $; înțelegerea cu
) .
64, HC-85 (RO), Tim-S (RO,
) IBM a fost ținută secretă de Microsoft la cumpărare

( c (c C.
TM)%
C ➞ după un an, Tim Paterson se angajează la Microsoft


a n an
➞ monotasking, interfață în linie de comandă inspirată din CP/M

• ~1974: CP/M

D -> “Control Program for Microcomputers”
 a D
➞ primele generații de PC-uri nu aveau capacitatea hardware de a rula
a
➞ “Control Program/Monitor”
1 3 m UNIX
 3 m
s
0 serviciile oferite programelor (pt. portabilitate)
 01 s
Co (RO)% Co
➞ folosit in medii business, educație, pe microcalculatoare

➞ aprox. 5 comenzi, ) 2unifică )2
( c
➞ exemple de calculatoare: Altair 8080, Amstrad PCW,
C .
CUB-Z ( c C.
a n • 1980-1990: “The UNIX Wars”[3]

an
• 1977: BSD

3
D ➞ perioadă în care UNIX e exploatat comercial

3
➞ diferitele versiuni de UNIX concurează cu succes pe piață
 D
➞ “Berkeley Software Distribution” / ”Berkeley UNIX”

1 1
20 derivat din sursele UNIX de 20
➞ apare TCP/IP și este adoptat de UNIX, prima dată la Berkeley

➞ dezvoltat la University of California, Berkeley,
) )
➞ comercializarea UNIX elimină libera circulație a codului sursă și are
(c sisteme de operare open source % (c
la Bell Labs

un efect secundar: reduce vitalitatea dezvoltării sistemului

➞ în prezent, unul din cele mai importante
➞ diferite încercări de a porta UNIX pe i386 eșuează%
[3] Eric S. Raymond: The Art of UNIX Programming, Addison-Wesley, 2003

!35 !36
a a
• sm Stallman pornește proiectul GNU 

1983: Richard
o sm
C
➞ cu scopul de a crea un UNIX gratuit

• August 1991: Co
. Prima versiune de Linux

C.
➞ introduce licența GNU General Public License

C
➞ dezvoltat de Linus Torvalds, atunci student la Universitatea din Helsinki (Finlanda)

an an
➞ deși nucleul UNIX rezultat (Hurd) nu are succes, proiectul GNU devine unul din
➞ urmează complet standardele specifice UNIX

D
principalii promotori ai mișcării open source%
a D a
➞ open source, devine extrem de popular, ajunge rapid un SO matur%
13 m Software”
 3 m
• os
201984: Apple Macintosh “System 01
•c) 1992:
2 BSD e portat pe i386%o s
) C .C
(c C.
➞ rula pe Apple Macintosh 128K (primul calculator Apple)

➞ va fi numit mai târziu Mac OS
 ( C
an
➞ este sistemul de operare care a popularizat ideea de interfață grafică% • 1993: Windows NT
 n
a
D a D de celelalte sisteme Windows
 a
➞ versiune nouă de sistem, diferită

• 13
1985: Windows 1.0

0 sm 3
1 32 biți; în prezent, are și versiuni de 64sm
➞ multitasking, multiuser nativ

➞ primul sistem complet 0pe
Co o biți


c)2
➞ interfață grafică cu utilizatorul pentru sistemul MS-DOS
 2 C
➞ este sistemul care )va evolua devenind, pe rând, toate versiunile moderne de
Windows (XP, 2000,(cVista, 7, 8)%
( C. .
➞ anunțată în 1983, semăna foarte mult cu interfața Apple Macintosh; la lansare a
C
an n
apărut într-o formă modificată%
a
• 1990: Windows 3.0 
 D • 1999: Apple OS X
 D
➞ primul succes semnificativ al Windows
 0 13 ➞ bazat pe UNIX

➞ nucleul său (Darwin) va deveni bază inclusiv20
1 3
pentru versiunile mobile (iOS)%
) 2
➞ multitasking parțial (cooperativ), memorie virtuala (i386)
 )
(c
➞ versiuni importante: Windows 3.1, Windows 3.11 for Workgroups % ( c
• ...

!37 !38

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13 m
20 s 20 s
) Co ) Co
(c C. (c C.
an an
D
Tipuri, variante, versiuni de sisteme de operare a D a
1 3 m 3 m
20 s 01 s
c) . Co c)2 Co
( C ( C.
an an
D D
13 13
) 20 ) 20
(c (c
!39 !40
a a
sm sm de operare
Tipuri de sisteme
Co o
Linux
C
C. C.
an n după destinație
Clasificare
a
D a D
3- sisteme de operare server
a
UNIX / Linux / Windows Server

13 / Linux / ...
Windows
0 sm m
01 → UNIX (e.g. Solaris), Linux, BSD,osWindows
2 Co 2 Server, OS X Server

) . ) . C
(c C ( c - sisteme de operareCdesktop

an → Windows, Linux, BSD,an
OS X OS X, Chrome OS

D a - sisteme de operare D mobile
 a
3 m 3 m
01 s 0 1 s
Co
8, Symbian, Bada, BlackBerryoOS, Palm OS 

)2
→ Android, iOS,2Windows
- sisteme(cde operare embedded
 C. C
)
Android
( c .
CiOS
Android an → OpenWRT (Linux), Windows CE, LynxOS

an
D - sisteme de operare în rețea
 3 D
13
Android
01 IOS

Linux
iOS
2 0 Android 2
→ Novell NetWare, JunOS (Juniper), Cisco
) )
(c (c
!41 !42

a a
sm de operare
Tipuri de sisteme
o sm de operare
Tipuri de sisteme
o
C C
C. C.
an după originea nucleului sistemului
Clasificare
an după modelul de licențiere
Clasificare
D / Linux

-3UNIX a D a
-3sisteme de operare proprietare

2 sm
01 → Solaris, HP-UX, BSD, OpenBSD,oFreeBSD, Linux (toate variantele), 2 o sm Windows, OS X, BlackBerry OS

01 → diverse variante de UNIX (e.g. Solaris),
C Chrome OS, Tizen, openWRT,
) Android, OS X, OS X Server, iOS, .webOS, ) C
( c
Firefox OS etc.
 C (c - sisteme de operare open C. source

- Windows NT
 a n → Linux, BSD
 an
D a - sisteme de operare D open source cu componente a
→ Windows NT, 2000,1 3 m 1 3 m
20 8

XP,
s
Vista, 7, 8 (inclusiv variantele Server acolo unde ele
proprietare
 20 s
Co Co (Palm⇾HP⇾LG)

există), Windows Phone
- Windows
(c ) . c) (Samsung, Intel, Linux Foundation), webOS
.
C (
→ Android, Tizen
C
→ Windows 95, Windows 98, Windows Millenium
 n - sisteme de operare proprietare cuancomponente
a
- alte nuclee proprietare
 D open source
 D
13 1 3
→ Symbian, Palm OS, ...

) 20 → OS X, iOS (nucleu open source “Darwin”,
) 20 derivat din BSD)

(c (c
!43 !44
Modele de licențiere software
 Modele de licențiere software

a a
sm m
Co os source

C.
• Free/Open C
C. ca sursele, concepția și proiectul codului să fie utilizate,
➥ permite
an an și raspândite/partajate în mod liber (în anumite condiții)

modificate
D software

Licență a -Dopen source “copyleft”
 a
3 m 3 → ex: GNU General Public License (GPL)
 m
01 s 0 1 s
)2 Co
Un instrument legal. (contract) care descrie ) 2 atâta .
o modificare și redistribuire, 

Cstudiu,
→ libertate nelimitată de utilizare,
(c ➥ și impune condițiile C ( c C in software proprietar, “închis”)

vreme cât redistribuirea nu adaugă restricții în plus față de 

n
a în care un produs n
GPL (de exemplu nu-l transformă
a
software poate D a - open source permisivă
 D a
1 3 fi utilizat, modificat și/sau m → ex: BSD License
1
3 m
distribuit
 20 s s
20 de utilizare și studiu, libertate de modificare
c) . Co c)
→ libertate nelimitată
. Co a
( C (
codului. Condițiile de redistribuire sunt mai relaxate,
C
nu impun

an an
păstrarea caracterului complet deschis al software-ului.%

D D
13 1 3
20 • ➥ utilizarea unui număr limitat de cópii, conform
Proprietary / closed source

20 unei EULA (End-User
) )
(c Licence Agreement
 (c
➥ proprietatea asupra surselor rămâne la producător; nu permite
libertăți de modificare și distribuție, decât în condiții foarte restrictive
!45 !46

Versiuni de sisteme ade operare a


osm sm
. C Co
• Windows

C C.
an an
→ 32 bit: Windows NT, 95, 98, Millenium, XP

→ 32/64 bit: Windows XP, Vista, 7, 8 %
D a D a
0 13 sm 13
sm
) 2 • Distribuții Linux
 Co ) 20 Co
( c → sunt sisteme de operare sub .
C formă de soluții complete, care includ un (c C.
n
a / open source, unele sunt comerciale, altele
nucleu Linux și o suită vastă de aplicații

an
D
→ majoritatea sunt gratuite
a Elemente de arhitecturăD a sistemelor de operare a
1 3 cost

oferă suport tehnic contra
m 1 3 m
20upgradabile
 o s 20 s
Co
→ includ sisteme complexe de gestionare a pachetelor software, sunt
ușor extensibile) și
c . C c) .
→ exemple: (Slackware, openSUSE, Debian, Fedora,CUbuntu, Mandriva, ( C
Mint Linux, CentOS, RedHat, Arch Linux, ... %
a n an
D D
• Apple 0 13 1 3
Mac OS X

→ certificat UNIX, cu nucleu open source) 2 (Darwin) derivat din BSD
 ) 20
(c "Snow Leopard", 10.7: "Lion",
→ 10.4: "Tiger", 10.5: "Leopard", 10.6: (c
10.8: "Mountain Lion", 10.9: "Mavericks"

!47 !48
a a
sm m
Co
Exemplu: arhitectura
C os Mac OS X
. sistemului de operare
Componentele
C C.
a n an
• 3Nucleu
D (kernel)

a 3
D a
1 sm
→ conține funcționalitatea de bază a sistemului de operare

1 sm
) 20 → dimensiunea sa depinde mult de
o
arhitectura
C
propriu-zisă%
)2
0
Co
(c C . ( c C .
• → alte componente softwareadinn sistemul de operare, cu diverse roluri

Subsisteme funcționale

a n
D interfețe de programare, biblioteci de funcții
a D a
1 3 implementate
→ pot include utilitare sistem,
în afara nucleului etc.
 sm
3 m
20
specializate, servicii sistem
01 s
c) Co ) 2 Co
( C . (c C.
an an
D funcționale D
Diversele arhitecturi definesc raporturi
1 3 1 3
diferite între nucleu și celelalte20subsisteme 20
) )
(c (c
(c) Wikimedia Commons, http://commons.wikimedia.org/wiki/File:MacOSXArchitecture.svg

!49 !50

a a
Exemplu: arhitectura sm Linux Spații de memorie s m
C o Co
C. C .
an Sistemelean de operare moderne împart memoria
D a D în două categorii de spații
virtuală a distincte
0 13 sm 0 1 3
sm
c)2 . Co c) 2 • Spațiu nucleu (kernel. Cspace)

o
( C ( → spațiul de memorie în careCrulează componentele nucleu și
an majoritatea driverelor%
an
D a D a
3 m 3 m
01 s • Spațiu 1
20 (user space)
 s
2 Co Co sau
utilizator
) )
(c C. c
→ în care rulează
(
drivere din sistem

aplicațiile utilizator, utilitarele, unele .servicii
C
an an
D D
0 13 Separația duce la un bun control 1bazat
0
3 pe privilegii
) 2 al componentelor software, protecție, ) 2 securitate
(c
sursă și (c): http://www.ibm.com/developerworks/library/l-linux-kernel/
(c
!51 !52
Tipuri de nucleu a Tipuri de nucleu a
sm m
Co os
C.
• Microkernel

→ un set de C
. C
componente “server”, construite în jurul
an an minimal

unui nucleu
• 13 D
Nucleu monolitic

m
a
1
D oferă doar servicii de bază: comunicare
→ nucleul
3 gestiunea memoriei, gestiunea proceselor

(IPC), m
a
0 s
→ toate serviciile rulează împreună cu firul principal
s
→0“serverele” implementează celelalte servicii
)2 Co
de execuție, în același spațiu de memorie
 o și se
2 în spații de memorie diferite față deCnucleu

) află
(c C. c .
( → avantaje: flexibilitate, mentenanțăCușoară,
→ poate conține module încărcabile dinamic (Linux)

→ avantaje: acces direct la hardware, comunicare
an
rapidă în interiorul nucleului, ușor de implementat
 dependențe minime

an (comunicare
D
→ dezavantaje: dependențe mari între componentele a D
→ dezavantaje: performanță redusă
a
13 3 folosită mai mare,
sursa: Wikipedia

0
nucleului, mentenanță dificilă

sm mai greu de depanat 
 0
1
intensă între servere) memorie
sm
→ exemplu: Linux
c)2 Co → exemplu: QNX% )
c
2 Co
( C. ( C.
an an
D • Nuclee hibride
 D
13 3
sursa: Wikipedia

0
→ similare cu microkernel, dar includ mai multe 1
) 2 servicii în nucleu pentru mărirea performanței

) 20
(c → Exemple: OS X (Darwin), Windows NT
(c
sursa: Wikipedia

!53 !54

a a
sm sm
Co • Arhitectura Co tradițională

C. C .
an an
D a D Sistem de operare a
1 3 m 1 3 m
20 s 0 s
) Co )2 Co
(c C. ( c C .
an an
Hardware
D
Mașini virtuale a D a
1 3 m 3 m
0 s 01 s
)2 Co ) 2 Co
( c C. • Dezavantaje
 (c C.
an an
→ un singur SO la un moment dat

→ aplicațiile trebuie portate pe mai multe sisteme de operare%
D D
0 13 13
) 2 • Soluție: virtualizare
 ) 20
(c (c
!55 !56
a a
• m
Mașină virtuală

s s m
. Co care simulează complet un sistem
un software Tipuri de mașini C ovirtuale
C (computer), oferind programelor un
hardware C. Aplicații
n
a virtual de execuție%
mediu a n
D a • Mașină D virtuală tip sistem
 a multe Sistem de
1 3 m →3
1 m
simulează un hardware complet, de cele mai
0 % s 0ori un sistem de calcul real% s operare

)2 . Co ) 2
.C
o
(c Software C nativ (c C
Mașină
%
a n • Mașină an pentru a rula
virtuală tip proces 
 virtuală
D a D
→ oferă un mediu virtual de execuție
a
3 m 3 de programare specific
 m
01 1
programe scrise într-un limbaj
2Mașină virtuală s → mașina e dezvoltată0doar pentru a rula codul s
Co Co
%
) ) 2 nu simulează o mașină
(c C. c .
obiect al acestor programe,
reală
 ( C
• Caracteristici:

an → oferă portabilitate programelor scrise în acel limbaj
 n
a
D
→ pe mașina virtuală poate fi rulat software nativ, care altfel ar rula → exemplu: Java Virtual Machine (JVM)%
D
doar pe sistemul hardware original

0 13
→ un același calculator poate rula mai multe mașini virtuale 0 1 3
) 2 

) 2Program
Java
Cod
obiect
(c (c
simultan, cu arhitecturi originale diferite

→ programele instalate în mașina virtuală rulează ca și cum ar
funcționa pe o mașină reală și sunt complet izolate de sistemul
gazdă și de celelalte mașini virtuale JVM
!57 !58

a a
s m sm
Arhitectura generală
. Co Co
Tehnici de virtualizare
.
C C
an A. Nativă
an
D a D
→ virtualizează a
1 3 m 1 3 arhitectura hardware pe care rulează
m
20 s 0 • Hipervizor de tip 1 s
c)
SO musafir
. CoOS) SO
SO musafir musafir
c)2 (nativ)*
 . Co SO SO Mașină

SO
( (guest OS) (guest
CMașină

(guest OS)
( C
Mașină

a n Mașină

an
→ accesează direct hardware-ul% Hipervizor
virtuală
D virtuală virtuală
a D a
Hardware
1 3 m 3 m
s 01 s
%
20
Monitor al mașinilor virtuale (hipervizor)

c) Co ) 2 Co
( Sistem de operare gazdă
C . (c de tip 2*

• Hipervizor SO C. SO SO
(host OS)
a n →rulează peste un sistem de an
VM VM VM
Hardware D operare convențional% D
1 3 3 Hipervizor

20 01 Sistem de operare gazdă


) )2
(c (c

 Hardware

*După Gerald J. Popek and Robert P. Goldberg: "Formal Requirements for Virtualizable Third Generation Architectures", 1974

!59 !60
a a
m m
Tehnici de virtualizareC os Co
s
C. C.
an an
D a D a
B. Emulare1 3 arhitecturală
 m 3 m
0 o arhitectură hardware străină
o s 01 s
)2 )2 Co
→ virtualizează
virtuală nu e neapărat una cu C
c C. (c C.
→ arhitectura corespondent real în hardware%
(
C. Virtualizare la nivelulDsistemului an 2. Utilizarea an avansată a

de operare
 a D
→ tehnologie care virtualizează13 servere în cadrul sistemului de operare
 m 3
→ nucleul sistemului de operare20 stătătoare
 s
o care apar
oferă mai multe spații utilizator distincte, 2 01
a sistemelor de operare
osm
c ) C ) C
C. reciproc

→ spațiile distincte sunt(izolate unele de altele și nu se influențează
utilizatorului ca servere de sine
(c C.
→nu toate serviciile sunt oferite severelor virtuale

→nu pot găzdui sisteme de operare diferite de cel real D
an an
D
0 13 13
)2 ) 20
(c (c
!61 !62

a a
sm sm
Co Deziderate urmărite Co la proiectare
C. C .
an an
D a D
• 01Publicul-țintă
 a
13 m 3 mserver, mobile, embedded), tipul
20 s s
Co Co %
➞ uz general, domenii specifice (desktop,
) ) 2 de utilizator (avansat, novice, consumer)
(c C. ( c C .
D
an • Modalitatea de expresie

a n
Dmultiuser), tipul de interfață cu utilizatorul
“Filozofia” de proiectare
3 a sistemelor de operarea ➞ tipul prelucrărilor (job-uri,
3 a cu(linie
1 sm m
01 gesturi touch, voce, butoane si ferestre,...)
os
de comandă, interfață grafică), mecanismul principal de interacțiune

) 20 Co
utilizatorul (comenzi2directe,
) C
etc.%

( c C . (c C.
an
• „Filozofia” urmărită

n
➞ principii care stau la baza construcției sistemului, aaplicabile întregului
D D
13 13
sistem, indiferent de celelalte deziderate menționate

) 20 )2
0
(c (c
!63 !64
a a
m m
„Filozofia” UNIX, C ospe scurt De ce UNIX ? Co
s
C. C.
an an
D a D a
1 3 m 13 m
0Modularitate și interconectivitate
 s 0 s
)•2 ➞ scrierea de componente software. Cușor conectabile: ieșirea oricărui
o Co
)2

?
c
( program să poată fi intrarea altuiaC% (c C.
an an
• Claritate și simplitate
 D a D a
1 3 clare și simple față de programe complicate
m 3 m
0
➞ sunt de preferat aplicații
os inutil%
01 s
precis
(c
) 2
.C c)2 Co
• Scop C ( C.
➞ un program să facă un singur lucru, dar bine
an an
D D
3
1simple, 13
0 20
)2
Prin combinarea liberă a unor componente cu scop precis și
c )
(
ușor interconectabile se pot obține comportamente complexe și
diverse, fără a avea dezavantajul dat de o complexitate exagerată a
(c
software-ului propriu-zis.
!65 !66

a Interfața în linie de a
sm m comandă UNIX
s
Co C o
C.
Expresivă
.
C
→ permite exprimarea directă și nemijlocită a necesităților utilizatorului

an an
→ face apel la concepte simple, bine definite și cu utilitate precisă%
D a D a
13 m 13 m
20 s 0 s
) Co ) 2Puternică
 Co
(c C. (c C.
→ varietate mare de comenzi disponibile


an an
→ configurabilitate extinsă a comenzilor (opțiuni, fișiere de configurare,
variabile de mediu)

D
Comenzi UNIX a D a
1 3 m 3
→ flexibilitate maximă prin combinarea liberă a comenzilor pentru a realiza
m
0 s acțiuni mai complexe%
01 s
c)2 Co c)2 Co
( C. Adaptabilă 

( C.
an an
→ configurabilă, permite utilizarea de către persoane cu diferite niveluri de
D D
13 3
experiență: nu complică prea mult interacțiunea, dar nici nu o limitează%
0 1
) 2 ) 20
(c Independentă
 (c
→ nu depinde de facilități hardware speciale: poate fi folosită ușor pe orice
sistem, local sau de la distanță, ramânând la fel de puternică

!67 
 !68
a a
s m m
Interpretorul de C ocomenzi Tipuri de comenzi C os
C. interactiv prezentat utilizatorului
 C.
= Program
aoninterfață în linie de comandă
 an
→ oferă D a D a
→ oferă
1 3 metode de lansare în execuție a comenzilor, m de înlănțuire a
1 3 m
0 o s 0 s
) 2→ în UNIX există mai multe interpretoare )•2 Comenzi interne
 Co
acestora, de control

C de comenzi, selectabile de
(c utilizator
 C. c
( ➞ recunoscute direct de interpretorul .
C de comenzi

→ utilizatorii pot porni mai multe n n eval, exec, exit%
așiinterpretoare, după dorință (atât în mediu
a
➞ exemple: cd, break, fg, bg, source,
grafic, în ferestre separate, cât D în mod text)

a D a
→ oferă facilități de programare
1 3 (scripting)
 m • Comenzi externe
 1 3 m
20 bash
 s s
0 din afara interpretorului, existente caoprograme
Co )2
→ exemple: sh, csh, tcsh, ➞ programe executabile
c ) . separate pe disc, cincluzând C de operare,
C.

Terminologie(: 
 ( atât comenzile specifice sistemului
C cât și (o parte din) aplicațiile instalate

- shell (în sens larg) - orice interfață cu utilizatorul
 a
n ➞ exemple de comenzi UNIX externe: ls, man, cat, cut, an ps, top
- shell (în sens restrâns) - interpretorul de comenzi
D D
3
- shell script - un program scris folosind sintaxa1si semantica 13
0
recunoscute de interpretorul de comenzi, care2folosește comenzi ale
0
c) operații
 )2
sistemului de operare pentru a efectua diverse

( (c
!69 !70

a
Comenzi, parametri, a
m intrări și ieșiri
s
1 Comenzi, parametri,
m intrări și ieșiri
s
1

C o Ieșire
C o Ieșire
0 C. 2 0 C. 2
Intrare an Cmd param1 param2 ... Ieșire de Intrare an Cmd param1 param2 ... Ieșire de
D a eroare D a eroare
3 m 3 m
01 s Valoare
 01 s Valoare

) 2 Parametri Co )2 Co
(c •➞ specificați de utilizator în linia de C
.
comandă

returnată (c • Parametri C.
returnată
an an
ls -al . | grep ".gmail-"
➞ sunt cuvinte separate prin spațiu
• Intrare

3
D
m
a • Intrare

$ grep
D
3 "abc" m
a
1 s abc01 s
20fișiere sau poate veni de la alte comenzi

Co Co
123

) 2 123
➞ implicit tastatura

➞ poate fi redirectată)din abc
➞ descriptor standard:c
( 0 (“stdin”) C . ( casdf 234
C.
an an
123 abc 5678
123 abc 5678
D D
•➞ implicit
Ieșiri
1 3 • Ieșiri
13
) 20 către alte comenzi

ecranul sau fereastra interpretorului curent
 $ ls -al .
) 20
(c (c
➞ pot fi redirectate spre fișiere sau poate fi trimisa drwx------ 28 root root 4096 Oct 4 15:35 .
➞ descriptori standard: 1 (“stdout”) si 2 (“stderr”) drwxr-xr-x 25 root root 4096 Jul 10 13:35 ..
-rw------- 1 root root 8902 Oct 9 16:29 .bash_history
-rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc
!71 drwxr-xr-x 2 root root 7! 2 4096 Jul 5 18:55 Desktop
drwxr-xr-x 2 root root 4096 Jul 5 18:55 Downloads
a
Comenzi, parametri, a
m intrări și ieșiri 1
m
C os Ieșire
C
Redirectarea intrărilor os și ieșirilor
0 C . C .
Intrare an Cmd param1 param2 ...
2
Ieșire de • Redirectare

n
➞ cmda < fișier1

D a eroare D > fișier2
 a
3 m ➞3cmd
m
01 s Valoare
 0➞1 s
Co Co
cmd >> fișier2

)2 ) 2 ➞ cmd 2> fișier3%
(c C. c .
returnată ( C
• Valoare returnată

an a n
D
➞ orice comandă, program returnează către sistem, la terminare, o valoare întreagă

a D 1 a
3
➞ C: exit(valoare); sau return valoare; în main()%
m 3 m
01 s fișier1
Fișier
01 cmd fișier2
s
• Convenție:
 c) 2 Co ) 2 Co
(
➞ 0: programul s-a terminat corect
 C. (c 2 C.
an
➞ ≠0: programul s-a terminat cu eroare (iar valoarea e codul erorii)% anfișier3
D D
• În linia de comandă UNIX:

0 13 13
$ test 1 -eq 2 

) 2 ) 20
$ echo $?

1
 (c (c

!73 !74

a a
s m sm
Înlănțuirea comenzilor
. Co Co
Înlănțuirea comenzilor
.
C C
an • Execuțiea n secvențială

D
• 1Comenzile UNIX sunt interconectabile
 a D
➞ cmd1;cmd2;cmd3
a SAU logic

Valoare returnată: valoarea întoarsă de ultima comandă

3
➞ intrarea și ieșirile: în mod normal text
sm
3 || cmd2 || cmd3 Valoare returnată:
➞1cmd1 m
0 o pentru altul% 0 s
➞ cmd1 && cmd2 && cmd3 Valoareoreturnată: ȘI logic%
) 2 ➞ ieșirea unui program poate deveni . Cintrare )2 C
( c C % (
c C.
• Înlănțuire
 a n cmd 1
n 2
acmd cmd 3 ...
D |

➞ se folosește operatorul “pipe”:
a D a
3 m
%
3
1 01 sm
➞ cmd1 | cmd2 | cmd3 ...

20 în paralel% s
Co o
➞ comenzile sunt lansate
2 t
c) % ) C
( C . (c C.
cmd 1 cmd 2 an cmd 3 ... • Execuție în paralel
 cmd 1 n
a
D ➞ cmd1 & cmd2 & cmd3 & D
|| ||
0 13 || 13
cmd220
)2 )
ls -al . | grep ".gmail-"
(c (c cmd 3

!75 !76
t
a a
m m
Exemple de comenzi C os UNIX C
Exemple de redirectărios și înlănțuiri
C . C .
an an
D a D a
1 3 m sort <
1 3 fis1 > fis2 m
0 s % 0 s
)2 Co )% 2-l | grep student | wc -l >. Cfis3
o
man [opţiuni] [secţiune] comandă
pwd ls
( c cd director
 .
C ... ( c C -v ".qmail-ac:" | grep ":" | less
ls [-adgilrst] fişier
mv fişier1 fişier2 a n ls -a | grep ".qmail-" | grep
a n
D a
%
D /service /var/lib/qmail /var/qmaila
cp fişier1 fişier2
3 m
tar czf - /etc/ /var/named/
3 m
sort
01 s | ssh subspace.cs.upt.ro
20
1 s
"dd of=/disk2/bf2-bak-20130710.tar.gz"
du
) 2 Co %
) Co

df
who
(c C.
/opt/bin/mediaclient
( c --cat /dev/dvb/adapter0/dvr0
C
| /Applications/VLC.app/Contents/MacOS/VLC file:///dev/stdin

.
ps
 an 
 a n
D JARS=`find ${ANT_LIB} -name '*jar' | while D read JAR_FILE; do
0 13 echo -n ":$JAR_FILE"; done`

1 3
) 2 ) 20
(c (c
!77 !78

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13 m
20 s 20 s
) Co ) Co
(c C. (c C.
- shell script - un program scris folosind sintaxa si semantica 


an an de comenzi, care folosește


recunoscute de interpretorul
D D
Fișiere
1 3 de comenzi UNIX ma 3 a
comenzi ale sistemului de operare pentru a efectua diverse operații
1 m
2 0
C os 20 Co
s
) )
(c C. ( c C .
an an
D D
0 13 1 3
)2 ) 20
(c (c
!79 !80
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
- shell script - un program scris folosind sintaxa si semantica 


an de comenzi, care folosește


recunoscute de interpretorul
anbash
D a D a
1 3 operare pentru a efectua diverse operații
comenzi ale sistemului de
m 3 m
20 s 01 s
c) . Co c)2 Co
( C ( C.
an an
D D
13 13
) 20 ) 20
(c (c
!81 !82

a a
sm sm
Co Co
C. C.
a n a n
D
bash a D
bash a
13 ➞ “Bourne-again Shell” (joc de cuvinteminspirat 3 ➞ “Bourne-again Shell” (joc de cuvinteminspirat
1
20 s de denumirea Bourne Shell)

o din interpretoarele 20 s de denumirea Bourne Shell)

o din interpretoarele
➞ înlocuitorul modern și gratuit alCunuia ➞ înlocuitorul modern și gratuit alCunuia
) .
tradiționale din
) .
tradiționale din
(c UNIX (Bourne Shell -- sh)

C a comenzilor și programare: structuri de (c UNIX (Bourne Shell -- sh)

C a comenzilor și programare: structuri de
a n
➞ facilități diverse de procesare n
➞ facilități diverse de procesare
a
D
control, wildcarding, pipe, substituție de comenzi, bucle de iterare, evaluări
a etc.
 D
control, wildcarding, pipe, substituție de comenzi, bucle de iterare, evaluări
a etc.

1 3
de condiții, istoric al comenzilor, autocompletare în linia de comandă
m 1 3
de condiții, istoric al comenzilor, autocompletare in linia de comandă
m
20toate versiunile/distribuțiile de UNIX moderne
➞ sintaxa e un superset al celei din sh, aduce îmbunătățiri, sextensii

20toate versiunile/distribuțiile de UNIX moderne
➞ sintaxa e un superset al celei din sh, aduce îmbunătățiri, sextensii

➞ cvasiprezent în
c) . Co ➞ cvasiprezent în
c) . Co
( C ( C
an an
D D
13 alte interpretoare: csh, ksh, tcsh, ... 13
) 20 ) 20
(c (c
!83 !84
a a
m m
bash C os
➟ Variabile de mediu os
➟ Variabile deCmediu
C . C.
an an
D a D a
1 3 m 13 m
0 s 0 s
)2 . Co )2 Co
( c C (c C.
a n an
D a D a
3 m 3 m
01 s 01 s
) 2 Co )2 Co
(c C. ( c C.
an an
D D
0 13 13
) 2 ) 20
(c (c
!85 !86

a a
s m sm
➟ Variabile deCmediu o Co
C . C.
an variabile utilizabile în linie de comandă și fișiere de comenzi

➞ sunt an • Concatenare

D a D 
 a
1 3➞ tipul lor este întotdeauna șir de caracterem 3 m
s 01 s

0
)2 Co )2 Co
$ VAR1=abcd


( c C . (c
$ VAR2=x

$ echo $VAR1$VAR2
 C.
• Atribuire

an
VARIABILA=valoare
abcdx

an
D a
$ echo 123$VAR1

D a
1 3 m 123abcd
 3 m
• Preluarea
0 valorii

s 01
$ echo ${VAR1}123
 s

c)
2$VARIABILA

. Co abcd123

c)2 Co
(
 ( C.
$ VAR3=y${VAR1}123; echo $VAR3

C
$ VAR1=abcd
 a n yabcd123
an
$ echo $VAR1
 D D
abcd
13 13
) 20 ) 20
(c (c
!87 !88
a a
sm m
Co • Citare
 ➟ Variabile deCmediu os predefinite
C. 
 .
C - directorul curent

an 

anPWD
D $ VAR1=”ab cd”

a D HOME - directorul gazdă al utilizatorului a 
 curent

13 3
$ VAR2=x

0 $ echo $VAR1
 sm 01
PATH - căile de căutare a comenzilor
sm
)2 Co 2 o
exemplu: /bin:/usr/bin:usr/local/bin

ab cd

) C (afișat înaintea liniei de comandă)

(c C. (c C.
$ echo ”123 $VAR2”
 PS1 - șirul prompter principal
123 x
 PS2 - șirul prompter secundar

an
$ echo ’123 $VAR2’
 n
UID - identificatorulautilizatorului curent

D
123 $VAR2
 a HOSTNAME - numele D calculatorului curent
 a

 3
1echo m 1 3 m
0 s ...

20 s
) 2$VAR1
 Co Co
$ \$VAR1

c c)
( $ echo \$$VAR1
 C. (
mycomputer:~ janedoe$ echo $PS1

C .
an an
$ab cd
 \h:\W \u\$

mycomputer:~ janedoe$ echo $PS2

D D
13 3 #HOME

>

0 1
20
mycomputer:~ janedoe$ echo

) 2 /home/janedoe

)
(c (c
!89 !90

a a
s m sm
➟ Variabile speciale
. Co ➟ ExpandareaCnumelor
.
o de cale (de fișiere)
C C
n
a*,
➞ dupănîmpărțirea liniei în cuvinte, bash caută în fiecare cuvânt
a
D # -@numărul
- parametrii din linia de comandă

a D
caracterele *, ? și [ . 

a e specificat un
3 mde 
 comandă
 ➞3dacă le găsește, consideră că în acele puncte
1 ? - starea ultimei tipar care va fi înlocuit cu o listă de numesm
1
de parametri din linia
0 s 0
Co curent sau al interpretorului curent
 Co
de fișiere care îi
)2 ) 2 corespunde

comenzi efectuate

( c 0 - numele fișierului de comenzi


1, 2, ... - parametrul
.
C n din linia de comandă
 c
( 
 C .
an n șirul vid

* - orice șir de caractere, inclusiv
...
 a
D a
? - un singur caracter

D specificate între parantezele drepte a
3 m 3
sm
[ ... ] - oricare din caracterele
1 s 01
) 20 Co 2
) ls *txt
 C o
(
myscript.sh:

c $ sh myscript.sh 1a
.
C 2 b 3
 (c $a.txt C .
echo $#
 4

a n abctxt txt

$ ls abc?1
 an
echo $@
 1a 2 b 3

D 1a ”2 b” 3
 abcx1 abcd1 abc11
 D
13 3
$ sh myscript.sh
0
$ ls ab[12]x
 1
20
3

1a 2 b 3 2
ab1x ab2x

)
 )
(c (c
!91 !92
a a
m m
➟ ExpandareaCfolosind os acolade os
➟ ExpandareaCcaracterului “~”
C . C .
➞ seamănăan cu expandarea căilor, dar numele rezultate nu trebuie an
D să existe ca fișiere
 a D
3~nume e interpretat ca directorul gazdămalautilizatorului nume

neapărat
1 3sintaxă:
 m 1

0 prefix{expresie}postfix
 o s ➞
s
20➞ ~ e interpretat ca directorul gazdăCaloutilizatorului
)2
curent

c ⇾ expresia poate fi formată din. C c) .
( specificatori de interval (..)
 C
cuvinte separate prin virgulă sau din
( 

C

 a n a n
D a D a
1 3 m $ echo 3
1 ~

m
20 s 20 ~gregory
 s
Co Co
$ echo a{x,y)
 /home/janedoe

ax) ay
 )
$ echo
$(c echo a{x..z}
 . ( c .
C /home/gregory

C
an an
ax ay az

$ mkdir a{1,2,3}x

D D
3
$ (va crea directoarele a1x, a2x, a3x)
1 1 3
) 20 ) 20
(c (c
!93 !94

a a
sm s m
Co
➟ Substituția comenzilor
.
➟ RedirectareaCoieșirii și intrării
C C. pentru redirectarea ieșirii:

an an[n]>cuvânt

➞ formatul general

D construcție sintactică de forma `șira` sau $(șir) , șirul e interpretat


➞ în orice D [n]>>cuvânt
 a
3 o comandă

ca1fiind m 3
1redirectează descriptorul de fișier n spresm
2 0 comanda e executată, iar textul pe careosea ➞ 0 o fișierul cuvânt; dacă n lipsește,

c

C sintactică

) va fi preluat și va înlocui întreaga construcție
.
îl generează la ieșirea standard
c) 2redirectarea C
se face pentru ieșirea standard

.
( ➞ atenție: ` este “accent grav”, nu “apostrof”
C ( ➞ dacă e folosit >>, ieșirea va fi adăugatăC la sfârșitul fișierului (nu va fi
an n
(de obicei pe tasta de lângă “1”)
 suprascris)%
a
D a D a
1 3 m

3
➞ formatul general pentru1 redirectarea intrării:
 m
20 `pwd`
 s 20 s
Co Co n lipsește,
$ echo
)
/home/janedoe/a1x

$(cA=`ls -a`
 .
[n]<cuvânt

c) .
C (
➞ redirectează descriptorul de fișier n spre fișierul cuvânt;
C dacă
$ echo $A

. .. abc myscript.sh xyz 
 a
n redirectarea se face pentru ieșirea standard
an
D D
13 1 3
) 20 $ cat x 1>>fisier 

) 20
(c (c
!95 !96
a a
m m
➟ “Here Documents” C os ➟ Alte facilitățiCbash os
C. C.
an <<word
n
➞ aaliasuri (comenzile interne alias, noalias)

D a D a
1 3 here-document
m 1 3➞ funcții

m
0 delimiter
s 0 s
Co un delimitator
 o TAB)

➞ variabile tablou


c) 2➞ interpretorul va considera word ca. fiind c)2 ➞ C


autocompletarea comenzilor (tasta
.
( ➞ textul dat de liniile here-documentC e preluat și trimis comenzii la intrare
 ( C la login, la logout și la pornirea
➞ istoricul comenzilor (fișierul .bash_history)


an n
➞ pornirea automată de comenzi
➞ delimitatorul arată sfârșitul intrării
 a
➞ dacă în word apar ghilimele D simple sau duble, ele sunt ignorate, dar
a în D .bash_logout, .bashrc)

interpretorului (.bash_profile,
a
nu3 se va face expandare de variabile saum 3 m
...

interiorul here-document 1 1
20 s substituție
20 s
de comenzi

c) . Co c) . Co
( cat <<SFARSIT C ( C
abc a n an
123 D D
x
13 1 3
SFARSIT
) 20 ) 20
(c (c
abc
123
x

!97 !98

a a
s m s m
➟ Expresii condiționale
. Co interne test și [
 ➟ Structuri de Ccontrol
.
o
C
➞ comenzile
for name C [ in word ] ; do list ; done

n pentru a compune expresii logice

➞ folosite
➞avaloarea returnată de comanda condițională e 0 (true) sau 1 (false), a n
D încât poate fi ușor integrată în specificatorii
a 
D
a
1 3 astfel m de condiție (de
13 for m
(( expr1 ; expr2 ; expr3 )) ; do list ; done

0 exemplu la if)

o s 0 o s
)• 2exemple de parametri pentru test și .[:
C ) 2 ➞ se evaluează expr1; expr2. Cse evaluează la fiecare iterație până
➞ expri - expresii aritmetice

c
( -e fișier - true dacă fișierul există
 C ( c ajunge la zero; dacă expr2≠0Cse execută list și se evaluează expr3

-d fișier - true dacă fișierul există
an și este un director
 an
D și este un fișier obișnuit

-f fișier - true dacă fișierul există
a 
 D a
șir1 == șir2 - true dacă șir1
1 3 e identic cu șir2
 m case word in [ [(]
13 pattern [ | pattern ] ... s)m
0 e diferit de șir2
 s list ;; ] ... 0esac

2șir1 Co )2 Co
șir1 != șir2 - true dacă șir1
c
șir1 < șir2 - true dacă ) e, alfabetic, înainte de șir2

. c .
( șir1 e, alfabetic, după șir2

șir1 > șir2 - true dacă C 
 ( C ] ...
arg1 operator arg2 - true dacă arg1 și arg 2 sunt în relația
a n dată de operator
 if list; then list; [ elif list; then list;
[ else list; ] fi
 an
D mic), -gt (mai mare), 

⇾ în care, operator: -eq (egal), -ne (diferit), -lt (mai D
-ge (mai mare sau egal),3-le (mai mic sau egal)
 3
2 01 %
while list; do list; done 20
1
$ [ 1 -eq 2 ]
 c) )
$ echo $?

( %
% (c
1
 until list; do list; done

!99 !100
a a
sm sm
➟ Exemple Co ➟ Exemple Co
C. $ sh script
 case "$1" in C. $ sh service.sh status

an
for (( i=1; i<=4; i++ )) 1 start)
an Service is running

do D a 2 D
/usr/local/myservice -d
a
$ sh service.sh reboot

3 m 3 m
01 01
;; Usage: service.sh {start|
echo $i
s 3
s
Co Co
stop)
)2 )2
done 4 stop|restart}
/usr/local/myservice -x
(c C. (c ;;
C.
an an
status)
for i $ sh script a b c
 if /usr/local/myservice --isrunning 2>/dev/null
do D a a D a
3 m
then
3 m
01 01
echo $i b
s echo Service is running s
)2 Co )2 Co
done c else
( c C. fi ( c
echo Service not started
C.
an an
i=0
$ sh script
 ;;
while [ -f .dotask ]
do D
Starting task: 1 restart) D
13 3
Starting task: 2
(( i++ ))
0
stop
1
20
Starting task: 3
echo Starting task: $i
) 2 Starting task: 4
start
;; )
(c (c
/usr/local/bin/myprogram --start
Starting task: 5
 *)
done
... echo $"Usage: $0 {start|stop|restart}"
exit 1
!101 esac !102

a a
sm Numele interpretorului
sm
Co Co
de comenzi care va rula
acest script ➟ Exemple
C. C.
an an
#!/bin/sh
Primul parametru
D %
a D a
13 3
fact() al funcției
0 sm 1 sm
20
{
)2
Funcție if [ $1 -gt 1 ]
Co ) for i in episode-S02E*avi o
.C
(crecursivă C. (c
then do
nr=`ls "$i" | cut -cC 13-14`
an an
i=`expr $1 - 1`
j=`fact $i` fn=${i%\.*}
D
k=`expr $1 \* $j` a D
mv episode-subtitle-en-2x${nr}*srt "$fn".srt a
3 m echo $nr $fn 3
01
echo $k
s 01 sm
)2 Co 2 o
else done
c ) C
C. (c .
echo 1
( fi C
}
an an
%
D D
13 3
read -p "Numar:" x
0 1
20
fact $x
) 2 )
(c (c
!103 !104
a a
sm m
Co Expresie regulată C os
C. C.
an an
D a D a
3 m 3 m
01 s 0 1 s
)2 Co Co de caractere care descrie
) 2 O expresie formată dintr-o secvență
(c C. c
( un tipar de căutare, folosit pentru
C .
a desemna reguli de
an potrivire pentru porțiunileande text căutate.

D D
Expresii
1 3 regulate în UNIX ma 1 3 m
a
0 os 20 s
) 2 C ) Co
(c C. ( c C .
an an
D D
0 13 1 3
)2 ) 20
(c (c
!105 !106

a a
sm sm
UNIX Co Expresii regulate Co POSIX
C. C .
an n
. - se potrivește cu un singur caracter!
a
D a D
Exemplu: a.x se potrivește cu abx, aax, acx etc.%
a
13 comenzi recunosc expresiisregulate,
m 3 m

0 [ ] 0 1 s
Multe
2 următoarele forme:
 C o de obicei în
2
- se potrivește cu un singur caracter
C o din cele dintre
) )
paranteze!
(c 
 C. c
(Exemple: [abc] se potrivește cu a, b sau c%.
C
➞ POSIX basic (BRE)
 a
n [a..x] - orice caracter între anși x%
a
➞ POSIX extended 3 D
(ERE)% a
%
D
[^ ] - se potrivește cu3un singur caracter în afara celor a dintre
1 sm 1 sm
20 Co 20 cu orice caracter, mai puțin a, b sau Cc%o
paranteze


c) .
Exemple: [^abc] se potrivește
c )
( C [^a..x] - orice(caracter, mai puțin cele dintre a și x!
C.
an n

^ - se potrivește cu poziția de început (de aobicei în linie)

D D
13 Exemplu: ^a înseamnă “caracterul a la început”%
13
20 0
%
) $ - se potrivește cu poziția de sfârșit ) 2 (de obicei în linie)

(c Exemplu: a$ înseamnă “caracterul a la sfârșit”!(c
%

!107 !108
a a
m m
Expresii regulate C osPOSIX Expresii regulate C osPOSIX
C. o subexpresie
 C.
anpotrivește tiparului dintre paranteze poate fi preluată mai târziu folosind an
( ) - definește
Valoarea care se
D
operatorul 3\n . În modul “basic” (BRE), parantezele trebuie a citate: \( și \) .! D a
1 m 

1 3 m
0 s 20modul extins (ERE). Descrie o expresie s
Co Co formată din caracterul care o precede, de
# +!
\n - ) 2referință la subexpresie! Doar) în
c .
Se( potrivește (preia, referă) a n-a subexpresie desemnată între paranteze, unde n ∈ [1, 9].#
C una c
( sau mai multe ori. 
 C .

a n 

a n
*!
D care o precede, de zero sau mai multe a ori. 
 ?!
D o expresie formată din caracterul carea o precede, de
3 m 3
sm
Doar în modul extins (ERE). Descrie
1
Descrie o expresie formată din caracterul
s 01
Exemple: 

20 abbbbx etc. 
 Co
zero ori sau o dată. 

2 o
c )
ab*x se potrivește pe ax, abx,
( vid, a, aa, aaaa, b, bbb, ab, ba, abcc,
[abc]* se potrivește pe șirul .
C abc, aabbcc, aabbcca


 (c
)
C .C
a n n (\n), iar o citare cu \ va
Notă: în modul extins nu sunt valabile referirile către subexpresii
introduce caracterul următor, așa cum e ( \( înseamnă chiar acaracterul ( )
etc.


D D
13 de minim m și maxim n ori. În 3
{m,n}

0 1
Descrie o expresie formată din caracterul care o precede,
modul “basic” (BRE), acoladele trebuie citate: \{ și )\} 2.
 ) 20

 (c (c
!109 !110

a a
sm s m
Exemple Co Comenzi careCrecunosc o expresii regulate
C. grep, sed,
.
C awk
an n
[cm]asa casa masa

a

D a D
Notă: de3obicei, pentru a recunoaște modul extins a
3
^c?are

 01 m
care are (strict la început)

1un parametru special (de regulă -E) sm
(ERE), comenzii trebuie sa i
s 0
Co xare fare ...
 Co
se dea
2
).are sare mare tare
)2
(c 
 C . ( c C .
re are naabre abbre aaarea aabbbre baare
an
[ab]*re ...
 grep -E tipar%
a egrep tipar
are3 D D

aare aaare ... (dar nu “re”)% a 3 a
sm m
a+re
0 1 1 s
o 20 Co
# ls -l | grep -E ^Fisierul\ meu.*txt$

episode\ 2
[123]x.*) episode 1x01 - The Super Hero
 C 
 )
(c episode 1x02 - The Hero Cries% C . ( c
Fisierul meu cu scrisori.txt

C .
an n
episode 3x22 - Hero No More% Fisierul meu preferat.txt%
a
... 

D Fisierul meu cu txt

D
13 ...
1 3
) 20 ) 20
(c (c
!111 !112
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
an an
3. Sisteme D de fișieresma ProgramareaD cu fișiere a
1 3 1 3 m
20 o 20 s
) C ) Co
(c C. ( c C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!113 !114

if((fd1=open(argv[1], O_RDONLY))<0)
{
a a
m
printf("Error opening input file\n");
s sm
Co Co
exit(2);
} Aplicații
C.
if((fd2=open(argv[2], O_WRONLY | O_CREAT |
C.
an an
O_EXCL, S_IRWXU)) < 0)
D {
a D Library API
a
13 13
printf("Error creating destination file
sm sm Servicii sistem
20 20
\n");
) exit(3);
Co ) Funcții de bibliotecă
C o
(c C. (c C.
}

an
while((n = read(fd1, &c, sizeof(char))) > 0) Sistem de an
{ D a D 
 Funcții sistem a
3 m 3 m
01 operare#1
if(write(fd2, &c, n) < 0)
s 20 Fișier #Proces Pipes ... Co s
)2 Co
{
c )
C. (c C.
printf("Error writing to file\n");
(
exit(4);
}
an an
}
D Hardware# D
13 13
#
if(n < 0)
2 0 0
)2
Memori #
{
) I/O Stocare ...
(c
printf("Error reading from file\n");
exit(5);
# (c

}
!115 !116
close(fd1);
close(fd2);
a a
m m
Lecția de englezăC os Lecția de engleză. C os Și de română
C. C.
an an
D a D a
0 13 sm 0 1 3
sm
)2 Co )2 Co
(c C. ( c C .
an a n
D a D a
3 m 3 m
01 s 01 s
c)2 Co ) 2 Co
( C. (c C.
an an
D D
0 13 13
) 2 ) 20
(c (c
!117 !118

a a
sm sm
Lecția de engleză.
. Co Și de română Lecția de engleză.
. Co Și de română
C C
an an
D a D a
Library
1 3 - noun, 
 m or

Library
1 3 - noun, 
 m or

0
: a place
2 s
in which literary, musical,oartistic, 0
: a place
2 s
in which literary, musical,oartistic,
c)
reference
(recordings, C .C
materials (as books, manuscripts,
 c)
reference
(recordings, .C
materials (as books, manuscripts,

C
or films) are keptnfor use but not for sale
 or films) are keptnfor use but not for sale

a a
: a collection resembling or D suggesting a library a : a collection resembling or D suggesting a library a
1 3 The Free Merriam-Webster dictionary, www.m-w.com
m 1 3 The Free Merriam-Webster dictionary, www.m-w.comm
Librărie - substantiv,
20
s Librărie - substantiv,
20
s
c) vând cărți. . Co c) vând cărți. . Co
: Magazin în care (se C : Magazin în care (se C
n ediția 1998
Dicționarul explicativ al limbiiaromâne, Bibliotecă - substantiv,
 an
D : Instituție care colecționează cărți, periodice D
1 3 1 3 etc. spre a le
20 20 imprimate etc.
pune în mod organizat la dispoziția cititorilor

) )
(c (c
: Colecție de cărți, periodice, foi volante,
Dicționarul explicativ al limbii române, ediția 1998

!119 !120
a a
m m
Lecția de engleză. C os Și de română Lecția de engleză. C os Și de română
C. C.
an an
D a D a
Library
1 3 - noun, 
 m 1 3 m
0 o s 20 s
Coare 

: a place in which literary, musical, artistic, or
 Bookstore - noun, 

) 2 C : ca) place of business where books
(c C. use but not for sale
 .
reference materials (as books, manuscripts,

recordings, or films) are keptnfor
(
the main item offered for salen —called C also bookshop
a aThe Free Merriam-Webster dictionary, www.m-w.com
: a collection resembling or D suggesting a library a D a
1 3 m 1 3 m
Librărie - substantiv,
20
s 20 s
Co Co
The Free Merriam-Webster dictionary, www.m-w.com

c )
: Magazin în care (se vând cărți. . c) .
C ( C
Bibliotecă - substantiv,
 an Librărie - substantiv,

an
: Instituție care colecționează cărți, periodice D : Magazin în care se vând cărți. D
1 3 etc. spre a le 1 3
20 imprimate etc. 20 al limbii române, ediția 1998
pune în mod organizat la dispoziția cititorilor
 Dicționarul explicativ
) )
(c (c
: Colecție de cărți, periodice, foi volante,
Dicționarul explicativ al limbii române, ediția 1998

!121 !122

a a
sm sm
Co Co
C. C.
“False Friend”
Library ≠ Librărie ! Library ≠ Librărie !
an # an #
D a D a
13 m
Library = Bibliotecă

13 m
Library = Bibliotecă

20 s 20 os
) . Co ) . C
(c C (c C
an an
D a D a
3 m 3 m
01 s 01 s
) 2 Co )2 Co
(c C. ( c C.
an an
D D
0 13 13 nu vă ajutați singuri să
Concluzie:
0
) 2 ) 2 ridicoli... ;)
deveniți
(c (c
!123 !124
a a
sm m
Co Funcții sistemCpentru os lucrul cu fișiere
Aplicații
C. .
C char *pathname, int oflag, [, mode_t mode]);
an an
int open(const
D Library API
a •
D
pathname - numele fișierului#
a
UNIX:13 m 3 m
• oflag - opțiunile de deschidere a fisierului. Este un șir de biți. Există constante în fcntl.h care se pot combina folosind operatorul '|' , de exemplu::#

s Servicii sistem 1 s
◦ O_RDONLY - deschidere numai pentru citire#

man20 o 0
)2 Co
◦ O_WRONLY - deschidere numai pentru scriere#

) 3 funcție Funcții de bibliotecă


C ◦ O_RDWR - deschidere pentru citire si scriere#

( c C. ( c .
◦ O_APPEND - deschidere pentru adaugare la sfarsitul fisierului#

C
◦ O_CREAT - crearea fisierului, daca el nu exista deja; daca e folosita cu aceasta optiune, functia open trebuie sa primeasca si parametrul mode.#

an
 Funcții sistem man 2 funcție n


◦ O_EXCL - creare "exclusiva" a fisierului: daca s-a folosit O_CREAT si fisierul exista deja, functia open va  returna eroare#
UNIX:
Sistem de a
◦ O_TRUNC - daca fisierul exista, continutul lui este sters#

D a

D a
mode - doar la creare - drepturile de acces asociate fisierului. Constante:#

operare#1 3 m 1 3
◦ S_IRUSR - drept de citire pentru proprietarul fisierului (user)#
m
s s
◦ S_IWUSR - drept de scriere pentru proprietarul fisierului (user)#

20 Fișier #Proces Pipes ... Co 20 Co


◦ S_IXUSR - drept de executie pentru proprietarul fisierului (user)#

) )
◦ S_IRGRP - drept de citire pentru grupul proprietar al fisierului#

(c C. c .
◦ S_IWGRP - drept de scriere pentru grupul proprietar al fisierului#
( C
◦ S_IXGRP - drept de executie pentru grupul proprietar al fisierului#

an an
◦ S_IROTH - drept de citire pentru ceilalti utilizatori#
◦ S_IWOTH - drept de scriere pentru ceilalti utilizatori#

Hardware# D D
◦ S_IROTH - drept de executie pentru ceilalti utilizatori


0 13 Returnează un descriptor de fișier 1 3


I/O
Memori #
)2
Stocare ... int creat (const char *pathname, mode_t
) 20 mode);

# (c int close (int filedes);

(c
!125 !126

a a
Gestiunea fișierelor deschise
sm sm
Funcții sistemCpentru o lucrul cu fișiere o
➞ descriptorii de fișier în sistem - numere naturale 1..n, n depinde de sistem

C
C . C.
➞ un descriptor inițializat desemnează un fișier deschis; după închidere, numărul
(descriptorul) poate fi refolosit

an an
➞ fiecare proces deține câte o tabelă care conține descriptorii deschiși
D a D a
1 3 m 1 33 m
0 s 20 s
Descriere fișier deschis 1

)2 # Co Co
Descriptori de fișier standard:# i-node
)
4 - poziție curentă

( c STDIN_FILENO C . (c
Proces 1
5 dup()
C.
- moduri de acces setate
 (fișier distinct pe disc)

STDOUT_FILENO a n 6 - ...
an
D D
7
STDERR_FILENO
3 a 3 curentă

Descriere fișier deschis 2
 a
01 sm 5 fork()
0- 1poziție sm
) 2 Co 6
) 2 - moduri de acces setate
 Co
(c C. (c C.
Proces 2
7 - ...

an an
8
Descriere fișier deschis 3

D - poziție curentă
 D (fișier distinct pe disc)
3 13
01
3
- moduri de acces setate

20
i-node
)2
Proces 3 4
- ...
)
(c (c
5

Per proces, tabele
 Globală, în sistem, 
 Copie i-nod în memorie #


de descriptori tabela fișierelor deschise (detalii despre i-nod, mai târziu)
!127 !128
a a
sm m
Co ssize_t read(int
C os fd, void *buff, size_t nbytes)
C. C.un număr de exact nbytes octeți de la poziția curentă

an n
→citește
→îiapune în zona de memorie indicată de buff

D a D
3 m 3→returnează numărul de octeți citiți demfapta (0 la sfârșit) sau -1 la eroare
01 s 20
1
os
)2 Co ) buff
C
(c C. (c C.
➞ un apel open() creează 

- un nou descriptor

an
- o nouă descriere de fișier deschis an
D a D a
3 m 3 m
01 1 nbytes
s 20
date

s
)2 Co Co
de pe disc
c c)
( C. ( C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
Ce se întâmplă dacă buffer-ul nu e alocat corect ?

!129 !130

a a
s m sm
ssize_t write(int
. Co fd, void *buff, size_t nbytes) Co
→scrie C C.
n pe disc primii exact nbytes octeți din buffer

→îiapune în zona de memorie indicată de buff# an
off_t lseek(int fd, off_t offset, int pos)
D a D a
Poziționează indicatorul la deplasamentul offset in fișier, astfel:#
1 3 m 13 m
• dacă pos = SEEK_SET, poziționarea se face relativ la începutul fișierului#
0 s 20 s
)2 Co Co
• dacă pos = SEEK_CUR, poziționarea se face relativ la poziția curentă#
buff
. )
c (c C.
• dacă pos = SEEK_END, poziționarea se face relativ la sfârșitul fisierului#
( C
an date care an
int mkdir(const char *pathname, mode_t mode)
D a # D a
1 3 vor fi scrise
m 3 m
01
nbytes
20 s int rmdir(const char *pathname)
s
Co Co
pe disc

c) . c)2
( C ( C.
an an
D D
13 13
) 20 ) 20
(c (c
Ce se întâmplă dacă buffer-ul nu e alocat corect ?

!131 !132
a a
m m
Funcții de bibliotecă C os pentru lucrul cu fișiere Funcții de bibliotecă
C os pentru lucrul cu fișiere
FILE *fopen(const C. char *filename, const char *mode); C.
#
a n an
int fclose(FILE D *stream);
a D a

 3 m *format, ...); 
 3 m
int01fprintf(FILE *stream, const char s 0 1 s
2 o o
c )int . C c)2 Descriptori de fișier standard:#C
.
( C
fscanf(FILE *stream, const char *format, ...); 
 ( #
C

size_t fread(void *ptr, size_t a n size, size_t nmemb, FILE
stdin
stdout a n
*stream); 
 D a D a
3
citește din fișierul indicat de 1stream un număr de nmemb elemente, s m
stderr
1 3 m
0 în zona de memorie indicată de ptr.
 o fiecare de
20 s
dimensiunea size, și le pune
) 2
.C ) Co

 (c
size_t fwrite( void *ptr, size_t size, size_tCnmemb, FILE
( c C .
*stream); 
 an an
D D
13indicată de fiecare
scrie în fișierul indicat de stream un număr de nmemb elemente, de
1 3
20 20
dimensiunea size, pe care le ia din zona de memorie ptr


) )
(c (c
!133 !134

a a
s m sm
Aflarea informațiilor
. Co despre fișiere (apeluri sistem) Funcții de bibliotecă
. Co pentru lucrul cu directoare
C char *file_name, struct stat *buf); C
int stat(const

 a n a n
DIR *opendir(const char *name);
D a D dirent *readdir(DIR *dir);a
struct
3
int fstat(int filedes, struct stat *buf);
m 3 rewinddir(DIR *dir);

0 1 s 0 1void sm
int2 lstat(const char *file_name, o 2 int closedir(DIR *dir);
 o
) . C struct stat *buf);
 ) 
 .C
(
 c C (c /*Linux*/
 C
an n
struct stat

ad_ino;
struct dirent {
{
ino_t /* inode number */
dev_t
D
st_dev; /* device */
a off_t D d_off;
/* length of this record */a
/* offset to the next dirent */
ino_t
3
st_ino; /* inode */
m 3
1 unsigned 1
sm */
unsigned short d_reclen;
s
umode_t st_mode; /* protection */

20 0 char d_type; /* type of file; not supported

Co o
nlink_t st_nlink; /* number of hard links */
uid_t
)
st_uid; /* user ID of owner */
char ) 2 by all file system types
d_name[256]; /* filename C */
gid_t
dev_t
off_t ( c st_gid;
st_rdev;
st_size;
/*
/*
/*
.
group ID of owner */

C
device type (if inode device) */
total size, in bytes */
}; (c C .
an an
unsigned long st_blksize; /* blocksize for filesystem I/O */
unsigned long st_blocks; /* number of blocks allocated */
time_t st_atime; /*
D
time of last access */
D
time_t st_mtime; /*
3
time of last modification */
1 1 3
20 20
time_t st_ctime; /* time of last change */
};


) )
(c (c
!135 !136
a a
sm s m
Co Un exemplu Co
C. C.
an
• int link(const char *oldpath, const char *newpath); - creeaza
an
D
legaturi fixe spre fisiere
a D a
3 m
• int symlink(const char *oldpath, const char *newpath); - 3program care copiază un fișier cu numele m
01 s 1 s
➞ dat ca argument în
0linia de comandă într-o destinație (fișier)o specificată de asemenea
Co
creeaza legaturi simbolice spre fisiere sau directoare
)2
• int unlink(const char *pathname); - sterge o intrare in ) 2
.C
(c C. (c ca argument

➞ sunt afișate mesaje de eroare C
director (legatura, fisier sau director)
când e nevoie
an an
• int rename(const char *oldpath, const char *newpath); -
redenumire / mutare de fisiere
D a D a
3
• int rmdir(const char *pathname); - stergere de directoare
m 3 m
01
• int chdir(const char *path); - schimbarea directorului curent s 20
1 s
)2 Co Co
• char *getcwd(char *buf, size_t size); - determinarea
c c)
( C. ( .
directorului curent
C
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!137 !138

a a
/*** Deschiderea fisierelor */

sm { sm
if((fd1=open(argv[1], O_RDONLY))<0)

Co Co
#include <stdio.h>
#include <sys/types.h> printf("Error opening input file\n");
#include .<sys/stat.h>
C.
exit(2);
C <fcntl.h>
#include }

a n <unistd.h>

#include
an
if((fd2=open(argv[2], O_WRONLY | O_CREAT | O_EXCL, S_IRWXU)) < 0)

#D D
{

3
#include <stdlib.h>
a 3 a
printf("Error creating destination file\n");
1 void usage(char *name) sm 1 exit(3);
sm
) 20 {
Co ) 20 }
Co
(c } .
printf("Usage: %s <source> <destination>\n",
C
name);
(c C.
while((n = read(fd1, &c, sizeof(char))) > 0)

n an
# {
int main(int argc, char a *argv[]) if(write(fd2, &c, n) < 0)
{ D a {
D a
1 3 m 3
printf("Error writing to file\n");
m
01
int fd1, fd2;

20 s exit(4); s
Co )2 Co
int n;
}
char c;
c) . c C.
}
(
/*** Verificarea C */
argumentelor din linia de comanda # (
if(argc!=3)
a n if(n < 0)
{ an
{
D printf("Error reading from file\n"); D
13 3
usage(argv[0]);

0
exit(5);
1
20
exit(1);

)2
} }
)
(c (c
#
close(fd1);
close(fd2);

return 0;
!139 } !140
a
/*** Deschiderea fisierelor */
a
{ sm
if((fd1=open(argv[1], O_RDONLY))<0)
sm
Co
printf("Error opening input file\n");
Co
C. C.
exit(2);
}

an an
if((fd2=open(argv[2], O_WRONLY | O_CREAT | O_EXCL, S_IRWXU)) < 0)

D D
{

3 a
printf("Error creating destination file\n");
3 a
01
exit(3);
sm 01 sm
)2 Co ? )2 Co
}

(c C.
while((n = read(fd1, &c, sizeof(char))) > 0) (c C.
an an
{
if(write(fd2, &c, n) < 0)
{
D a O mică modificare D a
3
printf("Error writing to file\n");
m 3 în program... m
exit(4);
01 s 20
1 s
)2 Co Co
}
c )
C. (c C.
}
# (
an an
if(n < 0)
{
printf("Error reading from file\n"); D D
exit(5);
0 13 13
}
) 2 ) 20
close(fd1);
close(fd2);
(c (c
return 0;
} !141 !142

a a
/*** Deschiderea fisierelor */
#include
sm
<stdio.h>
{ sm
if((fd1=open(argv[1], O_RDONLY))<0)

Co Co
#include <sys/types.h>
#include <sys/stat.h> printf("Error opening input file\n");

C. C.
#include <fcntl.h> exit(2);
#include <unistd.h>
 }

an an
#include <stdlib.h> if((fd2=open(argv[2], O_WRONLY | O_CREAT | O_EXCL, S_IRWXU)) < 0)

D D
# {
a a
13# 3 printf("Error creating destination file\n");
m m
#define BUFSIZE 4096
s 1 exit(3);
s
) 20 void usage(char *name)
Co ) 20 }
Co
(c C. (c C.
{
printf("Usage: %s <source> <destination>\n", name); while((n = read(fd1, buf, BUFSIZE)) > 0)

an an
} {
# if(write(fd2, buf, n) < 0)
D
int main(int argc, char *argv[]) a {
D a
3 m 3
printf("Error writing to file\n");
m
01 01
{
s exit(4); s
)2 Co )2 Co
int fd1, fd2;
int n; }

( c
char buf[BUFSIZE];
C. #
}
( c C.
an an
/*** Verificarea argumentelor din linia de comanda */ if(n < 0)
{
if(argc!=3)
D printf("Error reading from file\n"); D
13 3
{

0
exit(5);
1
20
usage(argv[0]);
exit(1);
) 2 }
)
(c (c
}
# close(fd1);
close(fd2);

return 0;
!143 } !144
a a
m m
date; C os
./copyfile2 beethoven-symph-5-1.wav b.wav; date Mici chestiuni Cde os C și de... bun simț
C. C.
an read(fd1, n
char buf[BUFSIZE];
a buf, BUFSIZE); #
D a
Dimensiunea buffer-ului
 #
D a *buf;
char
3
Dimensiunea
1
fișierului
m Timp de copiere #
1 3 buf, sizeof(buf)); m
20
(octeți)
s 
 20
read(fd1,
os
) Co ) C
(c C. 1 (c # C.
read(fd1, buf, strlen(buf));


?
74 MB 6 minute 30 secunde
an an
#
#
D a int v;
 D a
3 m 3 m
01 1
...

74 MB 100
s
3 secunde
20 s
)2 Co Co
read(fd1, &v, sizeof(int));


c c)
( C. 1 secundă ( C .
an an
74 MB 4096 ...

D /*citesc fișierul de pe disc*/
D


#

13 13
0
!
read(fd1, buf, dimensiune_fisier);

2 0
)2
#
)
(c (c
...

Notă: în plus, chiar și simpla apelare a unei funcții sistem costă timp. Nu abuzați.

!145 !146

a a
sm s m
Co Organizarea spațiului Co pe disc
C. C .
an an
D a D a
13 m 1 3 m
20 s 0 s
Co
➞ Un disc este format, la nivel logic, dintr-oosuccesiune de sectoare

) ) 2Dimensiunea sectorului e fixă și depinde C de tipul discului. Exemplu: hard disc
(c C. c C. bytes


( “obișnuit” 512 bytes, hard disc nou: 4096
an ➞ Discul poate fi împărțit în partiții n
a
D
Sisteme de fișiere a D a
1 3 m 1 3 m
20 s 20 s
) Co zonă cu 

) Co3 Spațiu

(c C.
informații 

( c
Partiția 1 Partiția 2 .
Partiția
C liber
an n
structurale
a
D Exemplu de disc partiționatD
0 13 0 13
) 2 )2
(c (c
!147 !148
a a
m m
Scheme de partiționare
C os MBR Co
s
C. C.
an în funcție de tipul discului, al calculatorului, al
• Diferă an
Boot sector

D
sistemelor de operare instalate etc.# a D a
→ o regiune de pe un disc, de obicei la începutul acestuia, care conține, printre
1 3 m 3 m
0 o s 01 s
altele, un cod executabil pe care firmware-ul unui sistem de calcul îl poate încărca și

) 2 • Cele mai populare scheme . Cde )2 Co


lansa în execuție, ca punct de start al procedurii de inițializare a sistemului respectiv

c (c C.
partiționare:#
( C
→ codul executabil va încărca, la rândul lui un alt program de pe acel disc, de obicei

anRecord)
 an
o componentă de inițializare și încărcare a sistemului de operare

• → este schema clasică


MBR (Master D
Boot a D a
1 3 de partiționare, întâlnită pe, practic,mtoate 3 m
PC-urile în uz2# 0 s Master Boot Record

01 s
c) . Co c) 2noastre)

→ un tip special de sector
Co IBM PC (cu
de boot, specific calculatoarelor compatibile
.
( C (
o evoluție până în zilele
→ conține, pe lângă programul încărcător, informații despreC
• GPT (GUID Partition Table)
 a n an
partițiile de pe disc
→ noua schemă de partiționare pentru PC-uri,D mai flexibilă D
3 3
2 01 20
1
) )
(c (c
!149 !150

a a
sm sm
MBR Co GPT Co
C.
Schema de partiționare
 C.
an
→ Informațiile despre structura partițiilor se găsesc într-o tabelă de partiții, aflată în an
D a D a
MBR

1 3 m 13 parte din standardul UEFI (United sm
Descriere

20 s
→ Tabela de partiții are maxim 4 intrări, deci permite definirea a maxim 4 partiții,
0
→ Face
) numite partiții primare

Co 2
)pentru
Extensible Firmware Interface), propus
C o
(c C. ( c .
→ O partiție din cele 4 poate fi desemnată ca fiind partiție extinsă, caz în care
→ Utilizează GUIDs (Globally unique C
înlocuirea PC BIOS


an an și a
scopul acesteia e să conțină alte partiții în interiorul ei


D a D
identifier) pentru identificarea discului
a
3 m 13 arbitrar de
tipurilor partițiilor, pentru a evita duplicate

m
01 s → Permite crearea unui număr 0 s
c)2 . Co Spațiu
 partiții (dependent doar de
) 2 dimensiunea
spațiului alocat pentru(ctabela de partiții)
Co
C.
Partiție
MBR
(
Partiție primară Partiție extinsă
C
primară liber
an an
Exemplu de disc partiționat MBR D D
0 13 13
) 2 ) 20
(c (c
sursa: Wikipedia

!151 !152
a a
m m
Sistem de fișiere C os Exemple de sisteme C os de fișiere
C. C.
Modul D
an FAT16 (File an Allocation Table, 16 bit)

de organizare logică a datelor pe un suporta fizic sau virtual, în vederea → Specific D MS-DOS, Windows. Fișierele au nume a de maxim 8+3 caractere.
1 3 citirii și regăsirii acestora m 1 3 maximă a volumului (partiției): m
os os
stocării,
20 
 20
Dimensiunea 2 GB / 4GB (Win NT)


) C ) C
(c → Pe un calculator pot fi instalate mai C.multe sisteme de fișiere, de exemplu pe (c FAT32

→ Windows. Nume de fișiere mai lungi. C. Dimensiunea maximă a volumului: 8 GB.
discuri sau pe partiții diferite
 anși recunosc tipuri de sisteme de fișiere care le Dimensiunea maximă a unui fișier: an4 GB.

→ Sistemele de operare definesc D a D a
1 3 m

1 3 m
sunt specifice

s
20pot recunoaște mai multe sisteme de Cfișiere,
o chiar și dacă
NTFS

20 Dimensiune maximă a fișierului: 16 s
CoTB (<=Win7),
→ Sistemele de operare → Windows NT și succesorii.
c) . c) .
→ Un sistem de fișiere( definește atât structurile de date careC stochează informații,
nu le sunt caracteristice
 256 TB (Win8). Sistem
( de fișiere cu jurnalizare.

C
cât și modul logic de organizare a acestora (de exempluan an

ca ierarhie de fișiere și HFS Plus

directoare)
 D → Specific OS X. Dimensiune maximă a volumului: 8D
13 3 EB . Dimensiune maximă a
*

0 1
20
*
fișierului: 8 EB . Sistem cu jurnalizare.

)2 )
(c * (c = 10 bytes = 10 gigabytes
1 exabyte18 9

!153 !154

a a
s m sm
Exemple de sisteme
. Co de fișiere Sisteme de fișiere
. Co suportate de sistemele de operare
C C
an an
D
Ext23- Second Extended File System
 a D a
1 m 2-32 TB. Dimensiune maximă a 1 3 m
→0Specific Linux. Dimensiune maximă a volumului: s 0 s
2 Co 2 FAT, NTFS, exFAT
 Co
Windows

c) fișierului: 16 Gb - 2 TB 

. c)→ .
( 
 C ( 
 C
Ext3 - Third Extended File System

a n Linux

a n
D
→ Specific Linux. Dimensiune maximă a volumului: 2-32 TB. Dimensiune maximă a
fișierului: 16 Gb - 2 TB. Este3un sistem de fișiere cu jurnalizare.
 a DFile System)

→ Zeci de sisteme de fișiere. Exemple: ext2, ext3, ext4, XFS, FAT, NTFS, HFS+,
a
1 m 1
JFFS, JFFS2 (Journaling Flash3 m
20File System
 s 20 s
Co Co

 

Ext4 - Fourth Extended
c) . OS X

c ) .
(
→ Specific Linux. Dimensiune *
C
maximă a volumului: 1 EB . Dimensiune maximă a → HFS+, UFS, FAT,( NTFS (read only)
 C
fișierului: 16 TB. Este un sistem de fișiere cu jurnalizare.
 n
a an
D D
3 3
01
1 exabyte =210 bytes = 10 gigabytes 20
1
) )
* 18 9

(c (c
!155 !156
→ Pe un calculator pot fi instalate mai multe sisteme de
a a
m
fișiere, de exemplu pe discuri sau pe partiții diferite

s m
Co Organizarea ierarhică
C os a unui sistem de fișiere
# fdisk /dev/sda
C. C .
an an
#
The number of cylinders for this disk is set to 30401.
D a
There is nothing wrong with that, but this is larger than 1024, D / arbori de directoare și a fișiere

01
3
and could in certain setups cause problems with:
sm • 01Arbore
3
s msingură
)2 Co 2 ➞ DOS/Windows: mai mulți arbori (câte o o rădăcinărădăcină:
1) software that runs at boot time (e.g., old versions of LILO) ➞ UNIX: un singur arbore de directoare (o / )

2) booting and partitioning software from other OSs
) C
(c C. C. \ se referă la rădăcina discului curent)#
(c partiție: A:\, B:\, C:\, D:\, ... Construcția
pentru fiecare disc/
(e.g., DOS FDISK, OS/2 FDISK)

an an
#
Command (m for help): p
#
1 3
D
Disk /dev/sda: 250.0 GB, 250059350016 bytes m
a • ➞ prin nume de căi absolute:
Fișierele pot fi
1 3
D
referite

m
a
0 s 0

s
) 2 * 512 = 8225280 bytes Co o
UNIX: /usr/bin/ls, 2
255 heads, 63 sectors/track, 30401 cylinders
/home/jane/myscript, /jome/jane/my\ files/file1

Units = cylinders of 16065
c c) CGame”

( C. ( .
Windows: C:\Windows\wordpad.exe, “D:\games\My Super
Disk identifier: 0xd42ad42a
➞ prin nume de căi relative la directorul curent:
 C
anId UNIX: myscript, “my files/file1”, .ssh/known_hosts
an
#
Device Boot Start End Blocks System
/dev/sda1 * 1 4476 35953438+ D 7 HPFS/NTFS Windows: wordpad.exe, “My Super Game\startgame.exe”%D
/dev/sda2 29095 30400 10490445
0 13 7 HPFS/NTFS
1 3
/dev/sda3
/dev/sda5
4477
4477
29094
6428 ) 2
197744085
15679408+
5
83
Extended
Linux ) 20
/dev/sda6
/dev/sda7
6429
6696
6695
29094
(c2144646
179919936
82
83
Linux swap / Solaris
Linux
(c
!157 !158

a a
sm sm
. Co
Directoare “consacrate” în UNIX Co
Directoare “consacrate”
.
în Windows (NT, ..., 8):
C C
an esențiale, apelabile și când e montat doar sistemul de fișiere rădăcină # an
/ - directorul rădăcină
/bin - comenzi
D a D a
3
/dev - dispozitive
/etc 1- configurări sistem m 1 3 m
0
2 - directoarele gazdă ale utilizatorilorCo s 0 s
)
/home
) 2 D:\ - directoare rădăcină Co
c C. nucleu
(/lib - biblioteci sistem esențiale și module c
(C:\Windows - fișierele sistemului de operare.
C:\,
C #
anpt. administrare) an și biblioteci sistem pe 16 biți
/opt - directoare pentru aplicații suplimentare
C:\Windows\System - fișiere sistem
D
/sbin - executabile sistem (exclusiv
a Dsistem și biblioteci sistem pe 32 sau 64abiți
3
/tmp - fișiere și directoare temporare
1 m
C:\Windows\System32 - fișiere
3
1 sistem și biblioteci sistem pe 32 bițism
20
/usr - baza unei ierarhii importante s
o în sistem#
de organizare a fișierelor accesibile
C:\Windows\SysWOW64 - fișiere
2 064 biți (WOW = Windows on Windows)o
pentru aplicații
/usr/X11 - sistemul de) ferestre X11 C c)
pe 32 biti când sistemul e pe
C (NT, 2000, XP)
/usr/X11R6 - sistemul (c de ferestre X11R6 C. C:\Documents and (Settings .
- directoarele gazdă ale utilizatorilor
C:\Users - directoarele gazdă ale utilizatorilor (Vista, 7, 8) C
/usr/bin - utilitare, comenzi apelabile de utilizatori
an C:\Temp, C:\Windows\Temp - fișiere și directoare temporare an
/usr/lib - biblioteci de programare D D
/usr/local - aplicații locale
0 13 0 13
/usr/local/bin - executabile locale 2 )2
/usr/share - date independente de arhitectură
( c) (c
/var - fișiere de date variabile: poștă electronică, jurnale (log-uri), cache-uri etc.

!159 !160
a a
Exemplu de montare
m m și demontare
Montarea sistemelor C os de fișiere (UNIX) Discul sda
C os
.
C calculator pot coexista mai multe .
C Partiția 1
 Partiția 2
 Partiția 3
 Partiția 4

• Pe același
an an /mnt/windows /home swap /
D
sisteme de fișiere
 a D a
➞3pe diferite discuri, partiții, dispozitive de
1 m 3 m
0 s stocare, în memorie etc.#
01 s
) 2 Există o singură rădăcină Code arbore de directoare 
 )2 Co
$ mount -t ntfs /dev/sda1 /mnt/windows

c
( • C . (c dispozitiv
C. punct de

a n an
D a sau D
$ umount /dev/sda1
a
1 3 m 13 m
➠ Un sistem de fișiere 0 poate fi montat în orice s
director
o
din 0
$ umount /mnt/windows
s
arborele de fișierec)existent
2
.C c)2 Co
(
➠ Primul sistem de fișiere montat e sistemul C (
Fișierul de configurare /etc/fstab C.
a n de fișiere ➞ specifică sisteme de fișiere cu puncte prestabilite de montare
 an
rădăcină, montat automat la inițializare,Dîn directorul /
 D
➞ dacă nu se specifică altfel, ele vor fi montate automat la inițializare

0 13să conțină toate fișierele 13


20
➠Sistemul de fișiere rădăcină trebuie /dev/sda3 swap swap defaults 0 0
)2 /dev/sda4 / ext3
) acl,user_xattr 1 1
și directoarele esențiale funcționării (c sistemului de operare /dev/sda2
/dev/sda1
/home
/mnt/windows
ext3
ntfs
(c acl,user_xattr
user,noauto
1
0
2

0

!161 !162

a a
s m s m
Utilizatori și drepturi
. Co
de acces • Pentru fișiere . Co
sunt setate drepturi de acces pentru trei
C categorii C defișierului:
utilizatori

a n n
➞ proprietarul
care l-aacreat, dar poate fi și altul

user, u -- utilizatorul care deține fișierul; de regulă e cel
• 1Utilizatori

D
➞3pe același sistem UNIX pot să existe mai
a
m mulți utilizatori

D
➞ 3grupul proprietar al fișierului: group, g a-- fiecare fișier poate fi deținut de un
0 s 1
0grup; implicit e grupul proprietarului, daropoate sm fi schimbat

Co asupra căruia e proprietar

) 2 ➞ fiecare utilizator are un director gazdă, 2
➞ fiecare utilizator are un nume și un identificator numeric (uid)

c . ) ➞ ceilalți utilizatori: others, o% . C
( C în fișierele /etc/passwd și /etc/shadow#
➞ configurarea utilizatorilor se face
(c C
an • Există trei tipuri de drepturi a n pentru fișiere:

• Grupuri
 D a ➞ citire: read, r -- conținutul Dfișierului poate fi citit
 a
1 3 m 1 3 m
0
➞ utilizatorii sunt grupați în grupuri
 s ➞ scriere: write, w -- conținutul fișierului poate fi modificat

s
0x -- fișierul poate fi lansat în execuție; pentru
➞ un utilizator poate2aparține mai multor grupuri

Co ) 2 în directorul respectiv#
o directoare
➞ execuție: execute,
c) . arată că se poate c C
( ( C.
intra
➞ configurarea grupurilor se face în fișierul /etc/group# C
➞ grupurile au fiecare câte un nume și un identificator (gid)


an • Combinația acestor elemente se concretizează an în 9


D D
0 13 drepturi, codificate în 9 biți de acces
0 13 (file mode bits):
)2 r w x r w x r) 2w x
(c user
c
group ( others

!163 !164
a
Exemple. Comenzile a
m chmod, chown și chgrp m
$ ls -l
total 4 C os Structura unuiCsistem os de fișiere UNIX
C.
-rw-r--r-- 1 danc users 0 2013-10-23 23:54 file1
C .
an n
-rw-r--r-- 1 danc users 5 2013-10-23 23:54 file2.txt
$ chmod a+x file1 ; ls -l a
D a ➠OD partiție UNIX poate conține:
a
3
total 4
m 3 m
01
-rwxr-xr-x 1 danc users 0 2013-10-23 s 23:54 file1
0 1 s
)2
-rw-r--r-- 1 danc users 5 2013-10-23
Co 23:54 file2.txt

) 2 Bloc Co
(c C. ( c .
$ chmod g-rw file1 ; ls -l

total 4 de Superbloc Noduri index C Conținut (fișiere și directoare)
an
-rwx--xr-x 1 danc users 0 2013-10-23 23:54 file1 boot
a n
D
-rw-r--r-- 1 danc users 5 2013-10-23
a
23:54 file2.txt
 D a
3 m 3 m
01 1
$ chmod 766 file2.txt ; ls -l

s 20- programele care realizează încărcarea s
)2 Co Cosistemului de operare
total 4
-rwx--xr-x 1 danc users 0 2013-10-23
c 23:54 file1
. c
• Blocul de boot (încărcare)) .
(
-rwxrw-rw- 1 danc users 5 2013-10-23
C
23:54 file2.txt
 Unix.# ( C
an • Superblocul - contine informații generale despre sistemul denfișiere de pe disc: începutul
$ chown jane.users file1 ; ls -l

total 4 a
D file1 zonelor următoare, începutul zonelor libere de pe disc.# D
-rwx--xr-x 1 jane users 0 2013-10-23
1323:54 13propriu-zise.
• Zona de noduri index - conține câte o intrare pentru fiecare fișier (în sens larg) din partiție#
-rwxrw-rw- 1 danc users 5 2013-10-23
0 23:54 file2.txt

0
)2 )2
$ chgrp staff file2.txt ; ls -l
 • Ultima zonă conține blocurile care memorează fișierele
total 4

-rwx--xr-x 1 jane users 0 2013-10-23
(c 23:54 file1
(c
-rwxrw-rw- 1 danc staff 5 2013-10-23 23:54 file2.txt

!165 !166

a a
s m ➠ Nod index (i-node) s m
Comemorate fișiere și directoare, într-o organizare o 

➠ Pe disc sunt
. C
C.
→ conține informații despre un anumit fișier de pe disc
C arbore)#
ierarhică (de
an • nidentificatorul utilizatorului: uid (user-id.). Identifica proprietarul
a
D a D• fisierului# a
3
➠1Directorul este un fișier special s- m 13 • identificatorul m sunt de trei tipuri (r-read,
de grup al utilizatorului#
0 un tabel în care fiecare intrare
0 s
Co respectiv:
) 2descrie un fișier conținut de directorul )2 Co pe trei categorii:#
drepturile de acces la fisier. Drepturile

( c C . ( c C .
w-write, x-execute)  si sunt grupate
◦ user - drepturile proprietarului fisierului#
Nume fișier an nod index
Număr i-node n
◦ group - drepturile utilizatorilor
◦ others - drepturileatuturor celorlalti utilizatori#
din grupul proprietarului#
D a D a
Nume fișier
1 3Număr nod index i-node
m • timpul ultimului3acces la fisier#
m
s • timpul ultimei01 s
20 Număr nod index
i-node
Coi-node Coindex#
Nume fișier Număr nod index
) 2 acces pentru actualizarea nodului
actualizari a fisierului#
Nume fișier )
( c .
C i-node ( c
• timpul ultimului
• tipul fisierului. .
C directoare (d),
Fisierele pot fi: fisiere obisnuite (-),
Nume fișier Număr nod index
Nume fișier Număr nod index a n i-node
periferice (c) etc.#
a n
D • lungimea fisierului (in octeti)#
D numarul de legaturi
13 13 la operatia de
Nume fișier Număr nod index i-node • contorul de legaturi al fisierului. Reprezinta
0 existente spre acest nod index. Este 0
)2 )2
utilizat

(c (c
stergere a nodului index.#
• lista de blocuri care conțin fișierul

!167 !168
a a
m m
C oscare conțin fișierul os 

➠ Nod index (i-node)
C
C. C.
• lista de blocuri → conține informații despre un anumit fișier de pe disc

an • nidentificatorul utilizatorului: uid (user-id.). Identifica proprietarul


a
D 1
a D• fisierului# a
1 3 2
m 1 3 identificatorul de grup al utilizatorului#m
0 s 20 s
Co o pe treisunt
3
)2
• drepturile de acces la fisier. Drepturile de trei tipuri (r-read,

c
4
. ) . C
(c
w-write, x-execute)  si sunt grupate categorii:#
( 5
C C
◦ user - drepturile proprietarului fisierului#
7 an n
6
◦ group - drepturile utilizatorilor
◦ others - drepturileatuturor celorlalti utilizatori#
din grupul proprietarului#
D a D a
1 3 89 m • timpul ultimului3acces la fisier#
1 m
20 10 s • timpul ultimei0 actualizari a fisierului# s
) Co ) 2 acces pentru actualizarea nodului Coindex#
(c C. c .
simplă indirectare • timpul ultimului
dublă indirectare (
• tipul fisierului. C directoare (d),
Fisierele pot fi: fisiere obisnuite (-),
triplă indirectare
an periferice (c) etc.#
a n
D • lungimea fisierului (in octeti)#
D numarul de legaturi
0 13 • contorul de legaturi al fisierului. Reprezinta
existente spre acest nod index. Este 0 13 la operatia de
) 2 )2
utilizat

(c (c
stergere a nodului index.#
• lista de blocuri care conțin fișierul

!169 !170

a a
s m s m
Tipuri de fișiere
. Coîn UNIX Dispozitive periferice
. Co
C C
an ➟Reprezentate an de fișiere în directorul /dev #
D
• 1Fișier
 a D a
3 munificator, pentru a reprezenta 13 m
0 ➞ în UNIX e folosit ca un concept general,
o s ➞ /dev/sda,
0 /dev/sdb ...#
s
c) 2 diferite resurse logice sau fizice# . C c . Co
) ➞2 /dev/sda1, /dev/sda2, /dev/disk/by-id/scsi-SATA_ST3250820AS_9QE499JB-part5#
( C ( C
• Tipuri de fișiere

a n ➞ /dev/cdrom#
an
➞ fișier obișnuit

D a D a
➞ director

1 3 m ➞ /dev/dvdrw
1 3 m
20 s 20 s
Co Co
➞ fișier legătură simbolică

➞ FIFO (named pipe)

c) . c) .
➞ socket
 ( C
dd if=/dev/sdb2 ( of=backup-partition2.img bs=1024
C
➞ dispozitiv periferic orientat pe caracter

a n #

 an
➞ dispozitiv periferic orientat pe blocuri

D D
strings /dev/sda3 > strings_on_attacked_rootpartition.txt

➞ ... (în funcție de varianta de UNIX pot exista mai
13 multe tipuri de fișiere) 1 3
) 20 ) 20
(c (c
!171 !172
a a
m m
Dispozitive “periferice”
C os virtuale Legături spre C os
fișiere
C . C.
an an
D ➞ /dev/random /dev/urandom# a D a
1 3 m 13 m crearea de legături
0 s ➟ 0Sistemul de fișiere UNIX permite s
)2 Co ) 2 fișiere existente
 Co
➞ /dev/null#

( c ➞ /dev/zero# C . ( cspre .
C fișier

a n n
≈ nume alternative pentru un același
a
➞ /dev/full
D a 

D a
1 3 m ➟ Două tipuri:
 1 3 m
20 >/dev/null 2>/dev/null Co s 20 s
) ➞ Legături fixe
 ) Co
(c C. c .
sh myscript
# (
➞ Legături simbolice
C

an bs=1024
 an
dd if=/dev/zero of=foobar count=1024
D D
0 13 1 3
)2 ) 20
(c (c
!173 !174

a a
Legături fixe (hard
osm links) sm links)
Legături fixe (hard
o
C
➟ mai multe intrări
.
în director care referă un același i-nod
 C
C în cadrul aceluiași sistem de fișiere (partiții)

➟ referiri doar C.
$ touch abc

➟ nu pot a n an
$ ls -l
total 0
D fi referite directoare
 a D
-rw-r--r-- 1 danc staff 0 a23 Oct 17:24 abc
3 m
➞ pentru a nu crea dependențe circulare; excepție: versiuni mai noi de HFS+ (OS X), 3 m
01 s 01 s
$ ln abc abc1
2 Co )2 Co
dar numai pentru sistemul de backup automatizat
 $ ls -l
➟c) i-nodul memorează un contor
. (c C.
de legături 
 total 0
( C
➞ folosit la crearea și ștergerea de legături; fișierul e șters doar când contorul era 1
 -rw-r--r-- 2 danc staff 0 23 Oct 17:24 abc
an -rw-r--r-- 2 danc
an staff 0 23 Oct 17:24 abc1
D a $ ln abc xyz D a
Director1
3 m $ ls -l 3 m
01 Număr nod index s
i-node
01 s
Coi-node Coabc
a.txt total 0

c)2 -rw-r--r-- 3
c)2 danc staff 0 23 Oct 17:24
C. .
abc.sh Număr nod index
( -rw-r--r-- 3 ( danc
C abc1
staff 0 23 Oct 17:24

an an
script.sh Număr nod index -rw-r--r-- 3 danc staff 0 23 Oct 17:24 xyz

$ rm abc
D D
13 3
$ ls -l
Director2
0 total 0 1
0 Oct 17:24 abc1
fisier1 Număr nod index
) 2 i-node -rw-r--r-- 2 danc staff 0223
staff c)0 23 Oct 17:24 xyz

abc.sh
(c
Număr nod index -rw-r--r-- 2 danc
(
mailsystem.log Număr nod index i-node

!175 !176
a a
m m
Legături simbolice
C os (symbolic links) Legături simbolice C os (symbolic links)
C. $ echo C .
”text” > abc

an
$ catnabc
texta
➟ fișierDspecial, de sine statător, care a referă un fișier existent
 D -s abc link1 a
1 3 m
$3 ln
1 m
➟ se0 pot face referințe și către fișiere
os din sisteme de fișiere 0 s
$ cat link1
) 2
(partiții) distincte
 . C ) 2 text . Co
(c ( c $ ls -l
➟ pot fi referite directoare
n C total 8
n
C
a propriu și ocupă loc pe disc
 -rw-r--r-- 1 danc staff a 0 23 Oct 17:34 abc
➟ fișierul legătură are i-nod D a lrwxr-xr-x 1 danc D staff 3 23 Oct a
17:34 link1 -> abc
1 3 m $ ln -s abc link213 m
➟ dacă fișierul destinație0 e șters, legăturile s
ramân,
o
însă vor
20 s
2 Co
$ ls -l
)
indica locații inexistente C )
(c C. c C.

 total 16
-rw-r--r-- (1 danc staff 0 23 Oct 17:34 abc
an lrwxr-xr-x 1 danc staff
an
3 23 Oct 17:34 link1 -> abc
D lrwxr-xr-x 1 danc staff
D
3 23 Oct 17:34 link2 -> abc

13 3
$ rm abc
0 1
20
$ ls -l
)2 total 16
)
(c lrwxr-xr-x
lrwxr-xr-x
1 danc
1 danc
staff
staff
(c
3 23 Oct 17:34 link1 -> abc
3 23 Oct 17:34 link2 -> abc


!177 !178

a a
sm s m
Co Un program Co
C. C.
an ➟ parcurge an recursiv un director dat ca argument în linia
D a D a
13 m 13
de comandă
 m
20 s 0 s
) Co 
 )2 Co
(c C. c
(➟ afișează
 C .
an a
→ pentru legături simbolice:
n numele și calea indicată

D
Din nou3 puțină programare… a D a
→ pentru alte fișiere: 3
01 osm 1 numele

20e executabil, afișează * la sm
) 2 C )
- dacă fișierul Cosfârșitul 

(c C . ( c
numelui acestuia
 C .
an a n
→ indentează afișarea în funcție deD adâncimea în 

D
13 arbore 13
) 20 )2
0
(c (c
!179 !180
#
#include <stdlib.h> printf("%sDIR %s:\n", spatii, nume_dir);
#include <stdio.h> a a
#include <sys/types.h> sm sm
while((in = readdir(dir))>0)
#include <string.h>
Co {
Co
C. C.
#include <errno.h> nume = in->d_name;
#include <dirent.h> if(strcmp(nume, ".") == 0 || strcmp(nume, "..")==0)
an
#include <unistd.h> an
continue; de ce nu e bună
D
#include <sys/stat.h>
a D a
3 m 3 m
această variantă ?
01 01
#include <limits.h>
s s
sprintf(cale, "%s/%s", nume_dir, nume);

)2 Co )2 Co
# snprintf(cale, sizeof(cale), "%s/%s", nume_dir, nume);
void parcurge(char *nume_dir, int nivel)
{ (c C. (c if(lstat(cale, &info)<0) C.
an an
DIR *dir; {
struct dirent *in;
D a D
printf("%s: ", cale); fflush(stdout);
a
char *nume;
3 m 3
perror("eroare la lstat");
m
struct stat info;
01 s exit(1); 01 s
)2
char cale[PATH_MAX], cale_link[PATH_MAX + 1], spatii[PATH_MAX];
c Co }
c)2 Co
( C. ( C.
int n; #

an an
if(S_ISDIR(info.st_mode))
memset(spatii, ' ', 2*nivel); parcurge(cale, nivel + 1);
spatii[2*nivel]='\0'; D else D
#
0 13 if(S_ISLNK(info.st_mode)) 13
if(!(dir = opendir(nume_dir)))
) 2 {
) 20
(c (c
{ n = readlink(cale, cale_link, sizeof(cale_link));
printf("%s: ", nume_dir); fflush(stdout); cale_link[n]='\0';
perror("opendir"); printf("%s %s -> %s\n", spatii, cale, cale_link);
exit(1); }
} !181 else !182

a a
{
sm $ ./rd /etc sm
C o %s",&spatii,
printf("%s cale);
DIR /etc:
Co
& . S_IXOTH) C.
if(info.st_mode S_IXUSR || info.st_mode & S_IXGRP ||
/etc/AFP.conf
info.st_mode C
nprintf("*");
aprintf("\n"); an
/etc/afpovertcp.cfg
/etc/aliases -> postfix/aliases
D a D
/etc/aliases.db a
13 3
}
0 s m 1 DIR /etc/apache2:
sm
) 2}closedir(dir); Co ) 20 DIR /etc/apache2/extra:
Co
( c C . (c C.
/etc/apache2/extra/httpd-autoindex.conf
/etc/apache2/extra/httpd-dav.conf
an an
}
# /etc/apache2/extra/httpd-default.conf
int main(int argc, char *argv[]) D a D
/etc/apache2/extra/httpd-info.conf
a
1 3 m 3
/etc/apache2/extra/httpd-languages.conf
m
s 01 s
{
20 Co Co
/etc/apache2/extra/httpd-manual.conf
)2
if(argc != 2)
c ) .
/etc/apache2/extra/httpd-mpm.conf
c C.
{
printf("Mod (de utilizare: %s director\n",Cargv[0]); (
/etc/apache2/extra/httpd-multilang-errordoc.conf

an an
/etc/apache2/extra/httpd-ssl.conf
exit(1);
/etc/apache2/extra/httpd-userdir.conf
}
D D
13
/etc/apache2/extra/httpd-vhosts.conf
/etc/apache2/httpd.conf 13
parcurge(argv[1], 0);
2 0 /etc/apache2/httpd.conf~previous 20
return 0; ( c) /etc/apache2/magic
(c
)
}

!183 !184
a a
s m sm
Cum s-ar faceC?o Co
→ aflarea C. dimensiunii fișierului
 C.
an
→ evidențierea fișierelor spre care există legături fixe
 an
D a proprietar
 D a
→13aflarea drepturilor utilizatorului m 3 m
0 s 01 s
Co
) 2→ aflarea utilizatorului proprietar

. )2 Co
c
( → modificarea drepturilor C pentru un fișier
 (c C.
→ ștergerea fișierului
a n an
D 4. D
→ aflarea informațiilor
1 3 despre un fișier indicatmde a link
1 3 Procese m
a
20 s 20 s
c) Co ) Co
Cum aflăm…
 ( C . (c C.
- ce fișiere header să includem (#include) an ?
 an
D D
- ce returnează funcțiile sistem ?
 13 13
) 20
- care sunt macro-urile pentru determinarea tipului ) 20
( c (c
unui fișier ?
!185 !186

a a
sm s m
Co Multitasking Co
C. = abilitateaCde. a efectua mai multe activități în același
an timp an
D a D a
13 m 13 m
20 s 0 s
) Co )2 Co
(c C. ( c C .
an an
D
Concepte de bază a D a
1 3 m 1 3 m
20 s 20 s
) Co ) Co
(c C. ( c C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!187 !188
a a
sm sm
Multitasking Co Multitasking Co
= abilitateaCde . a efectua mai multe activități în același C.
timp an an
D a D a
1 3 m 13 m
0 s 0 s
)2 . Co )2 Co
( c C (c C.
a n an
D a D a
1 3 m 3 m
capacitatea unui sistem
0 de operare de a rula
os
simultan mai 01 s
2
multe programec)sau părți de programe executabile .C pe c)2 Co
(
platforma deservită C ( C.
an an
D D
0 13 13
)2
capacitatea unui sistem de operare
) 20de a rula simultan mai
(c (c
multe programe sau părți de programe executabile pe
platforma deservită
!189 !190

a a
sm sm
Co Co
C. C.
an an
D a D a
13 m 13 m
20 s 20 s
c) Co c) Co
(capacitatea C. C.
unui sistem de operare de a rula simultan mai (capacitatea unui sistem de operare de a rula simultan mai
multe programe sau părți ande programe executabile pe multe programe sau părți ande programe executabile pe
platforma deservită 3 D a platforma deservită 3 D a
1 sm 1 sm
) 20 Co ) 20 Co
( c C . ( c C .
an an
D D
13 1 3
) 20 ) 20
(c (c
!191 !192
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
c)
2 Co )2 Co
(capacitatea C. (c C.
unui sistem de ooerare de a rula simultan mai
multe programe sau părțiande programe executabile pe Procesean
platforma deservită 3 D a 3
D a
1 sm 01 sm
) 20 Co )2 Co
( c C . ( c C.
an an
D D
13 13
) 20 ) 20
(c (c
!193 !194

a a
s m sm
Procese . Co Procese . Co
3214 795 2329
C C
an n
a 24
D a D a
1 3Proces = conceptul de bază m utilizat de sistemul de 13 m
0 s 0 s
c) 2 operare pentru a modela . Coentitățile software care c)2 . Co
( rulează în paralel
 C ( C

 a n an
D a D a
1 3 m 3 m
01
Proces = un program sau o parte a unui programs s
) 20 sub controlul sistemului
aflat în execuție Code operare ) 2 Co
( c C . (c C.
an n identifier - PID)

Procesele sunt identificate prin numere (process
a
D 
 D
13 3
20 La un același moment dat, nu există 2două 01 procese cu același
) identificator, dar identificatorii pot (fic)refolosiți după ce procesele
(c
s-au terminat
!195 !196
a a
sm m
Procese . Co mai multe procese
C os Un singur procesor ?

C.
N procesoare ?
C
an an
D a D a
1 3 m 1 3 m
0 s 0 s
)2 Co )2 Co
( c C. ( c C .
an a n
D a D a
3 m 3 m
01 s 20
1 s
c)2 Co c) Co
( C. ( C .
La un moment dat, într-un sistem de a n an
D operare pot să D
ruleze simultan mai multe procese
procese

0 13 1 3
2 20
c) )
• procese sistem

• procese utilizator ( (c
!197 !198

a a
s m Un singur procesor ?
 s m Un singur procesor ?

. Co
mai multe procese
N procesoare ?
Cum ?! Co
mai multe procese
. N procesoare ?
Cum ?!
C C
an an
D a D a
1 3 m 1 3 m
0 s 0 s
c)2 . Co c)2 . Co
( C ( C
an an
D a D a
1 3 m 1 3 m
20 s 20 s
c) . Co c) . Co
( C ( C
an an
D D
13 1 3
) 20 Planificarea la execuție a proceselor
) 20 (Process Scheduling)
(c (c
!199 !200
a a
s m s m
Co
Planificarea la .execuție a proceselor (Process Scheduling) Co
Planificarea la .execuție a proceselor (Process Scheduling)
C C
an an
D a D a
1 3 m 1 3 m
0 s 0 s
c)2 . Co c)2 . Co
( C ( C
a n a n
D a D a
1 3 m 1 3 m
20 s 20 s
c) . Co c) . Co
( C ( C
an an
D D
13 1 3
20 20
t1
) )
(c timp (c timp

!201 !202

a a
s m s m
Co
Planificarea la .execuție a proceselor (Process Scheduling) Co
Planificarea la .execuție a proceselor (Process Scheduling)
C C
an an
D a D a
0 13 sm 0 13 sm
c)2 . Co c)2 . Co
( C ( C
an an
D a D a
1 3 m 1 3 m
20 s 20 s
c) . Co c) . Co
( C ( C
an an
D D
13 t3013
20
t2
) )2
(c timp (c timp

!203 !204
a a
s m s m
Co
Planificarea la .execuție a proceselor (Process Scheduling) Co
Planificarea la .execuție a proceselor (Process Scheduling)
C C
an an
D a D a
1 3 m 1 3 m
0 s 0 s
c)2 . Co c)2 . Co
( C ( C
a n a n
D a D a
1 3 m 1 3 m
20 s 20 s
c) . Co c) . Co
( C ( C
an an
D D
13 t4 t5 1 3
) 20 ) 20
(c timp (c timp

!205 !206

a a
s m s m
Co
Planificarea la .execuție a proceselor (Process Scheduling) Co
Planificarea la .execuție a proceselor (Process Scheduling)
C C
an an
D a D a
0 13 sm 0 13 sm
c)2 . Co c)2 . Co
( C ( C
an an
D a D a
1 3 m 1 3 m
20 s 20 s
c) . Co c) . Co
( C ( C
an an
D D
t6 13 t7013
) 20 )2
(c timp (c timp

!207 !208
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co → algoritmi de planificare laoexecuție

)2 C
(c C. ( c C.
- implementați în nucleul sistemului de operare, care are, astfel, 

an a n
rol de dispecer de procese

D ... a D a
3 m - pot urma diverse 3strategii: "round-robin", bazate pe m
01 1 priorități etc.

s 0 s
c)2 Co c)2 Co
( C. ( C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!209 !210

a a
sm sm
Stările unui proces
Co C o
C. C.
an an
De-a lungul
D a D „existenței” sale, un proces
a
poate să se afle
3 m 3 următoarele stări principale:
20
1 s în una1din
0 sm
Co
) Execuția proceselor este. coordonată de către )2 C o
(c C (c
• C.
Pregătit de execuție (Ready, Runnable)

sistemul de operare, care
a n este responsabil de an
→ procesul poate fi rulat, dar nu i-a venit încă rândul#
gestionarea întregului D ciclu de viață al proceselor
a D a
1 3 m 3 m
20 s 01 s
Co • 2 (Running)
 Co
În execuție
c) )
( C . (c
→ procesul rulează#
C.
an an
D • Blocat (Blocked / Waiting)
 D
13 13
→ procesul e blocat în așteptarea unor resurse sau evenimente

) 20 20
(exemplu: date de la intrare, dintr-un fișier etc.)
)
(c (c
!211 !212
a a
sm sm
Co Co
C. CreatedC. Exit
an an
D a D admit
a release

13 time-out m
s 13 time-out m
0
Co
0 os
)2 Ready
. Running ) 2 Ready C Running
( c C
dispatch (c C.
dispatch
an an
resource is available /
 D need to wait for
 a resource is available /
 D need to wait for
 a
1 3 resource / event m 1 3 resource / event m
event occurs
20 s event occurs
20 s
c) Blocked . Co c) Blocked . Co
( C ( C
an an
D D
13 1 3
) 20 ) 20
(c (c
După: W. Stallings, Operating Systems: Internals and Design Principles, 7th edition, Prentice Hall, 2011 După: W. Stallings, Operating Systems: Internals and Design Principles, 7th edition, Prentice Hall, 2011

!213 !214

a a
sm sm(altă perspectivă)
Stările unui proces
Co Co
CreatedC. Exit .
- extras dinC manualul comenzii ps din Linux -
an admit an
D a release
D a
3 time-out m
PROCESS3 STATE CODES
m the s, stat and state
01 os Here 0are1 the different values that s
) 2 Ready C Running ) 2 specifiers(header "STAT"
output Co or "S") will display to
(c C.
dispatch ( c
describe C .
the state of a process.
resource aisnavailable /
 D Uninterruptible sleepa n (usually IO)
D need to wait for
 a R Running or runnable D (on run queue) a
resumed
1 3
event occurs
resource / event m S 1 3
Interruptible sleep (waiting for an event m to complete)
20 
 s s
20 by a job control signalCoor because it
)
swapped
c Blocked . Co T Stopped, either
is being traced.(c)
to (disk
C W paging (not valid since the 2.6.xx kernel) C.
Swapped swapped 
 a n X dead (should never be seen) an
to disk D D
out
13 Z Defunct ("zombie") process, terminated
13
but not reaped
20 0
by its parent.
) )2
(c (c
După: W. Stallings, Operating Systems: Internals and Design Principles, 7th edition, Prentice Hall, 2011

!215 !216
a
Comanda ps (Process a
m Status) s sm
Coproceselor din sistem și informații despre ele
→afișează lista Co
C. C.
$ ps aux an an
D a D a
3 3
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root
root
01
1 0.0 0.1 39348 4460 ?
2 0.0 0.0 0 0 ?
Ss
S
Nov06
Nov06
sm
0:02
0:00
/sbin/init
[kthreadd]
01 sm
)2 Co )2 Co
root 3 0.0 0.0 0 0 ? S Nov06 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S Nov06 0:00 [migration/0]

(c C. (c C.
root 7 0.0 0.0 0 0 ? SN Nov06 0:00 [rcuc0]
root 45 0.0 0.0 0 0 ? S Nov06 0:00 [scsi_eh_4]
root 1433 0.0 0.0 21052 612 ? Ss Nov06 0:00 /sbin/rpcbind

an an
root 1435 0.0 0.0 62216 2192 ? Ss Nov06 0:02 /usr/sbin/nmbd -D -s /etc/samba/smb.conf
danc 2185 0.0 0.0 23256 704 ? Ss Nov06 0:00 /usr/bin/gpg-agent --sh --daemon --write-env-file /home/d

D D
danc 2186 0.0 0.0 18568 528 ? Ss Nov06 0:00 /usr/bin/ssh-agent /etc/X11/xinit/xinitrc
danc
danc
2198 0.0 0.0 20092 876 ?
2199 0.0 0.0 22944 1820 ?
3
S
Ss
Nov06
Nov06
0:00
0:00 a
dbus-launch --sh-syntax --exit-with-session
/bin/dbus-daemon --fork --print-pid 5 --print-address 7 - Structuri de 3 date pentru procesema
root 2318 0.0 0.1 164652 4440 ?

01
Sl Nov06 0:00 /usr/lib/upower/upowerd
sm 0 1 s
Co o
danc 2353 0.0 0.2 134304 7048 ? S Nov06 0:00 /usr/lib/xfce4/panel/wrapper /usr/lib64/xfce4/panel/plugi

)2 2
danc 2361 0.1 0.3 112224 8904 ? S Nov06 0:07 /usr/lib/xfce4/panel-plugins/xfce4-orageclock-plugin 1 2
danc 2363 0.0 0.1 146904 3012 ?

c
Sl Nov06 0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
) C
( C. (c C.
danc 2367 0.0 0.0 58124 2624 ? S Nov06 0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
danc 2380 0.0 0.1 48512 4092 ? S Nov06 0:00 /usr/lib/GConf/2/gconfd-2
danc 2387 0.0 0.1 58796 3880 ? S Nov06 0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.10 /org/gtk/gvfs/e

an an
danc 2392 0.0 0.0 42512 2520 ? S Nov06 0:00 /usr/lib/gvfs/gvfsd-burn --spawner :1.10 /org/gtk/gvfs/ex
danc 2396 0.5 1.3 524352 37188 ? Sl Nov06 0:35 /usr/bin/python -OO /usr/bin/gmixer -d

D D
root 3092 0.0 0.1 90004 3800 ? Ss Nov06 0:00 sshd: danc [priv]
danc 3100 0.0 0.0 90004 2092 ? S Nov06 0:00 sshd: danc@pts/0

13 13
danc 3101 0.0 0.1 20772 3508 pts/0 Ss Nov06 0:00 -bash

0 0
root 3186 0.0 0.0 0 0 ? S Nov06 0:00 [flush-8:16]

2 )2
danc 5611 1.2 0.0 35708 1936 ? SN 00:01 0:06 grav -root

c)
danc 6242 0.0 0.0 13252 1148 pts/0 R+ 00:09 0:00 ps aux

(
acesta e doar un extras din lista afișată de ps
(c
!217 !218

a a
sm sm
Structuri de date (exemple)
Co Co
C. .
C pregătite de execuție
Lista proceselor
an a n
D a D din aceastăalistă se selectează, 

0 13 a gestiona procese, sistemul
Pentru sm de operare
0 13 pe rând, sm procesele care rulează

2 C o 2 efectivo(li se dă timp procesor)
C
)menține structuri de date dedicate.% )
(c C. (c C.
n
a la un proces la altul (context Lista proceselor blocate a
n
Operația de „trecere”Dde a D a
1 3switching) presupune costuri
m 1 3 în această listă sunt memorate
m
switching, process 0 os 20 s
informații despre procesele
2timp/resurse blocate. Există mai o
) .C ) Cmulte astfel de
semnificative în
c c .
( C ( liste, pentru
C a blocării
 sau
diversele resurse

an an
evenimente cauză

D 

D
13 13 înapoi în lista proceselor

Când un proces se deblochează,

2 0 0
e trecut
2
) )pregătite de execuție
(c ... (c
!219 !220
a a
sm sm
Co Co
C. C.
an i se alocă zone de memorie și structuri de an
Identificare proces PID, PID proces părinte

D
Fiecărui proces a DStivă a
Identificare user - real UID (proprietarul fișierului), 

1 3 m 13 m - effective UID (procesul poate
0
control/gestiune separate s 0 s
)2 Co )2 Co
rula temporar cu privilegiile unui

( c C . (c C.
Tabela de fișiere
alt user decât proprietarul)

a n Date an deschise
D a D Starea procesului a
1 3 m 3 m
Pregătit de execuție, blocat etc.
La schimbarea stării 20unui proces, informațiile Cdespreos acesta 01 o s
)2
Prioritate, director curent, 

) C
(c de memorie pot fi salvate/restaurate
C. c C.locația curentă (în
sunt reținute; zonele terminalul de control, semnale
( Alte informații
primite,
de pe disc, dacă e cazul an Cod an sau pe disc) etc.
memorie
D D
13 3
Regiștri procesor

0 1
20
PC SP
)2 )
(c (c
!221 !222

a a
sm
Identificare proces

sm
Co Co
Stivă Identificare user

C. C.
Identificare proces

Tabela de fișiere Stivă


an an
Identificare user
Date deschise

D D
Starea procesului

a a
13 3
Tabela de fișiere

m Date
m
deschise

s 1 s
Alte informații

0
Cod
20
Co Co
Starea procesului

) 2 Regiștri procesor

)
(c C. (c C.
PC SP Alte informații

Cod

an an
Regiștri procesor
Identificare proces
PC SP

Stivă
D Identificare user

a CreareaD proceselor a
3 m 3 m
01 s 20
1 s
) 2Date Co Co
Tabela de fișiere

)
deschise

Stivă
Identificare proces

Identificare user ( c Starea procesului

C. (c C.
an an
Identificare proces

Alte informații
Stivă Identificare user
Cod
Tabela de fișiere
D D
13 3
Regiștri procesor
Date deschise

1
PC SP

0 20
Tabela de fișiere
Starea procesului
Date deschise

) 2 Starea procesului

)
(c (c
Alte informații

Cod Alte informații


Regiștri procesor

PC SP Cod
Regiștri procesor

PC SP

!223 !224
a a
sm
Crearea proceselor
o
m
Funcția sistemosfork()
C C
C.
Orice proces poate să creeze un nou proces
 C.→creează un proces fiu
an
→ procesul creat se numește proces fiu (child process)
 an
D a
→ procesul creator se numește proces părinte (parent process)
 D a
3 m 3 m
01 s 0 1 s
)2 Co
. de a genera noi procese
 )2 . Co
(c ➥Este singura modalitate C ( c #include <unistd.h>
C
an de va
→ astfel, fiecare proces din sistem avea un proces părinte

# a n
D
→ se creează, astfel, un arbore procese
a
care descrie relația părinte-fiu D a
1 3 m pid_t 3fork(void);
m
20 sistemului se creează automat s 01 s
La inițializarea
c) Co un ) 2 Co
proces inițial, ( numit procesul init
 C . (c C.
→ init are PID = 1

a n an
D
→ este baza întregului „arbore genealogic” de procese
 D
13 13
) 20 ) 20
(c (c
!225 !226

a a
sm sm
Co Co
C. C.
an an
D a DStivă a
13 m 13 m
20 s 20 s
) Co ) Co
(c C. (c C.
an Date an
D a D a
3 m 3 m
01 s 01 s
c)2 Co c)2 Co
( C. ( C.
fork()

an Cod an
D D
0 13 13
) 2 ) 20
(c proces părinte (c
!227 !228
a a
sm sm
Co Co
C. C.
an an
DStivă a DStivă a Stivă
013 sm 013 sm
)2 Co )2 Co
(c C.
fork() (c C.
fork()
Date

) 20
1 3
D

an

Co
sm
a
Date

) 20
1 3
D

an Date

Co
sm
a
fork()
(c C.
fork()
(c C .
Cod an Cod an Cod
D D
0 13 13
) 2 ) 20
proces părinte (c proces părinte (c proces fiu

!229 !230

a a
sm sm
Stivă o Stivă Stivă o Stivă
C C
C. C.
an an
D fork() a D fork() a

(c
) 2 0 13 Date

an
C.
Co
sm Date
(c
) 2 0 13 Date

an
C.
Co
sm Date

fork()
D afork() fork()
D fork()
a
Cod
013 Cod sm Cod
013 Cod sm
c)2 . Co c)2 . Co
( C ( C
an an
proces părinte D proces fiu proces părinte D proces fiu
3 3
01 01
)2 2
) continua execuția, 

După creare, ambele procese îșicvor
(c
Procesul fiu este o copie (aproape) fidelă, inclusiv (
în paralel, de la instrucțiunea imediat următoare apelului fork()
la nivelul datelor, a procesului părinte
!231 !232
a a
După creare, ambele
o sm procese își vor continua execuția, 
 sm
După crearea procesuluie
o procese își vor continua execuția, 

în paralel, de .laC instrucțiunea imediat următoare apelului fork() în paralel, de .laC instrucțiunea imediat următoare apelului fork()
C C
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
an an
D a D a
3 m 3 m
01 s 01 s
c)2 Co c)2 Co
( C. ( C.
an an
D D
0 13 13
) 2 ) 20
(c (c
!233 !234

a a
o sm
După crearea procesuluie procese își vor continua execuția, 
 sm
După crearea procesuluie
o procese își vor continua execuția, 

în paralel, de .laC instrucțiunea imediat următoare apelului fork() în paralel, de .laC instrucțiunea imediat următoare apelului fork()
C C
an procese identice dar independente

Există două an procese identice dar independente

Există două
D
→ au zone separate de date, stivă, regiștri etc.#a D
→ au zone separate de date, stivă, regiștri etc.#a
3 m 3 m
01 s 01 s
)2 fiu moștenește din. părinte
 Co )2 fiu moștenește din. părinte
 Co
(cProcesul C existente în părinte imediat înainte de
→ toate datele (variabile globale), cu valorile
(cProcesul C existente în părinte imediat înainte de
→ toate datele (variabile globale), cu valorile
fork()
 an fork()
 an
→ poziția curentă în program, stivaD de apeluri, variabile locale
 a → poziția curentă în program, stivaD de apeluri, variabile locale
 a
→ tabela de fișiere deschise:13 toate fișierele deschise de părinte până m → tabela de fișiere deschise:13 toate fișierele deschise de părinte până m
20 și utilizabile de procesul fiu Co
înainte de fork() vor fi accesibile
s imediat
20 și utilizabile de procesul fiu Co
înainte de fork() vor fi accesibile
s imediat

) )
(c C. (c C.
an Ce diferă ? an
D D
0 13 0 13
)2 )2
(c (c
!235 !236
a a
o sm
După crearea procesuluie procese își vor continua execuția,
Ce diferă ? 

Stivă os
m
Stivă
în paralel, de .laC instrucțiunea imediat următoare apelului fork() C
PID proces. fiu
C C 0

an an
D a D fork() a


3 m 13 Date m
01 s 0 s Date
) 2 fork() returnează valori Co ) 2 Co
(c
Funcția C. diferite în fiu față de părinte:
 (c C.
→ în fiu returnează 0
 an an
→ în părinte returnează D a
fork()
D a fork()

1 3 PID-ul procesului fiu noumcreat
 Cod 13 Cod sm


20 s 0
Coproces )2 Co

c) . c .
(
Dacă a apărut o eroare, fork() returnează -1 și nu mai creează un nou
C ( C
an an
D proces părinte D proces fiu
13 1 3
) 20 ) 20
(c (c
!237 !238

a a
sm sm
Co
Astfel, un program poate face:
Co

1 3
D
an
C .
...
if( ( pid=fork() ) a
{ m
< 0)
? 13
D
an
C.
Ce efect are următoarea secvență a
m de cod ?
20 os 0
Co
s
)2
perror("Eroare");
) exit(1); C
(c } C . ( c C .
if(pid==0)
an ...
an
{
D a fork();D a
3 codul fiului */
/*
1... m 1 3 m
0 s 0 s
c ) 2} exit(0); Co c) 2printf("a"); Co
( /* codul parintelui */ C. ( ...
C .
... an an
# D D
0 13 1 3
2
) comporta diferit ) 20
codul părintelui și fiului se(cvor (c
!239 !240
a a
sm m
Co
Familia de funcții os exec...()

? 1
D
an
C.
3 Ce efect are următoarea secvențăm
a de cod ? → folosite
1 3
D
an
C.
C

pentru a putea aveamprocese a complet


0 s 0 s
)2 . Co 2
)diferite în sistem
 C o
( c ... C (c→ apelate de obicei imediat C. după fork(), în procesul fiu

int i;a
n 
 an
D a D a
1 3 m → încarcă de pe disc 1 3 codul unui program executabil m și
for(i=0;
20 fork();
i<=10; i++)
s 0 s
c) . Co c)2
îl suprascrie pe procesul curent, ștergând complet
. Co și
( ... C inițializând zonele ( de memorie ale acestuia
 C
an an

(c
) 20
13
D
! (c
) 20
1 3
D

!241 !242

a a
Familia de funcții sm sm
C o exec...() Familia de funcții
C o exec...()
ObservațiiC. C.
an încărcat va rula de la prima sa instrucțiune (adică începând cu
→ programul an
D main() )
 a D#include <unistd.h> a
13majoritatea atributelor procesului suntspăstrate
 13 extern char **environ; sm
funcția
0→ m #
0
c) 2 -- identificatorul de proces (PID)

. Co 
 c)# 2 . Co
( relația părinte-fiu (Parent PID - PPID),
C până la alarmă
 ( int execl(const char C*path, const char *arg, ...);

an existente (cu excepția cazurilor în care an *path, const char *arg,


- semnalele în curs, timpul rămas int execlp(const char *file, const char *arg, ...);
- fișierele deschise și redirectările
D FD_CLOEXEC)
 a D
int execle(const char
a
- real UID, terminalul 1
3
la deschidere se specifică flag-ul
m
...,
1 3 char * const envp[]);
m
2 0 o s
de control, directorul curent, directorul rădăcină, 

20 char *file, char *constCargv[]);
int execv(const char *path, char *const argv[]);
os
prioritatea etc.

) C )
int execvp(const
→ dacă se execută (c cu succes, funcția exec nu se întoarceC.(nu are cum, a c
( char *const envp[]);
int execvpe(const char *file, char .
*const
C
argv[],

an an
fost suprascrisă)

→ în caz de eroare funcția se întoarce (cu valoarea -1)

D în crearea de
→ funcțiile fork() și exec...() combinate oferă flexibilitate D
procese

0 13 0 13
)2 ) 2restul sunt funcții de bibliotecă
(c (c
dintre toate, doar execve() e apel sistem,

!243 !244
a a
sm m
Co
Exemplu: afișarea
C os variabilelor de mediu
C. C. <stdio.h>
exec[l][p][v][e]
#include
an an char **environ;
extern
D a #D
a
13 m 1 3int main(int argc, char *argv[]) m
0 os 0 {
o s
)2 )2
argumentele programului

argumentele programului
 C
. sunt date ca vector 

char **p;
. C
(c date ca listă terminată 

sunt C terminat cu NULL ( c p = environ;
C
cu NULL a n while(*p)
{ a n
D e căutat 
 a D *p); a
programul
1 3 m
printf("%s\n",
1 3 m
(și)20în căile specificate 
 s p++;
20 s
c) $PATH . Co }
c) . Co
( de
C (
printf("\n\n----------------\n\n");
C
a n /** a n
D
environment-ul (variabile de mediu) 

programului3 va fi cel dat ca argument 

* acelasi cod se poate scrie, echivalent, D astfel:
1 3
01
*/
0
apelului2exec for(p=environ; *p; p++)
2
) )
(c (c
printf("%s\n", *p);
}

!245 !246

Exemplu a a
s m
int main(int oargc, char *argv[])
 s m
C Preluarea valorii Co de return a proceselor
C. .
{

pid_t pid; C
an
if((pid=fork())<0) 
 an Valoare

D {
 a D a returnată
13 printf("Eroare la fork\n");
s m 

1 3 m
0 o 20 os
)2
exit(1); 

} 

(c if(pid==0) /* procesul fiu C . C*/ 
 )
(c• Valoare returnată
 C . C
{ 

an 
 an
➞ orice program proces returnează către sistem, la terminare, o valoare întreagă

D
execlp("ls","ls","-l",NULL); /* procesul va rula
comanda ls a*/ 

➞ C: exit(valoare); sau Dreturn valoare; în main()# a
3 3
1
0 execlp s-a intors, inseamna oca
 sm 0 1 s m
printf("Eroare
2
la exec\n");
)a putut fi lansat in executie. C*/ 
 programul
/* Daca
c

 • Convenție:

➞ 0: procesul s-a c ) 2 corect
 . Co
} 

(
nu
C ( terminat
➞ ≠0: procesul s-a terminat cu eroare (iar valoarea e codulC erorii)
else /* procesul parinte */ 
 an an
{ 
 D D
printf("Proces parinte\n"); 13 
 1 3
exit(0);
) 20 ) 20
}
}
 (c (c
!247 !248
a a
sm m
#include <sys/types.h>
s
Co Co
#include <sys/wait.h>

C. C.
#
pid_t wait(int *status);

an an
#
D a D
pid_t waitpid(pid_t pid, int *status, int options);
a
• 13
Valoarea sm
returnată trebuie preluată de procesul părinte
 •2013wait()
 sm
20astfel se verifică modul în care procesul
)➞
ofiu a rulat

Crămân ) C
➞ se blochează până când unul (oricare) o din procesele fiu se termină

c
( forma de "procese zombie"

➞ procesele nepreluate (încă) de părinte
C . în sistem chiar după terminare, sub
(c .
valoarea returnată de acesta
 C
➞ completează în status starea de terminare a procesului fiu terminat, inclusiv

➞ procesele pentru care părintele anse termină fără să fie preluate sunt preluate de an
procesul init# D a

D din status se pot folosi macro-uri aspecifice:

3 m 3
➞ pentru utilizarea informațiilor
1
20returnate
 o s WIFEXITED(status)

returnează 2true
1
0 dacă fiul s-a terminat normal, osm adică 

• Preluarea valorii
c) . Cprelua
(c
) Cvalori in main()
( C.
apelând exit() sau prin returnarea unei 

➞ orice proces poate apela funcțiile wait() și waitpid()
C
pentru a valorile returnate
WEXITSTATUS(status)

an an fiu terminat
de procesele fiu
returnează starea returnată de procesul
D D
0 13 • waitpid()
 0 13
)2 ➞ analog cu wait() dar așteaptă după un 2
) proces fiu anume, specificat ca
(c argument
 (c
!249 !250

a #include <stdio.h>
a
Funcția de bibliotecă s m exit()
#include <unistd.h>
sm
o #include <stdlib.h>
Co
C . C#include <stdlib.h> #include <sys/wait.h>
C.
void process(char chr, int n){
# n
an
int i;
a void exit(int status); for(i=0; i<=n-1; i++)
D a D a
1➞3 termină procesul curent și returneazăsm 3
printf("%c", chr);
0
valoarea dată ca argument
 1 sm
20
}
o fișierele deschise în proces, inclusiv Co
) 2 stream-urile specifice bibliotecii stdio
➞ înainte de terminare sunt închise toate
. C(FILE int main(){
)
( c (c C.
*)
 pid_t pid; int status;
➞ la terminare apelează funcțiileCcare au fost instalate prin apeluri anterioare la #
atexit() sau on_exit() an if((pid=fork())<0){ an
D a D
printf("Error creating child process\n"); exit(1); a
1 3 m 3 m
01
}
Funcția sistem _exit() 20 s s
Co )2 Co
if(pid==0) /* procesul fiu */ {
c) . process('c', 2000); 

c
(
#include <unistd.h> C exit(0); ( C.
an an
# }
void _exit(int status);
D /* procesul părinte*/
D
➞ termină procesul curent și returnează valoarea1dată 3 ca argument
 process('p', 3000);
13
20 dar nu închide stream- 20
wait(&status);
➞ închide toți descriptorii de fișier deschiși în proces,
) if(WIFEXITED(status))

)
urile specifice bibliotecii stdio (FILE *)

(c
➞ la terminare nu apelează funcții gen atexit() sau on_exit() else

(c
printf("\nChild ended with code %d\n", WEXITSTATUS(status));


printf("\nChild ended abnormally\n");



}
!251 !252
#include <stdio.h>

a a
#include <unistd.h>
a) #include <stdlib.h>

sm #include
# m
<sys/wait.h>
s
Co Co
int main(int argc, char *argv[])
Întrebare {

C. C.
pid_t pid1, pid2, wpid;
char *arg1[]={ "echo", "a", "b", "c", NULL };

an an
char *arg2[]={ "ls", "-l", ".", NULL };
int i, status;

D a D if((pid1=fork())<0)
a
13 13
{

0 Program care lansează smdouă comenzi:
 0


printf("Eroare la fork\n");
sm
Co Co
exit(1);

)2 )2
}
if(pid1==0) /* procesul fiu 1 */

(c a) în paralel

C . (c {
execvp("echo", arg1);
C.
b) secvențial n
an
printf("Eroare la exec\n");

a }
exit(2);

D a D
Important !
a
1 3 m 3
/* procesul parinte */
m
s 01 s
if((pid2=fork())<0)

20 Co Co
{

)2
?
printf("Eroare la fork\n");

c) . c C.
exit(1);

( C
}
(
if(pid2==0) /* procesul fiu 2 */

an an
{
execvp("ls", arg2);

D D
printf("Eroare la exec\n");
exit(2);

13 }
Important !
13
20 20
/* din nou procesul parinte */

) )
for (i=1; i<=2; i++)

(c (c
{
wpid = wait(&status);
if(WIFEXITED(status))
printf("\nChild %d ended with code %d\n", wpid, WEXITSTATUS(status));
else
printf("\nChild %d ended abnormally\n", wpid);
}
!253 } !254

#include <stdio.h>

a a
#include <unistd.h> #include <stdio.h>
#include <unistd.h>
a) #include <stdlib.h>
#include
# m
<sys/wait.h>
s
#include
#include
sm
<stdlib.h>
<sys/wait.h>

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

C. C.
pid_t pid1, pid2, wpid; {
char *arg1[]={ "echo", "a", "b", "c", NULL }; pid_t pid[2], wpid;

an an
char *arg2[]={ "ls", "-l", ".", NULL };
int i, status; char *arg1[]={ "echo", "a", "b", "c", NULL };
char *arg2[]={ "ls", "-l", ".", NULL };

D if((pid1=fork())<0)
a D int i, status;
a
1 3 {
m 1 3 char ** param[2];
m
s s
printf("Eroare la fork\n");

20 Co 20 Co
exit(1);
} param[0] = arg1;

) if(pid1==0) /* procesul fiu 1 */


) param[1] = arg2;

(c C. (c C.
{
execvp("echo", arg1); for(i=0; i<2; i++)
{

an an
printf("Eroare la exec\n");

}
exit(2); if((pid[i]=fork())<0)
} {

D
Important !
a D
printf("Eroare la fork\n");
a
3
/* procesul parinte */
m
exit(1);
3 m
01 01
}
s s
if((pid2=fork())<0)

Co Co
{ if(pid[i]==0) /* procesul fiu i */

)2 )2
printf("Eroare la fork\n"); {
execvp(param[i][0], param[i]);
c C. c C.
exit(1);

( duplicare de cod ?!
(
} printf("Eroare la exec\n");
if(pid2==0) /* procesul fiu 2 */ exit(2);

an an
}
{
execvp("ls", arg2); }
Important !
#
D D
printf("Eroare la exec\n");
exit(2); /* procesul parinte */

13 3
} printf("Processes started:\n");
Important !
0
for(i=0; i<2; i++)
1
20
printf("%d ", pid[i]);

2
/* din nou procesul parinte */
printf("\n");

) )
for (i=1; i<=2; i++)
for (i=1; i<=2; i++)

(c (c
{
wpid = wait(&status); {
if(WIFEXITED(status)) wpid = wait(&status);
printf("\nChild %d ended with code %d\n", wpid, WEXITSTATUS(status)); if(WIFEXITED(status))
else printf("\nChild %d ended with code %d\n", wpid, WEXITSTATUS(status));
printf("\nChild %d ended abnormally\n", wpid); else
} printf("\nChild %d ended abnormally\n", wpid);
} !255 } !256
}
b) a a
sm sm
Co Co
C. C. procesului curent și al procesului părinte
Aflarea ID-urilor
an an
D a D #include <sys/types.h>
a
13 m 13 m
#include <unistd.h>
0 s 0 s
Co Co
#
)2 )2 pid_t getpid(void);
(c C.
temă... (c C.
pid_t getppid(void);

an an
D a D a
3 m 13 m
01 s s
Lansarea unei comenzi
0
c)2 Co c)2 Co
( C. ( C.
#include <stdlib.h>
#
an int system(const char *command); an
D D
0 13 0
3
- folosește fork și exec pentru a lansa1comanda într-un proces
) 2 separat care execută /bin/sh -c2 command

)
(c - așteaptă terminarea comenzii și (c returnează starea acesteia
!257 !258

a a
sm sm
Co Co
C. C.
an an
D a D a
1 3 m 1 3 m
20 s 20 s
) Co ) Co
(c C. (c C.
an an
5. D D
13 Semnale
a Concepte
3 de bază a
0 sm 1 sm
) 2 Co ) 20 Co
(c C. (c C.
an an
D D
0 13 13
) 2 ) 20
(c (c
!259 !260
a a
Semnalele au identificatori și nume derivate din evenimentul
sm sm
pe care îl modelează. Exemple (man 7 signal, Linux):
Co Co
C. C.
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
Semnal
na SIGHUP
an
1 Term Hangup detected on controlling terminal
D a D a
or death of controlling process
1 3 m 3 m
01
SIGINT 2 Term Interrupt from keyboard (CTRL C)
s
0= o întrerupere de nivel software, s
Co Co
utilizată pentru a SIGQUIT 3 Core Quit from keyboard (CTRL \)
) 2 modela apariția de evenimente
. )2
SIGILL 4 Core Illegal Instruction
( c C asincrone
 (c
SIGABRT 6 Core
C.
Abort signal from abort(3)

→ semnalele sunt trimise


a n către procese

SIGFPE
SIGKILL
8
9
Core
Term an
Floating point exception
Kill signal
→ sursele de semnal D a de SIGSEGV 11 Core D
Invalid memory reference a
1 3 sunt procese sau sistemul
m 3 m
s 01 s
SIGPIPE 13 Term Broken pipe: write to pipe with no
operare (și pot20avea și cauze hardware)# o
)2 Co
readers
) C
(c C. c C.
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term( Termination signal

an an
SIGUSR1 30,10,16 Term User-defined signal 1
D SIGUSR2 31,12,17 Term User-defined signal 2
D
13 3
SIGCHLD 20,17,18 Ign Child stopped or terminated
0 1
20
SIGCONT 19,18,25 Cont Continue if stopped

)2
SIGSTOP 17,19,23 Stop Stop process
)
(c SIGTSTP
SIGTTIN
18,20,24
21,21,26
Stop
Stop
Stop typed at tty
(c
tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process

!261 !262

Un proces poate m a
specifica ce dorește să facă la primirea a
s s m
unui semnal:# o Comenzile kill,o killall
C .C C.
C
• să ignore an care nu pot fi ignorate: SIGKILL, SIGSTOP

semnalul
 n -SIGNAL PID
akill
D
→ există semnale
a D →Trimite un semnal către un proces a
3 semnalelor cu cauze hardware pot duce
→ ignorarea
1 m la comportamente nedefinite# 13 killall -SIGNAL command sm
0 s 0
) 2 trateze semnalul

•(csă . Co c)2 Co procesele care rulează comanda dată
→Trimite un semnal către toate
.
→ programul trebuie să definească pentru C acel proces o funcție de tratare a ( Ceste trimis semnalul SIGTERM
semnalului (signal handler)

a n an
→ Dacă nu este specificat un semnal,
→ nucleului sistemului de operareD D
a
trebuie să i se specifice care e funcția de tratare,
prin apeluri de genul signal() sau3 sigaction()
 3 a
1 sm 1 sm
20 va întrerupe procesul, va apela funcția
→ la apariția semnalului, nucleul
handler, iar după execuția)ei, procesul va continua din punctul în careC o instalată ca Exemple:
) 20 Co
c
→ apariția unui semnal (poate determina deblocarea unor apeluri
. a rămas

Csistem cu blocare ( c C .
(exemplu: read). În acest caz, apelul respectiv va returna codnde eroare (-1), iar
a kill -SIGUSR1 2346
an
variabila errno va fi setată pe EINTR# D killall -9 java
D
0 13 1 3
• să accepte comportamentul implicit ) 2 procesului#
pentru acel semnal

) 20
( c
→ pentru majoritatea semnalelor, acesta este terminarea
(c

!263 !264
a a
m m
Funcția sistemC os signal() C
Funcția signal()
os
C. C. pointer la funcție care primește 


an an
parametru de tip int
#include <signal.h> #include <signal.h>
D# a D# a
0 13 void (*signal(int sig, sm
void (*func)(int)))(int);
0 13 void (*signal(int sig, sm
void (*func)(int)))(int);

) 2 Co ) 2 Co
(c C. (c C.
valoarea returnată: 


an an
pointer la funcție care primește
parametru de tip int
D a D a
3 m 3 m
01 s 01 s
→ specifică, pentru procesul curent, modul de reacție la apariția unui semnal sau

c)2 Co c)2
instalează în sistem o funcție de tratare a semnalului

Co
( C. ( C.
→ parametrul sig este numărul semnalului pentru care se specifică modul de reacție


an an
→ parametrul func 


D - este pointer la funcția de tratare a semnalului;



D
13 3
- poate avea și valorile:

0 1
20
SIG_IGN : semnalul va fi ignorat

) 2 )
SIG_DFL : se setează comportamentul implicit pentru acel semnal

(c (c
→ funcția returnează vechea valoare a handler-ului pentru acel semnal (poate fi și
una din valorile SIG_IGN, SIG_DFL) sau SIG_ERR în caz de eroare.

!265 !266

a a
sm sm
Co Exemplu Co
C. C.
an an
D
După instalarea a
funcției de tratare a semnalului, orice apariție a D a
3 m 13
20
acelui 1 semnal către procesul care asinstalat-o ca handler va duce
o
Un0program
2 o sm părinte și fiu. Părintele
format din două procese,
lac)apelarea asincronă a funcției.
. C )
(procesul C
a) numără continuu începând de la zero, până în

( C C. de către utilizator. Întreruperea
(cmomentul în care este întrerupt
a n
Funcția handler primește ca argument numărul semnalului care a an semnalul SIGINT, în mod explicit
se face generând către proces
Dpoate fi instalată pentru a trataa mai D
(folosind comanda kill)3 sau implicit (apăsând Ctrl-C în aconsola în
3
sma defini smvizualizarea
apărut. O aceeași funcție
1
multe semnale, astfel20că acest parametru e util pentru 01 lansat în foreground). Pentru
o 2
care programul rulează o
) pentru diferite semnale. . C ) C
(c
comportamente diferite
C (c la fiecare pas procesul apelează
optimă a rezultatelor,
C . funcția
an
usleep() generând astfel o întârziere de câten1000 microsecunde.
a
D D
0 13 1 3
) 2 ) 20
(c (c
!267 !268
#include <stdio.h>
#include <unistd.h> a void process_a()
a
#include <sys/types.h> sm {
sm
Co Co
int i;
#include <signal.h> #
C. C.
#include <sys/wait.h> if (signal(SIGINT, process_a_ends) == SIG_ERR)
#
an an
{
pid_t child_pid = 0; printf("Error setting handler for SIGTERM\n");
int n = 0; D a D a
3 m 3
exit(1);
m
01 01
#
s }
s
)2 Co )2 Co
void process_a_ends(int sig) for (i = 0;;i++)
(c C. (c C.
{ {
int status; usleep(1000);
#
an if (i%10 == 0)
an
if (kill(child_pid, SIGUSR2) < 0)
D a if (kill(child_pid, SIGUSR1) < 0) D a
{ 3 m 3 m
01 01
{
printf("Error sending SIGUSR2 to child\n"); s s
)2 Co )2 Co
printf("Error sending SIGUSR1 to child\n");
exit(2); exit(2);
} ( c C. } ( c C.
an an
# }
/* waiting for the child to end */ }
# D D
13 3
#
wait(&status);
0 1
20
void process_b_writes(int sig)
printf("Child ended with code %d\n", WEXITSTATUS(status));
) 2 {
)
(c (c
# printf("Process b received SIGUSR1: %d\n", ++n);
printf("Process a ends.\n"); }
exit(0);
}
!269 !270

void process_b_ends(int sig)


{ a int main() a
printf("Process b ends.\n");sm { sm
exit(0);
Co Co
/* First, ignore the user signals, to prevent interrupting the

C. C.
} child process before setting the appropriate handlers */
# signal(SIGUSR1, SIG_IGN);
void process_b() an an
signal(SIGUSR2, SIG_IGN);
{ D a # D a
13 m
/* Ignoring SIGINT. Process b will end only when receives SIGUSR2 */
13 m
/* Creating the child process.A global variable is used to store
20 s 20 s
Co Co
if (signal(SIGINT, SIG_IGN) == SIG_ERR){ the child process ID in order to be able to use it from the signal
) )
(c C. (c C.
printf("Error ignoring SIGINT in process b\n"); handlers */
exit(3); if ((child_pid = fork()) < 0){
}
an an
printf("Error creating child process\n");
/* Setting the signal handlers */
D a exit(1);
D a
3
if (signal(SIGUSR1, process_b_writes) == SIG_ERR){
m } 3 m
01
printf("Error setting handler for SIGUSR1\n"); s 01
if (child_pid == 0){ /* child process */ s
exit(4);
c)2 Co process_b();
c)2 Co
( C. ( C.
} exit(0);

an an
if (signal(SIGUSR2, process_b_ends) == SIG_ERR){ }
printf("Error setting handler for SIGUSR2\n"); else /* parent process */
exit(5); D { D
}
0 13 process_a(); 13
#
) 2 }
) 20
(c (c
/* Infinite loop; process b only responds to signals */ /* this is still the parent code */
while(1) return 0;
; }
}
!271 !272
a a
m m
Funcția sistem C os sigaction() Co
s
C. . (exemple de opțiuni):
- câmpul sa_flags
C
an
→ recomandată a fi folosită în locul funcției signal() a n
D a D
SA_NOCLDSTOP - dacă signum e SIGCHLD, a procesul nu va primi un
1 3 m semnal3 SIGCHLD atunci când procesulmfiu este suspendat (de
1
#include
#0
<signal.h>
s 0 cu SIGSTOP), ci numai cândos acesta îsi termină execuția;
) 2int sigaction(int signum, const Co struct sigaction *act, #)2
exemplu

( c struct sigaction *oldact); C . c


(SA_NOMASK C . C in discutie nu va fi inclus
sau SA_NODEFER - semnalul
# a n an semnal in timpul executiei rutinei
in mod automat in sa_mask (comportamentul implicit este acela
funcția de D D
de a impiedica aparitia unui
#
3 tratare a se
funcția de tratare, dacă de tratare a semnalului3 respectiv); a
#
1 dorește varianta cum3 parametri 1 m
2{0 s #
20 s
Co în sa_flags) Co
# (SA_SIGINFO setat
struct sigaction
c) . )
SA_SIGINFO - se specifica atunci cand se doreste utilizarea
sa_siginfo in loc(cde sa_handler. .
lui
void ((*sa_handler)(int);
C C
void
sigset_t
(*sa_sigaction)(int, siginfo_t
sa_mask; a n *, void *); an
Dexecuției
semnalele care trebuie blocate în D
int sa_flags;
(*sa_restorer)(void); 1
3
timpul handlerului (mască de
1 3
void
0 20
) 2 pentru apelul sigaction() (de
biți, se folosesc funcțiile sigsetops)
};
cdiverse )
neutilizat (vechi) (
opțiuni
exemplu pentru a controla modul de comportare
(c
la apariția semnalului)
!273 !274

a Alte funcții a
sm sm
#include <sys/types.h>
Funcția sistem
. Co sigprocmask() Co
#include <signal.h>
C #
C.
a n an
int kill(pid_t pid, int sig);
#include D <signal.h> a D
→Trimite semnalul sig către procesula pid#
3 m *set, sigset_t *oldset); 13
int01 sm
#
s 0
Co o
sigprocmask(int how, const sigset_t
)2 2#
. ) C
c
( → citește sau schimbă masca Cde biți care specifică (c ##include <signal.h> C.
n
semnalele blocate ale firuluiade execuție apelant #
an
D a int raise(int sig); D
a
13 semnale specificat in argumentulm set e 
 3 m
how:

SIG_BLOCK - setul 0de s 1 s
adăugat la setul
) 2 curent de semnale blocate C
o →Trimite semnalul
) 20sig către procesul curent# Co
SIG_UNBLOCK - (csetul de semnale specificat in. argumentul set e 
 (c
șters din setul curent de semnale blocate
C
# C.
an e inlocuit 
 an
#
SIG_SETMASK - setul curent de semnale blocate
cu setul din argumentul set D #include <unistd.h>
D

 3
1conform
#
13
0 0
unsigned int alarm(unsigned int seconds);
)2 )2
set: setul de semnale folosit de apel opțiunii how


oldset: dacă nu e NULL, aici va fi


c
( memorat vechiul set de 
 (c seconds secunde, un semnal 

→ Instalează o alarmă; după ce trec
semnale blocate SIGALRM va fi generat către procesul curent
!275 !276
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
an an
D Pipes
6. a Crearea 3șiD utilizarea pipe-urilor a
3 m
01 s 01 sm
c)2 Co ) 2 C o
( C. (c C.
an an
D D
0 13 0 13
) 2 )2
(c (c
!277 !278

a a
sm sm
Co Co
C. C.
Pipe Pipe
an an
D a D a
1→3 m 1 3 m
0 s 20 s
)2 
 Co Co
o primitivă de comunicare între procese UNIX

. )
c (cProces A C.
Proces B
( C
→ se constituie într-o an “conductă” de date prin care 
 an
două procese își3 pot D trimite date a D a
1 m 3 m
20 s 01 s
c) . Co c)2 Co
( C ( C.
an an
D D
13 13
) 20 ) 20
(c (c
!279 !280
a a
sm sm
Co Co
C. .
Pipe Apelul sistem pipe()
C
an an
D a D a
3 m 3 #include <unistd.h>
m
01 s 01 # s
)2 Co )2 Co
int pipe(int pipefd[2]);
(cProces A C. (c C.
Proces B
capăt de citire capăt de scriere
an an
D a D a
3 m → Creează un pipe
 13
fd[0] 01 sfd[1] 0 sm
c)2 Co 2
→ completează tabloul
)
o
C pipe-ului:

dat ca argument cu capetele
( C. (c de citire

- pipefd[0]: capătul C .
n descriptori de fișier

- Capetele de citire și scriere sunt modelate aca - pipefd[1]: capătul de scriere an
D D

 3 → din momentul creării, procesul curent13va putea scrie și citi din
- Pipe-ul este unidirecțional 01 pipe, folosind apelurile sistem read() 2și0 write()
)2 )
(c (c
!281 !282

a a
osm procesul curent va putea scrie și citi din
→ din momentul creării, sm procesul curent va putea scrie și citi din
→ din momentul creării,
o
C
pipe, folosind apelurile sistem read() și write() C
pipe, folosind apelurile sistem read() și write()
C. C.
an an
D a D a
13 m 1→3 Capetele pipe-ului sunt tratatesmca descriptori de fișier

20 s 0
Co Co
) 2 → Descriptorii de fișier sunt.moșteniți

?
) de procesul fiu după
(c C. ( c fork()
 C
an an
D a D a
3 m 3 m
01 1
Și pipe-ul este o structură de date care este moștenită de un
s 0 în momentul creării procesului s
c)2 Co 2
proces de la părinte,
) C o
( C. (c C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!283 !284
...

a int pfd[2]; a
sm int pid;
sm
Co Co
...
.
Cum se folosește
C
pipe() if(pipe(pfd)<0)

C.
{ printf("Eroare la crearea pipe-ului\n”); exit(1); }
an ...
an
D e creat de un proces

→ pipe-ul a D
if((pid=fork())<0)

a
3
→1procesul m 3
{ printf("Eroare la fork\n”); exit(1); }
m
inițial apelează fork(): sfiul
0 va avea acces complet la capetele o
va moșteni pipe-ul, 

01 s
) 2
deci
. C lui (pentru scriere și citire)
 )2
if(pid==0) /* procesul fiu */ Co
(c → cele două procese (părinte, C fiu) își stabilesc direcția de utilizare
 (c
{
C.
n
a pipe-ului: un proces va ascrie, celălalt doar va citi
 an
close(pfd[0]); /*inchide capatul de citire => va scrie in pipe*/
...
→ stabilirea direcției deDutilizare: fiecare proces închide acapătul 
 D a
3 3
write(pfd[1],buff,len); /* operatie de scriere in pipe */
01
pe care nu îl folosește sm o
...
01 sm
c)2 C )2
close(pfd[1]); /* la sfarsit inchide si capatul utilizat */
c Co
( C. ( C.
exit(0);
}
Proces
an Proces else /* procesul parinte */ an
părinte D fiu { D
13 3
capăt de citire capăt de scriere
0 1
close(pfd[1]);/*inchide capatul de scriere => va citi din pipe*/

) 2 ...
) 20
read(pfd[0],buff,len); /* operatie de citire din pipe */
fd[0] (c fd[1] ... (c
close(pfd[0]); /* la sfarsit inchide si capatul utilizat */
exit(0);
!285 } !286

a a
s m s m
Observații Co Observații Co
C. C. pot fi moștenite de mai multe procese (tot
→ Dacă anun proces citește dintr-un pipe pentru care capătul an de procese al procesului care a creat pipe-ul)

→ Pipe-urile
D
de 3scriere e închis, operația read() vaa returna 0#
D
subarborele a
sm →13Un proces trebuie să închidă întotdeauna
m
2 01 o 2 0 o s capetele de pipe
) → Dacă un proces scrie într-un Cpipe al cărui capăt de citire ) pe care nu le folosește. Dacă C
nu folosește deloc pipe-ul,
(c este închis, operația write() va C. eșua, astfel:
 (c trebuie să le închidă pe amândouă

C .
n semnalul SIGPIPE

- procesul respectiv vaaprimi → Recomandare importantă: an procesul/procesele care scriu în
D
- dacă procesul nu 3tratează, blochează sau ignoră a pipe și procesul/proceseleD care citesc trebuie să își stabilească
a
3
1
semnalul SIGPIPE,0procesul osm în mod clar, la orice01moment, cantitatea și semnificația smdatelor
Co
va fi terminat; în caz contrar,
2 C )2
valoarea returnată
( c) de write() va fi -1, iar errno va
C . avea transmise

( c C .
valoarea EPIPE
an a n
D Exemplu: procesul A transmite n octeți; procesul D B care citește
13 3
20
trebuie să citească (aștepte) exact n octeti:
2 01 nici mai mult, nici mai
) puțin )
(c (c
!287 !288
a a
Exemplu: procesul
osmA transmite n octeți; procesul B care citește De ce trebuie închise
m
os întotdeauna capetele de pipe nefolosite ?
C (aștepte) exact n octeti: nici mai mult, nici mai
trebuie să citească
. . C
puțin C C
n
a
 an 
 A părinte pentru B, A a creat pipe-ul înainte de fork()

Explicație:
D
Explicație:
a octeți,funcția read() s-ar D
- Fie procesul
a
1 3 procesul B citește (așteaptă) maimmulți
- dacă 3
- A1citește din pipe, B scrie în pipe
 m
0 bloca în așteptarea unor date care s -0A „uită” să închidă capătul de scriere# s
Co “transmisie” ulterioară ca
)A2nu mai trimite) sau va citi date dintr-o )2 Co
putea nu vor mai veni niciodată (dacă
c
( aparținând celei curente# C . c .
( - A citește datele din pipe într-unCciclu#
an n
abuff,
D atunci datele citite la etapa curentă
- dacă B citește mai puțini octeți, a vor while((n=read(pfd[0], D no_of_bytes))>0) {
a
3 rămâne date necitite care probabil
fi incomplete, iar în pipe1vor m …
1 3 m
os s
vor fi citite
în viitor ca aparținând,20în mod eronat, etapei respective a comunicării# 20 o
}

(c
) .C
C la blocarea - La un moment (dat,c B își termină transmisia de dateC. C
)
- există posibilitatea ca astfel de erori de protocol să ducă
unuia sau mai multor procese (așteaptă la nesfârșit andate care nu vor mai an
D D
veni niciodată)# 3 A se blochează la nesfârșit în read(), deoarece
13un proces care, teoretic,

read() nu va returna 

01
- sigur, sunt cazuri în care se poate ignora2această recomandare, dar
zero (“sfârșit de fișier”) câtă vreme mai există0
) ) 2 de scriere deschis): acest
(c (c
ar putea transmite date în pipe (are capătul
trebuie să știți exact ce faceți în acel caz proces e chiar procesul A

!289 !290

a a
s m sm
Nu uitați ! Co Co
C. C.
an pipe-ul înainte de fork()

→Dcreați an
a D a
3 închideți toate capetele nefolosite,
1→ m ale tuturor pipe-urilor 13 m
0 în procesul respectiv
 o
s 20 s
) 2 vizibile C ) Co
( c C. imediat după ce nu mai e
→ închideți și capetele folosite, (c C.
nevoie de ele (de ce ?)
 n
a
→ stabiliți un protocolDprecis de comunicare între procesele
an
a D
Duplicarea și redirectarea descriptorilor de a fișier
care scriu și citesc13din pipe (câți octeți se scriu la un
sm un 1 3
sm
)
moment dat, exact 20 atâția trebuie citiți la momentul
Co respectiv ) 20 Co
( c
de către procesul cititor) C . ( c C .
an an
D D
13 1 3
) 20 ) 20
(c (c
!291 !292
a a
m m
os s
Exemplu
Co
Duplicarea descriptorilor de fișier
C
C. <unistd.h> C.
n
#include
# a an
D a D a
1 3int dup(int oldfd); m 3 m
20 o s 01 ... s
)→ . C )2 Co
fd=open("Fisier.txt", O_WRONLY);
c
( duplică descriptorul oldfd, creând (c C.
...
C un nou descriptor care va
fd1=dup(fd);
n
pointa spre același fișier; descriptorul
a indicatorul nou e returnat de funcție
 ... an
→ ambii descriptori vor partaja D poziției curentea în D
write(fd1, ”Un text”, 8); a
3 3
1 sm 01 m
...
fișier, flag-urile de deschidere
0 a fișierului etc.

o s
→ descriptorul nou 2
) alocat va fi întotdeauna cel mai. Cmic )2 Co
(c (nedeschis)
descriptor disponibil C ( c C.
an an
D D
13 13
) 20 ) 20
(c (c
!293 !294

a a
sm Redirectarea descriptorilorsm de fișier
C o
Duplicarea descriptorilor de fișier cu dup2()
C o
C. <unistd.h> C. unei noi semnificații unui descriptor existent,
→ acordarea
n
#include
# a pentruana pointa spre un alt fișier decât cel pe care îl indica
D
int dup2(int oldfd, int newfd);a D a
0 13 sm 0
3
1inițial
 sm
2 o → e un caz particular de duplicare

Co ce indică noul fișier,
) C un nou descriptor care va ) 2 → se face duplicând descriptorul
C.
(c → duplică descriptorul oldfd, creând ( c C .
pointa spre același fișier; 
 n asigurându-ne că valoarea n obținută din duplicare e chiar
a a
→ descriptorul nou va avea D valoarea dată de argumentulanewfd
 cea a descriptorului care D se dorește a fi redirectat# a
3 alocat deja unui fișiersm 3
→ dacă newfd era un1descriptor
2 0 o
deschis, De exemplu, o duplicare
2 01 care face ca descriptorului o smcu
C
) închis, acordându-i-se apoi descriptorului
acesta va fi mai întâi numărul 1 să îic)corespundă un fișier de pe disc. reprezintă C
noua semnificație (c 
 C . (
practic redirectarea ieșirii standard
 C
→ returnează noul descriptor alocat (chiar newfd)an n
→ funcțiile care scriu “la ieșirea standard” (exemplu:aprintf) scriu de fapt
D în descriptorul 1 (STDOUT_FILENO); redirectând D
13 1 3 care
acest descriptor,

20 0
efectul acestor funcții se va vedea în fișierul spre s-a redirectat
) ) 2
(c (c
!295 !296
a a
sm
Exemplu de redirectare a ieșirii standard
o os
m
C Din nou Cdespre pipe…
C. C .
an an
D ... a D aca descriptori de fișier

3 m 3→ Capetele pipe-ului sunt tratate m
01 1
fd=open("Fisier.txt", O_WRONLY);
s 0 s
)2 Co )2 Co
...

(c C. c .
if((newfd=dup2(fd,1))<0)
{ ( pot fi utilizate în C
duplicări sau redirectări
an n
printf("Eroare la dup2\n");
a
exit(1);
D a D a
} 3 m 3 m
...
01 s → de exemplu, 0pot 1 fi redirectate 
 s
)2
printf("ABCD");
c Co ) 2 spre capătul de scriere al .unui
- ieșirea standard:
c Co pipe

( C. (
...
- intrarea standard: dinspre capătul de citire C al unui pipe
an a n
D D
0 13 0 13
) 2 )2
(c (c
!297 !298

a a
sm Exemplu sm
Exemplu . Co Co
C C.
an an
D a void main() D a
13 m {
13 m
20 s 20 s
Co Co
int pfd[2];
) → conectarea prin pipe. a două procese, unul din )
int pid;
(c C (cFILE *stream;
C.
an an
ele rulând (exec) un program citit de pe disc #
...
D a D a
3 m
if(pipe(pfd)<0)
3 m
01 s {
01 s
c)2 Co c)2
printf("Eroare la crearea pipe-ului\n");
Co
( C. ( C.
exit(1);
}
an ... an
D if((pid=fork())<0) D
0 13 {
13
) 2 printf("Eroare la fork\n");
exit(1); ) 20
(c } (c
!299 !300
if(pid==0) /* procesul fiu */
{ a a
sm m
os
close(pfd[0]); /* inchide capatul de citire; */
Co
/* procesul va scrie in pipe */ Observație: Cexemplul folosește funcția fdopen()
C. .
...
dup2(pfd[1],1); /* redirecteaza iesirea standard spre pipe*/ C
... an n
a#include <stdio.h>
D a
execlp("ls","ls","-l",NULL); /* procesul va rula comanda ls*/ D #FILE *fdopen(int fd, const achar *mode);
3 m 13
01
printf("Eroare la exec\n);
s 0 sm
)2 Co 2 o
}
) → asociază un stream de .tipC FILE * (gestionat de funcțiile
(c C. (c
else /* procesul parinte */

{ C deschis spre care pointează
an
close(pfd[1]); /* inchide capatul de scriere; */ de bibliotecă stdio) unuin fișier
a
D
/* procesul va citi din pipe */
a descriptorul (specificDfuncțiilor sistem) fd

a nu
... 3 m 3 m
→ în final, fișierul1respectiv va trebui închis cu fclose(),
stream=fdopen(pfd[0],"r"); 01 s s
20 a se face corect toate de-alocările
)2
/* deschide un stream (FILE *) pentru capatul de citire */
c Co cu close() (pentru
c)
o de
Cgestionate
while(...) 

{ ... 

( C. resurse, de(exemplu .
pentru a se goli buffer-ele
C
fscanf(stream,”%s”,string);
 an de biblioteca stdio). Funcția fclose() va apela
a n ea close() în
/* citire din pipe, folosind stream-ul asociat */ D final.
 D
...
0 13 0
3
→ opțiunile din mode trebuie să fie 1compatibile cu modul
}
) 2 în care a fost deschis descriptorul2 fd
)
...
(c
close(pfd[0]); /* la sfarsit inchide si capatul utilizat */ (c
exit(0);
}
} !301 !302

a #include <stdio.h> a
sm #include <unistd.h>
sm /* parinte */

Co Co
#include <sys/types.h>
#include <sys/wait.h>
if((pid_b=fork())<0)
#include <stdlib.h>
Observație.
C.
{
#
C
printf("Eroare la fork\n");
# exit(1);

an an
int pfd[2];
}
#
#
D a D
int main(int argc, char *argv[])
if(pid_b==0) /* b */
a
3→ pipe-ul este primitiva de comunicare 3
{
între procese pe {

0 1 smcomenzi atunci când 1int pid_a, pid_b;


sm close(pfd[1]);

care o folosește interpretorul de


Co
) 2 înlănțuie comenzi folosind .operatorul ) 20 if(argc != 3)
C#o
dup2(pfd[0],0);

c (c C.
{
‘ | ’# execlp(argv[2], argv[2], NULL);
( C
printf("Utilizare: %s prog1 prog2\n",
argv[0]);
printf("Eroare la exec\n");
exit(1);

anrealizează (în mod simplificat) an


exit(1);
}
Exercițiu: program care #
}

D
efectul liniei de comandă:# a if(pipe(pfd)<0)
D /* b */
a
3 3
close(pfd[0]);

m m
{

1 01
close(pfd[1]);

s s
printf("Eroare la crearea pipe-ului

20 Co Co
\n");

)2
/* Procesul parinte preia rezultatele */
prog1 | prog2 exit(1);

c) . c C.
}

( (
int status;
#
C if((pid_a=fork())<0)
waitpid(pid_a, &status, 0);

an an
{
printf("Eroare la fork\n");
waitpid(pid_b, &status, 0);

D D
exit(1);
}

3 3
/*varianta simplificata de tratare a
if(pid_a==0) /* a */
1 1
valorii de return*/

20 20
{
if(WIFEXITED(status))
close(pfd[0]);
return WEXITSTATUS(status);

) else
)
(c (c
dup2(pfd[1],1);
return 1;
#
execlp(argv[1], argv[1], NULL);
return 0;
printf("Eroare la exec\n");
}
exit(1);
}

!303 !304
a a
sm sm
Co Co
C. .
Named pipes
C
an an
D a D a
3 m 3 pipe-uri care pot fi create explicit
01 s →1sunt
0 sm din linie de comandă
)2 Co ) 2
sau programe, acordându-li-se o
. C ca fișiere speciale, asupra
nume

(c C. (c → sunt vizibile în sistemul deCfișiere
an cărora se pot efectua operații an obișnuite de scriere și citire

D
Named pipes a → operațiile de scriere și D a FIFO 

13 m 1 3pot citire se fac respectând principiul
m
0 s → pipe-urile cu nume 0 fi folosite explicit, de exemplus în script-
c)2 Co c)
uri pentru a realiza 2comunicarea între procese, C o
comenzi, pentru
( C. a înlocui fișiere (temporare etc. C .
an an
D D
0 13 3
01 cu funcția pipe() ) se mai
Observație: pipe-urile discutate anterior (create
) 2 2
(c numesc și pipe-uri anonime c) (
!305 !306

a a
sm sm
.
Crearea pipe-urilor Co
cu nume Exemplu . Co
C C
n [-m mode] nume

amkfifo an
D
 a D a
13 m 13 m
20 s
în care mode: drepturile de acces la fișierul special creat
20
$ mkfifo pipe1 s
) Co ) $ wc -l < pipe1 > rezultat.txt &
Co
(c C. (c C.
mkfifo --mode=0766 ~/tmp_pipe [1] 768
$ ls -l > pipe1
an [1]+ Done an
wc -l < pipe1 > rezultat.txt
D a $ cat rezultat.txt D a
3 ◆ m 3 m
01 01
28
s s
c)2 Co c)2 Co
( <sys/types.h>
#include C. ( C.
#include <sys/stat.h>
an an
# D D
int mkfifo(const char *pathname, mode_t mode);
0 13 13
) 2 ) 20
(c (c
!307 !308
a a
sm s m
Co Multitasking Co
C. = abilitateaCde . a efectua mai multe activități în același
an timp an
D a D a
3 m 3 m
01 s 0 1 s
)2 Co )2 Co
(c C. ( c C .
an a n
7. Fire D D
1 3 de execuție sma 1 3 m
a
20 o 20 s
) C ) Co
(c C. ( c C .
an an
D D
0 13 1 3
) 2 ) 20
(c (c
!309 !310

a a
s m s m
Multitasking Co Multitasking Co
= abilitateaCde. a efectua mai multe activități în același = abilitateaCde. a efectua mai multe activități în același
timp an timp an
D a D a
0 13 sm 0 13 sm
c)2 . Co c)2 . Co
( C ( C
→ Procese an → Procese# an
D a D a
1 3 m 1 3 m
20 s 20 de execuție s
Co Co
→ Fire
c) . c) .
( C ( C
an an
D D
13 1 3
) 20 ) 20
(c (c
!311 !312
a Pot exista mai multeafire de execuție în același proces

m m
Fir de execuție
C os (thread)
 s execută părți diferite din cod, sau chiar același cod

→ rulează în paraleloși
C

 C. C.
→ partajează memoria procesului, dar au stive separate
 Consecințe?
n
= oa execuție secvențială în cadrul unui proces La creare,aun n proces are un singur thread (firul principal)
D a D a
1 3 m 1 3 m
0 s 0 s
c)2 Stivă. Co c)2 Stivă. Co Stivă
 Stivă
 Stivă

( C ( C fir fir fir

a n a n
D a D a
1 3 m 1 3 m
20 s 20 s
c) Date . Co c) Date . Co
( C ( C
an an
D D
13 1 3
Cod
) 20 Cod
) 20
(c (c
!313 !314

a a
sm Observații:# sm
Co
. de procese #
. Co
Avantaje C
față C proces este format dintr-un singur fir de execuție.

→ La creare, un
an n
a de execuție din cadrul unui proces rulează în paralel. 

→ Toate firele
D a D se termină:

→ Un proces a
3 m 3
20
1 s 01 firul său principal se termină
 osm
Co resurse în sistem pentru
# - când
) → Este nevoie de mai puține 2
# )- dacă un fir apelează exit()
 C
c .
( gestionarea unui fir de execuție

C c C. firul principal)

# ( - când se termină funcția main() (deci
a n an netratat

# - dacă procesul primește un semnal
→ Trecerea, la execuție,
D de la un fir la altul e mai
a rapidă
 # …
 D a
3 m 13din mai multe fire de execuție se
2 01 pot comunica ușor între
→ Firele de execuție
os
ele prin → Dacă un proces format
2 0 osmtermină, toate
memoria comună) C ) se vor termina.#
firele de execuție ale sale C
(c C. → Deoarece împart(caceeași zonă de date, firele unui .
C proces vor folosi în
an comun toate variabilele globale. Variabilele localeanși parametrii de funcții
D D
13 3
nu sunt partajate, deoarece stivele firelor de execuție sunt separate.#
0 1
20indiferent de firul de execuție
→ Multe apeluri sistem și funcții de bibliotecă au efect la nivelul întregului
)2 )
(c (c sleep().#
proces, deci asupra tuturor firelor acestuia,
din care au fost apelate. Exemplu: funcția

!315 !316
a a
sm m
Co Identificarea C osfirelor de execuție

.
C cu fire de execuție se folosește biblioteca pthreads. 
 
 C.
Notă: pentru lucrul
an an
→ identificatori unici în cadrul procesului respectiv

 D a D a
→ de 1 3 aceasta nu e activată legată (linked)
obicei, m automat de gcc* la codul 1 3 m
0 os 0 #include <pthread.h>o
s
)2 )2
obiect al programului, drept urmare trebuie cerut acest lucru în mod explicit
C noi de UNIX și gcc, suportul pentru
-lpthread). În unele versiuni. mai C
c
(fire de execuție e inclus direct în biblioteca ( c C.
(opțiunea #
C pthread_t pthread_self(void);
-pthread
 a n glib și e activat folosind opțiunea 

an
→ obține identificatorul
D a D firului de execuție curent

a

1 3 m → definiția3 m
efectivă a tipului pthread_t depinde de implementare,
fi1o structură de date
0
→ funcțiile din această bibliotecă
o s poate 0 s
Co
returnează, de regulă, 0 în cazul în care s-au
) 2 C )2
(c C. c .
efectuat corect și un cod de eroare altfel
( C
an an
D D
0 13 1 3
) 2 ) 20
(c (c
*de fapt, de editorul de legături

!317 !318

a a
sm sm
Crearea firelor
. Co de execuție
 Alte funcții. Co
C locație la care funcția C
an n
atribute pentru creare
va completa a
D identificatorul a firului
(sau NULL pentru a
#3 D
#include <pthread.h>
a
13#include <pthread.h> nou creat m m void **value_ptr);
seta atributele implicite)
0 s 0 1int pthread_join(pthread_t thread, s
) 2 int Co )2
o execuție cu identificatorul thread
#
→ așteaptă terminarea firuluiCde
( c pthread_create( pthread_t
.
C *restrict thread, ( c .
Cdacă valoarea de terminare nu e dorită.

și îi preia valoarea de terminare la adresa value_ptr. Argumentul
const n value_ptr poate fi NULL, n
void a*(*start_routine)(void *), a
pthread_attr_t *restrict attr,
→ poate fi apelată de orice fir de execuție din proces

D *restrict arg); a eDchiar firul așteptat sau există o dependență
a
3
void
1 m → dacă apelantul
1 3 m
0 transmis funcției s
oexecuție(corpul) 20 s
Co
funcția principală circulară, funcția returnează un cod de eroare
) 2
argumentul firului deC (ea poate,
)
( c C .
evident, apela alte funcții) (
#include <pthread.h>
c C .
an #
a n
→ creează un fir de execuție care va fi imediat D lansat în execuție void pthread_exit(void *value_ptr); D

0
apelându-se funcția start_routine cu parametrul 13 arg. → termină firul de execuție curent setând
0 13valoarea de terminare la
2 )2
c)
value_ptr.
exprimat direct folosindu-l pe acesta (cum ar fi p + 1) (este singurul pointer spre zona respectivă de
Notă: cuvântul restrict spune că, pe durata de viață a pointerului respectiv p, doar el sau un pointer
(c
memorie. Informația e utilizată de compilator pentru optimizări și e responsabilitatea programatorului să
se asigire că ea rămâne adevărată în cod.
!319 !320
#include <stdio.h>
a a
#include <stdlib.h> Exemplu
sm m
os
#include <pthread.h>

Co
#
Alte funcții. . C
void *thread_code(void *arg)

C {
int Ci;
a n n
afor(i=0;
#3 D D printf("%s",
#include <pthread.h>
a 3
i<1000; i++)
(char *)arg); a
1pthread_t pthread_self(void);sm 1 printf("\n"); sm
0 0 #
c)2 Co de execuție curent
→ returnează identificatorul firului
. c) 2 } return (void *)( *((char *)arg). Co- 'A' + 1);
( C ( # C
a n a n
int main(int argc, char *argv[])
D a {
D a
1 3 m
pthread_t th1, th2;
1 3 m
20 s 20&th1, NULL, thread_code, (void*) "A");
void *ret1, *ret2;
s
Co Co
#include <pthread.h>
#
c) . c)
pthread_create(
.
(
int pthread_equal(pthread_t t1, pthread_t
C t2); (
pthread_create( &th2, NULL, thread_code,
C
(void*) "B");

→ returnează non-zero dacă t1 și t2 reprezintăanacelași fir de printf("Threads created.\n");


an
D D
execuție, altfel returnează zero.
13 pthread_join(th1, &ret1);
1 3
20 20 (int)ret1);
pthread_join(th2, &ret2);

) )
(c printf("Thread 2 ends returning:(c%d.\n", (int)ret2);
printf("Thread 1 ends returning: %d.\n",

exit(0);

return 0;
!321 } !322

#include <stdio.h>
#include <stdlib.h> a Alt exemplu. Există vreo greșeală ? a
s m
#include <pthread.h>
sm
Co Co
#
void *thread_code(void *arg)
{
int i; C
. C .
an i<1000;*((char n are codul următor:
Ce efect
for(i=0; i++)
a
D printf("%c", *)arg) );
a D a
#13 3
printf("\n");
sm + 1); 1 sm

?
0 return (void *)( *((char *)arg) -o'A'
20
)2 } Co
for (i=0; i<100; i++)
C ) pthread_create(&th[i], NULL, thread_code, NULL);
(c #int main(int argc, char *argv[])C. (c C.
{
an an
pthread_t th1, th2;
D a D a
void *ret1, *ret2;
1 3 m 3 m
s 01 s

?
20
char c;

c) . Co c)2 Co
C.
c='A';
(
pthread_create( &th1, NULL, thread_code, &c);
C (
pthread_create( &th2, NULL, thread_code, &c); n
an
c='B';
a
D D
printf("Threads created.\n");
13 13
20 (int)ret1); 20
pthread_join(th1, &ret1);
pthread_join(th2, &ret2);
) )
(c (int)ret2); (c
printf("Thread 1 ends returning: %d.\n",
printf("Thread 2 ends returning: %d.\n",
exit(0);

return 0;
} !323 !324
#
a a
m sm“detached”
os de execuție
Fire de execuție
Tipuri de fire
C C o
C. C.
an
• Djoinable
 n de execuție joinable poate fi transformat în
→ un afir
a D a
3 → valoarea returnată la terminare
m
poate fi preluată 3
detached folosind:
1
0 de alt thread
 s 0 1 sm
) 2 → resursele ocupate. de Co fir nu sunt eliberate până )2 #include <pthread.h>
C
o
( c C ( c 

C.
a n
când un alt fir îi preia starea cu join()# an
int pthread_detach(pthread_t thread);
D a D a
1 3 m
Exemplu:
1 3 m
s s
• detached
c) 20 . Co 20
pthread_detach(pthread_self());
c) . Co
→ nu li se( poate prelua o valoare de C terminare
 ( C
→ resursele ocupate se eliberează n
a imediat ce firul → un fir de execuție poate fi creat direct an detached
D D
se încheie
0 13 setând atribute în parametrul attr al
1 3 funcției
)2 pthread_create().
) 20
În majoritatea implementărilor, (c pthread_create() creează (c
în mod implicit fire de execuție joinable
!325 !326

a a
sm
Gestionarea atributelor pentru pthread_create()
o sm
C Exemplu
Co
C. C.
#include <pthread.h>

an
int pthread_attr_init(pthread_attr_t *attr); an
# D a D a
1 3 m
…

13 m
20 s
int pthread_attr_setdetachstate(pthread_attr_t *attr,
0
pthread_attr_t attr;
 s
Co 2… Co
int detachstate);
) )
(c C. (c C.
# pthread_attr_init(&attr);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
an int *detachstate); … an
# D a pthread_create(…); D a
3
int pthread_attr_destroy(pthread_attr_t *attr);
m 3 m
01 01

s s
)2 Co )2 Co
Notă: există și alte atribute, dar nu fac obiectul acestei discuții pthread_attr_destroy(&attr);


(c C. c C.

Pași:
 (
an cu pthread_attr_init()

# 1. Se inițializează o variabilă pentru atribute an
D pthread_attr_set…() D
3
# 2. Se setează atributul dorit apelând funcția
1 13
corespunzătoare

) 20 ) 20
(c
# 3. După ce firul a fost creat, se eliberează resursele ocupate de (c
variabila pentru atribute, apelând pthread_attr_destroy().
!327 !328
a a
sm sm
Observații Co Co
C. . pipes
Recapitulare:
C
an → programan format din 3 procese, apelat în linia de comandă
→D Odată ce un fir de execuție a fost a marcat ca detached, D a
3 3
astfel:#
2 01 → Setarea atributului detached smse referă doar la modul în
nu mai poate fi făcut din nou joinable#
o 01
osm
) .C )2 program n C
fișier

(c care sistemul elibereazăCresursele alocate thread-ului. ( c C.
Firele detached nu rămân
a n în sistem după terminarea
an
procesului
 D a → procesul A: foloseșteDo comandă externă pentru a afișa a
3
→ Pentru fiecare1fir creat într-un proces (în afarăsm 1 3 dat, pe care le trimite procesului
m
20 apelat ori pthread_join(), ori Co
de cel ultimele n linii din fișierul
2 0 100 numere aleatoare procesului os C

)
principal) trebuie → procesul B: trimite
) C C și apoi
(c
pthread_detach() C. c
primește rezultatele .
( finale de la acesta, pe careCle afișează

an → procesul C preia, pe rând, de la A și B, datelean și:

D - numără literele mici primite de la A
 D
0 13 3
- găsește numărul par maxim primit01de la B

)2 ) 2 ce sunt disponibile
- trimite către B rezultatele, imediat
(c (c
!329 !330

a a
sm sm
Co Co
C. A C. A
an an
D aC D aC
0 13 sm 0 13 sm
o o
)2 C )2 C
(c B C. (c B C.
an
→ procesul A: foloseșteDo comandă externă pentru a afișa
an
→ procesul A: foloseșteDo comandă externă pentru a afișa
a
3 dat, pe care le trimite procesului a
3 dat, pe care le trimite procesului
1
ultimele n linii din fișierul
0 100 numere aleatoare procesului sm C
 1
ultimele n linii din fișierul
0 100 numere aleatoare procesului sm C

→ procesul B: trimite 2 C o → procesul B: trimite 2 C o
c) .
C și apoi
c) .
C și apoi
( finale de la acesta, pe careCle afișează

primește rezultatele ( finale de la acesta, pe careCle afișează

primește rezultatele
→ procesul C preia, pe rând, de la A și B, datelean și:
 → procesul C preia, pe rând, de la A și B, datelean și:

- numără literele mici primite de la A
 D - numără literele mici primite de la A
 D
3
- găsește numărul par maxim primit01de la B

3
- găsește numărul par maxim primit01de la B

) 2 ce sunt disponibile
- trimite către B rezultatele, imediat ) 2 ce sunt disponibile
- trimite către B rezultatele, imediat
(c (c
!331 !332
a a
sm sm
Co Co
C. A C. A
an an
D aC D aC
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c B C. (c B C.
→ procesul A: foloseșteDo comandă externă pentru a afișa
an an
→ procesul A: foloseșteDo comandă externă pentru a afișa
a
3 dat, pe care le trimite procesului a
3 dat, pe care le trimite procesului
1
ultimele n linii din fișierul
0 100 numere aleatoare procesului sm C
 1
ultimele n linii din fișierul
0 100 numere aleatoare procesului sm C

→ procesul B: trimite 2 C o → procesul B: trimite 2 C o
c) .
C și apoi
c) .
C și apoi
( finale de la acesta, pe careCle afișează

primește rezultatele ( finale de la acesta, pe careCle afișează

primește rezultatele
→ procesul C preia, pe rând, de la A și B, datelean și:
 → procesul C preia, pe rând, de la A și B, datelean și:

- numără literele mici primite de la A
 D - numără literele mici primite de la A
 D
3
- găsește numărul par maxim primit01de la B

3
- găsește numărul par maxim primit01de la B

) 2 ce sunt disponibile
- trimite către B rezultatele, imediat ) 2 ce sunt disponibile
- trimite către B rezultatele, imediat
(c (c
!333 !334

a a
#include <stdio.h> {
#include <unistd.h> if(num%2 == 0)
#include <ctype.h> {

m m
#include <sys/types.h> if(num >= max) /* b */

s s
#include <sys/wait.h> max = num; if(pipe(pipe_bc)<0)

Co Co
#include <stdlib.h> } {
#include <limits.h> } printf("Eroare la crearea pipe-ului b-c\n");

#
#include <time.h>
{
else
}
exit(1);

C. .
#
int pipe_ac[2], pipe_bc[2], results_pipe[2]; res.type = MAXRANDOM;
res.data=max; if((pid_c=fork())<0)
Cum ați rezolva următoarea problemă ?
C
enum processes { COUNTER, MAXRANDOM }; {
struct result_data { if(write(results_pipe[1], &res, sizeof(struct printf("Eroare la fork\n");

an an
enum processes type;; result_data))<0) exit(1);
long data; { }

#
};
\n");
printf("Eroare la scriere in pipe rezultate
if(pid_c==0) /* c */

D a D a
void process_c() exit(1); {
{ } process_c();

3 3
int count = 0, n1, n2, index; end2=1; exit(0);

1 m →1Program m
int num; } }

format din mai multe procese.


s s
long max = LONG_MIN;

20 20
int end1=0, end2=0; } /* b */

Co Co
char c;
struct result_data res; # } /* while */ close(pipe_bc[0]);
close(pipe_ac[0]); close(pipe_ac[1]);

) ) Un număr variabil de procese


close(pipe_ac[0]); close(results_pipe[1]);

(c C. (c → . „producător” care generează,


close(pipe_ac[1]); close(pipe_bc[0]);
close(pipe_bc[1]); close(results_pipe[1]); unsigned int i;

concurent, date. ProducătoriiCsunt de mai multe tipuri (categorii)


close(results_pipe[0]);
##
} long num;
srand((int)time(NULL));
for(i=0; i<100; i++)

an an
while( !(end1 && end2) ) int main(int argc, char *argv[]) {
{ { num = 3*rand();
if(!end1) int pid_a, pid_c; if(write(pipe_bc[1], &num, sizeof(long))<0)

clar definite.

D D
{ {

a ade tipuri
if((n1=read(pipe_ac[0], &c, sizeof(char)))<0) printf("Eroare la scriere in pipe b-c\n");

3 3 „consumator” egal cu numărul


{ if(argc != 3) exit(1);

m → Un număr de procese m
printf("Eroare la citire din pipe a-c\n"); { }

0#1 1
exit(1); printf("Utilizare: %s nr_linii fisier\n", }

s s
20 fiecare consumator fiind responsabil
} argv[0]);

Co o
exit(1); close(pipe_bc[1]); /* important sa fie aici */

)2
if(n1 >0) }
de producători existenți, de
) C
{ /* Procesul parinte (b) preia rezultatele */
if(islower(c)) if(pipe(results_pipe)<0) struct result_data res;

c C. (c de producători.
 C. la
count++; {

{
}
else
( # }
printf("Eroare la crearea pipe-ului\n");
exit(1);
for(i=0; i<2; i++)
{
if(read(results_pipe[0], &res, sizeof(struct
una din categoriile
→ Datele de la producători trebuie să ajungănnumai
an
res.type = COUNTER; result_data))<0)

#
a
res.data = count; if(pipe(pipe_ac)<0) {
{ printf("Eroare la citire din pipe rezultate\n");
if(write(results_pipe[1], &res, sizeof(struct printf("Eroare la crearea pipe-ului a-c\n"); exit(1);

D D
consumatorul care e responsabil de tipul respectiv de
result_data))<0) exit(1); }
{ } printf("Rezultat primit: %s = %ld\n",

13 3
printf("Eroare la scriere in pipe rezultate res.type==COUNTER ? "Nr. litere mici" : "Numar generat

01
\n"); if((pid_a=fork())<0) maxim", res.data);
exit(1); { }
producători.
0
} printf("Eroare la fork\n");

2 2
end1=1; exit(1);
} }
# close(results_pipe[0]);

) )
} if(pid_a==0) /* a */

(c (c
{ int s;
close(pipe_ac[0]);
if(! end2) close(results_pipe[0]); close(results_pipe[1]); wait(&s); wait(&s); /* preluarea starii fiilor - in
{ mod normal ar trebui facuta aici si verificarea
if((n2=read(pipe_bc[0], &num,
sizeof(long)))<0)
{
# dup2(pipe_ac[1],1);

execlp("tail", "tail", "-n", argv[1], argv[2],


starilor de return */

return 0;
printf("Eroare la citire din pipe b-c\n"); NULL); }
exit(1); printf("Eroare la exec\n");
} exit(1);
if(n2>0) }
!335 !336
a a
sm sm
Co Co
C. C.
an an
D a D a
3 m 3 m
01 s 01 s
)2 Co )2 Co
(c C. (c C.
an an
8. Concepte D avansate a D
Drepturi,3utilizatori, identificatori a
3
20
1 sm o 2 0 1
osm
) C ) C
(c C. (c C.
an an
D D
0 13 0 13
) 2 )2
(c (c
!337 !338

a a
sm sm
Identificatori Co
. asociați oricărui proces .
Când un program Co
de pe disc e lansat în execuție
C C
an n de pe disc are un user și grup proprietar
→ fișierul
a
D a D a
13 m 1 3 m
20 s •2 0 s
Co o programul)#
de obicei, effective UID/GID sunt egale cu real UID/GID ale
) . proprietarul real al procesului
 ) C
(c → real User ID, real Group ID: (c C.
procesului curent (care lansează
CUser
→ effective User ID, effective
a n ID: utilizatorul/grupul cu a
• între modurile (drepturi etc.) an memorate pentru un fișier de
D
cărui identitate rulează procesul (poate fi diferită de cea areală)
 D
pe disc există și două fanioane (flag-uri) speciale:
 a
3 3 dacă e setat (activat) pentrumun
→ supplementary Group
01
IDs: grupurile
sm face
din care utilizatorul
o
1
20 va fi lansat în execuție setându-i-se
- set-user-ID (SETUID): s
parte
 2
) saved-set-group-ID: còpii ale CID-urilor, program, programul ) Co
(c
→ saved set user-ID, C . effective UID la
c
( valoarea UID a proprietarului fișierului
C . (în
salvate de exec
an loc de cea a procesului lansator)
 a n
D D un program,
13 - set-group-ID (SETGID): dacă e setat3pentru
20 01
programul va fi lansat în execuție setându-i-se
2 effective GID
) )
(c (c
la valoarea GID a grupului proprietar al fișierului (în loc de
cea a procesului lansator)

!339 !340
a a
sm m
Co C
Schimbarea identității os (UID, GID) reale/efective a procesului
Exemplu: . .
C C
n care rulează cu drepturi de root, deși a fost lansat
→ program
a E necesarăan atunci când

D utilizator obișnuit (exemplu dina Linux):
de un D
- procesul are nevoie de mai multe a drepturi pentru a
#
0 13 sm 0 1 3
sm
2> ls o operații privilegiate
 o
) 2- procesul își reduce privilegiile
efectua
) -l /usr/bin/passwd
C C
(c C. ( c C.
-rwsr-xr-x 1 root shadow 81792 oct 29 2011 /usr/bin/passwd pentru a preveni
an accesul la unele resurse a n
D a D a
1 3 m 1 3 m
Cum se activează 20 SETUID și SETGID: Co s E recomandată strategia20 s
o minime,
adoptării privilegiilor
c) ) C
> chmod 4766 (fisier > chmod u+s fisier C.
SETUID
adică un proces (c să își păstreze întotdeauna C. cele mai
an puține drepturi necesare efectuării sarcinilor an care îi revin
D D
> chmod 2766 fisier 13 SETGID
> chmod g+s fisier
0 0 13
)2 Schimbarea identității e supusă) 2unor reguli stricte.
> chmod 6766 fisier (c fisier ambele
> chmod ug+s (c
!341 !342

a
Funcțiile setuid, setgid Observații:# a
m s s m
o
#include <sys/types.h>
C - numai un proces Cocu drepturi de root poate schimba real UID/GID#
C. .
#include <unistd.h>
# C
an n cu drepturi de root folosește setuid, setgid, toate
- când procesul
int setuid(uid_t
int D
uid);
a
setgid(gid_t gid);
a D de identificatori sunt modificate,
cele trei tipuri a astfel încât procesul
0 13 sm respectiv
0 1 3 nu mai poate reveni la drepturile
sm de root.

c)
2
. Co # 2
) → util atunci când un program privilegiat
#(c al utilizatorului, care nu mai are voie să.
o
Cprimească
(exemplu: login) lansează un program 

(
Reguli:
 C → de altfel, root nu are alt motiv de C
privilegii ridicate niciodată


1. Dacă procesul are drepturian an


# a apela setuid, decât de a reduce 

de root (superuser):
 # permanent privilegii

D D
3 UID ← uid, saved SETUID ←a uid #
real UID ← uid, effective #
3
→ dacă dorește reducerea doar temporară a drepturilor, se folosește altă a 

0 1
osm # funcție (seteuid)
20
1 sm
2
2. Dacă procesul nu)are privilegii de root ȘI 
 C ) Co
(c UID SAU uid == saved SETUID):

(uid == effective C . Funcțiile exec # ( c C .
effective UID ← uid# an a) dacă pentru fișierul executabil există activataflag-ul n SUID:

D D
13 pe EPERM
3. Altfel, funcțiile returnează -1 și errno e setată
# exec setează effective UID pe UID-ul 3proprietarului
1 în saved SUID; #
fișierului 


) 20 b) întotdeauna, exec salvează effective UID


)2
0
(similar și pentru grupuri, cu setgid())
(c Operația b) se face după efectuarea lui (c a) (dacă e cazul), deci id-ul
salvat e cel preluat de la fișierul executabil
!343 !344
a
Funcțiile seteuid, setegid Exemplu* a
m m
C os Co
s
C.
#include <sys/types.h>
#include <unistd.h> C. planifică executarea unor programe în viitor.
Comanda at care
an an
#
D
int seteuid(uid_t euid);
a D a
3
int setegid(gid_t egid);
m Probleme 3 legate de securitate:
 m
01 s 0 1 s
Co o
- at trebuie să ruleze cu privilegiile specifice utilizatorului, cât mai mult
)2 ) 2 C
(c C. (c posibil
 .
timp
- are nevoie să acceseze fișiereCde configurare sistem, deci la un
a n moment dat va avea nevoie de an privilegii sporite

D chiar dacă procesul e privilegiat.#
Setează doar effective UID/GID,
a D adrepturile
1 3 m - programul care va fi lansat
1 3 va trebui să ruleze exclusiv cu m
20 s
de root poate să setezeoatributul doar pe
20 s
Co
Un proces care nu are privilegii utilizatorului care l-a planificat#
valorile real UID/GIDc)sau saved SUID/SGID deja asociateC procesului. c)
( C. Există două componente( ale sistemului descris:
 C
.
an - comanda at, folosită pentru a specifica programe an și data lansării lor

D D
13
- serviciul atd (rulează în background), care3lansează programele la
0 momentele planificate 01
)2 ) 2
(c (c
*După: W.R.Stevens, S.A.Rago, Advanced Programming in the UNIX Environment, Third Edition; Addison Wesley, 2013

!345 !346

a 3.1) fișierul /usr/bin/at are setat SETUID, iar


În unele sisteme (ex.: Linux
4. după ce a terminat dea accesat fișierele de configurare, revine la
m
owner-ul e root. Sunt sparcurși următorii pași:# sm care l-a lansat, apelând iar seteuid():

Co o
privilegiile utilizatorului

C. deoarece e setat SETUID pt root, atributele


1. La lansarea at, . C utilizatorului care a lansat at

- real UID == UID-ul
C
procesuluinsunt:
 - effective nUID = UID-ul utilizatorului care a lansat at

a a = root#
D == UID-ul utilizatorului care aalansat at

- real UID - savedDSUID
a
13 UID = root

- effective
0 sm
3
01 atd este un program care orulează
s m
2 SUID = root#
-)saved C o 5. Serviciul
2 C
în sistem cu privilegii de
. )
(c C pentru a rula cu drepturile (ctrebuie să o facă în așa fel încâtC.acesta să ruleze strict
root. Când urmează să lanseze programul planificat de utilizator,
cu drepturile
n
2. La început, at își reduce privilegiile
a utilizatorului.
 an
D
userului care l-a lansat. Apelează pentru aceasta seteuid(). Avem:

a D a
1 3
- real UID == UID-ul utilizatorului care a lansat at
 m 

1 3 m
20 utilizatorului care a lansat at
Co
- effective UID = UID-ul
s 20 atd apelează fork(). Apoi,Cprocesul
Pentru a lansa programul, os fiu
) )
(c
- saved SUID = root# . C (c C. trei tipuri de UID
apelează setuid(uid-ul_utilizatorului_care_planificase_programul).

3. După un timp, at are nevoie de drepturi sporite.


n
a Apelează seteuid() an de procesul fiu,
Deoarece procesul e cu drepturi de root, toate cele
D sunt setate pe UID-ul utilizatorului. Este apoiDlansat,
pentru a primi drepturi de root. Are voie, pentru
0 13 lui ca root a fost salvat programul planificat.
 3
01 at

)a2lansat at

în saved SUID (acest caz arată utilitatea existenței saved SUID):
 - real UID == UID-ul utilizatorului care a2lansat
- real UID == UID-ul utilizatorului care ( c c) a lansat at

- effective UID = UID-ul utilizatorului(care
- effective UID = root
 - saved SUID = UID-ul utilizatorului care a lansat at
- saved SUID = root
!347 !348
a Dreptul de acces la a
sm m fișiere al proceselor
Co C os
C. C .
an Când un procesan încearcă să creeze/modifice/citească/șteargă un fișier,
D a D
sunt făcute următoarele verificări, în ordinea:
*
3 m 13 UID al procesului e root,sm
01 s - dacă 0effective
o accesul fișierului,
e permis;

)2 Co ) 2
- altfel, C
dacă effective UID == ID-ul proprietarului accesul e
(c C. (c numai dacă biții de permisiune
permis C. corespunzători operației sunt setați
an n
(cei din categoria “user”), altfel aaccesul e refuzat;

D D
Drepturi
1 3 asociate fișierelor ma - altfel, dacă effective GID sau
1 3 unul din supplementary GIDsmeste a egal cu
2 0 os GID-ul fișierului, accesul 0 s
e permis numai dacă sunt setațiobiții de
2corespunzători
) C ) C
(c C.
permisiune pentru grup
(c operației, altfel.accesul e refuzat; 

- altfel, dacă biții corespunzători din categoria “other”Csunt setați, accesul
an e permis, altfel accesul e refuzat; an
D D
0 13 01
3
)2 )2
(c * Prima
(c
regulă care se potrivește se aplică, apoi nu se mai trece la celelalte reguli.


!349 !350

a a
smfișier nou creat
Proprietarul unui
o sm
C Co
C. C.
n e creat:

Când unafișier an
D a fiind effective UID al D a
13 3
— proprietarul (UID) fișierului e setat ca
0 care creează fișierul
 osm 1 sm
procesului
) 2 grupul proprietar (GID) al fișierului
C e setat în funcție de ) 20 Co
C. specificate la montarea
(cversiunea de UNIX sau de opțiunile (c C.

sistemului de fișiere. Poateafinunul din:
 an


D a D a
1 3
# - effective GID al procesului care creează fișierul

m 3 Funcția fcntl m
s
20 în care fișierul e creat (Linux:Coface așa 01 s
)2 Co
# - GID-ul directorului
c) are setat flag-ul SETGID). c C.
dacă directorul respectiv
( C (
an an
D D
0 13 13
) 2 ) 20
(c (c
!351 !352
Funcția fcntl a a
m m
#include <unistd.h>
C os Co
s
.
#include <fcntl.h>
# C C.
an
int fcntl(int fd, int cmd, ... /* arg */ );
an
D pe descriptorul fd. Valoarea ade return depinde de operația D a
Aplică diverse 3 fel operații 3
0 1
o smde eroare.
 01 sm
Co
aplicată. La și parametrii. Returnează -1 în caz
2 )2
) .C

(c (argumentul cmd):

Operații
C (c C.
- F_DUPFD (long) — duplică fd și returnează
an decât arg
noul descriptor, care va fi cel mai mic
an
număr disponibil (nedeschis) mai mare
D (considerat ca long)

a D
Non-blocking I/O a
- F_DUPFD_CLOEXEC (long) —
1 3 m
duplică fd (ca mai sus) și setează flag-ul
1 3 m
0 adică descriptorul va fi închis la exec)

o s 0 s
2flag-urile )2 Co
FD_CLOEXEC. (close on exec,
) descriptorului; arg e ignorat;Cîn prezent, doar
- F_GETFD (void) — citește
fanionul FD_CLOEXEC (e definit

c C . ( c C.
- F_SETFD (long) — setează flag-urile descriptorului pe valoarea
a n dată în arg
 an
- F_GETFL (void) — obține flag-urile de stare ale fișierului; D e vorba de cele care sunt D
inițializate și de open(): O_RDONLY, O_RDWR etc.
 3 3
- F_SETFL (long) setează flaguri de stare; numai unele 2 01 pot fi modificate, în Linux ele 20
1
sunt O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, c) O_NONBLOCK)

- F_GETLK, F_SETLK, F_SETLKW: preluarea,( testarea, eliberarea de lacăte (locks) (c
)
pentru porțiuni din fișiere (nu fac obiectul acestui curs, detalii în bibliografie)
!353 !354

a a
sm
Operații de intrare-ieșire
o
fără blocare sm
Operații de intrare-ieșire
o
fără blocare
C C
C. C.
an ca unele operații de i/e care în mod normal se
Este posibil
an
D
fac cu blocare (ex: read, write) să ase facă fără blocare (ex: D a
3 Efect: 
 3
1 sm
read0 citește, dar dacă nu sunt odisponibile imediat date, se 0 1 sm
2 )2 Co
- operațiile se vor efectua fără blocare, apelurile se vor întoarce
) fără să le aștepte) . C .
(c
întoarce
C c
imediat

( - operațiile (exemplu: read) potCreturna eroare, dar setând errno pe
an an
D a EAGAIN — aceasta înseamnă D că operația nu a reușit imediat a dar
3 m 3 m
01 1
poate continua (pt. read(): nu au fost disponibile date în acel
s 20 os
)2 Co
Două metode:
 moment)
c ) C
(
- La open() se setează C.
și flag-ul O_NONBLOCK
 (c C .
an O_NONBLOCK
- Se folosește fcntl, adăugându-se flag-ul an
pentru un descriptor deja deschis 3 D D
1 13
) 20 ) 20
(c (c
!355 !356
Exemplu a a
m m
C os
int oldflags;

Co
s
C. C.
...

if ((oldflags = fcntl(fd, F_GETFL, 0)) < 0)
n
{ aprintf("Error at fcntl\n"); exit(1); }
 an
ifD(fcntl(fd, F_SETFL, oldflags a| O_NONBLOCK) < 0) D a
0 13...{ printf("Error at fcntl\n"); sm exit(1); } 01
3
sm
o Co
) 2 while(1) .C )2
(c { C (c C.
do_stuff();
an an
D a I/OD a
size = read(fd,3buff, expected_size);

if(size < 0) 01 m 1 3 Multiplexing m
s 0 s
{
c)==2 EAGAIN) . Co c)2 Co
if(errno(
continue; /* or do other stuff */C
( C.
else an an
{ printf("Error at read\n"); exit(1); D } D
} 13 13
else
) 2*/0 ) 20
(c (c
if(size == 0) /* end of file
break;
}

!357 !358

a a
sm
Multiplexarea operațiilor
o
de intrare-ieșire Funcția select() s m
C Co
C. .
Urmărește seturiCde descriptori blocându-se până când cel puțin unul din ei
an devine pregătit anpentru operația de intrare-ieșire
D …
a D a
13 m
read(pipe_ac[0], &c, sizeof(char))
s 13 <sys/select.h>

#include
sm
) 20 C Co

read(pipe_bc[0], &num, sizeof(long))

 0
) 2int select(int nfds, C o fd_set *writefds,
fd_set *readfds,
(c C. … ( c C .
fd_set *exceptfds, struct timeval *timeout);

an an
D a D= seturile de descriptori de fișiera urmăriți

3 m - readfds, writefds, exceptfds 3
01 s # → readfds: pentru citire, sm excepții*

01 writefds: pentru scriere, exceptfds:
c)2 Co # → pot fi NULL dacă
2
c) nu se dorește urmărirea operației
o
C respective

( C. (
- timeout: timpul maxim de așteptare (NULL = nelimitat)
 C .
Probleme? an - nfds: valoarea (numerică) maximă a descriptorilor an urmăriți plus unu
D D
0 13 (trebuie calculată)
1 3
) 2 ) 20
(c (c
*condiții
excepționale — în prezent singura condiție excepțională este prezența
de date “out of band” pe un socket; nu face obiectul acestui curs
!359 !360
a a
mun tablou de biți, câte unul pentru fiecare
Setul poate fi văzut sca m
descriptor posibilC o Când funcția select()C osse întoarce datorită faptului că unul sau mai mulți
C. C.
descriptori au devenit pregătiți, ea va reinițializa cele trei seturi,
an 0 1 2 3 4 5 6 7
… n
introducânda(setând) în ele doar descriptorii care au devenit pregătiți
D a D a
3 m 3 m
01 s 0 1 s
)2 Co ) 2 de retur a funcției select():# Co
( c
Seturile de descriptori se completeazăC. folosind macro-uri speciale. ( c
Valoarea
C .
n
Inițial se apelează obligatoriu aFD_ZERO și apoi se setează (adaugă) n
-1: # eroare sau a apărut unasemnal (caz în care errno va fi EINTR)

D a D
0: ## select s-a întors din3 cauză că a expirat timpul limită
 a
descriptorii doriți cu FD_SET 3 m
20
1 s 1 sm
0 numărul total de descriptori pregătiți,
Co 2 o
> 0:# succes, returnează
c) ) C
( C . (c seturi
disponibili în cele trei
C.
int FD_ISSET(int fd, fd_set *set); - verifică dacă a n un descriptor e în set
void FD_CLR(int fd, fd_set *set); - șterge toți descriptorii#
# an
D un descriptor în set#
void FD_SET(int fd, fd_set *set); - setează (adaugă) D
void FD_ZERO(fd_set *set); - inițializează setul
13 de descriptori 13
) 20 )2
0
(c (c
!361 !362

a a
int nfds = 1 + (pipe_ac[0]>pipebc[0] ? pipe_ac[0] : pipe_bc[0]);
sm Exemplu … sm
Co Co
int over=0, n;

C. C.
Un descriptor este considerat pregătit, în funcție de setul în care while (1) {
se află, astfel:# …
an an
FD_ZERO(&readfds);
D
- readfds: un imediat apel read pe acela descriptor nu se va bloca D
FD_SET(pipe_ac[0], &readfds);
a
13 disponibile date)# 3# FD_SET(pipe_bc[0], &readfds);
0
(sunt
o sm 20
1 sm
) 2 C ) if((nready = select(nfds,
Co
&readfds,
NULL, NULL, NULL))<0)
(c - writefds: un apel write pe acel C. descriptor nu se va bloca# (c C.
{ printf(“Eroare\n”); exit(1); }
#
an excepțională pe acel descriptor # an
if(FD_ISSET(pipe_ac[0], &readfds))
D
- exceptfds: a apărut o condiție
a {
D a
1 3 m 3
n = read(pipe_ac[0], &c, sizeof(char));
m
20 s 01
if(n==0) over++; /* end of data */ s
Co )2 Co
#
c) .

c
Alte observații:# ( ( C.
}
C if(FD_ISSET(pipe_bc[0], &readfds))
a n {
an
D
- pentru fișiere obișnuite, descriptorii sunt considerați# n = read(pipe_bc[0], &num, sizeof(long)); D
întotdeauna pregătiți
 13 if(n==0) over++; /* end of data */
13
20 20

)
- la “sfârșit de fișier”, descriptorul e considerat pregătit }
)
(c if(over == 2)
break;
(c

}
!363 !364
a a
sm m
Co
Grupuri de procese
C os
C. C.
an an
D a D
= o mulțime de unul sau mai multe procese,a de obicei
3 m 3 m
01 s 20
1
asociate cu un același job.#
os
)2 Co ) C
(c C. (c Orice proces poate aparțineCunui . grup de procese.#
an anun identificator (GID). Procesul cu
D Orice grup de procese are
D
Grupuri
1 3 de procese, job-uri ma identificatorul egal cu 3cel al grupului se consideră a fi m
1
a
“liderul
0 os 20 s
2 Co
grupului”.#
) C )
(c C. ( c
După fork(), procesul C .
fiu moștenește GID-ul părintelui (se
an află în același grup) an
D D
0 13 1 3
)2 ) 20
(c (c
!365 !366

a a
s m sm
o
Aflarea identificatorului
C
de grup:# Job-uri
Co
C. C.
an Un job este
n
a un grup de procese care poate fi controlat în cadrul oferit
D a D a
0 13 #include <unistd.h>
sm 0 1 3
de interpretorul
s m
de comenzi. Nu toate interpretoarele oferă controlul
o o
) 2 pid_t 2
# job-urilor.#
getpgid(pid_t pid); C
( c C .
dacă pid==0, returnează grupul procesului curent c) grup de procese e creat de C
(Un .C
obicei de o înlănțuire cu pipe-uri, de
#
pid_t getpgrp(void);a
n an
linii de comandă lansate în background etc. Exemplu: liniile următoare
D procesului curent a D a
returnează grupul
1 3 m creează 2 grupuri de procese
1 3 și, implicit, 2 job-uri: m
20 s 20 abc & s
c) . Co )
$ ls -l | grep
[1] 1165(c . Co
( C C
an an
$ ls &
[2] 1166

D D
13 (apăsarea tastei ENTER)

[1] Exit 1 1 3 -l | grep abc

ls

) 20 [2]+ Done
) 20 ls
(c (c
!367 !368
a a
m Crearea unui grupsm
os
Controlul job-urilor
C
și aderarea proceselor la grupuri
Co
C. C .
#include <unistd.h>

an an int
#
$ program
D a D setpgid(pid_t pid, pid_t pgid);
a
1 3CTRL+Z: suspendarea job-ului din foreground
m (SIGTSTP)

13 m
0 s 0 grupul pentru un proces dat.# s
Cojob-ului din foreground Co
CTRL+C: terminarea (SIGINT) job-ului din foreground

c) 2 CTRL+\: terminarea (SIGQUIT) . c)2
Setează
.
( C ( Cprocesului curent

a n - dacă pid == 0, setează grupul n
a devine liderul unui nou grup

$ bg %1 trimiterea înD background și reluarea jobului suspendat
a 1 - dacă pid==pgid, procesulDpid a
3 m 3 m
01 în background și reluarea ultimului
- dacă pgid == 0 atunci 1grupul procesului pid va fi făcut egal cu pid
$ bg trimiterea
2 os job suspendat 2 0 unui nou grup)

(procesul pid devine liderul os
) C ) C
(c C. (c să fie un grup existent, din aceeași
- altfel, pgid trebuie C. sesiune cu cel
n curent#
an
$ fg %1 aducerea în foreground a jobului a1
D D
0 13 Un proces poate apela setpgid doar pentru13el însuși și pentru oricare
din fiii săi care nu a apelat încă exec 20
)2 )
(c (c
!369 !370

a a
sm sm
o un semnal unui întreg grup de procese.
Un proces poateCtrimite Co
C . C.
an an
D <sys/types.h> a D a
1 3
#include
m 13 m
0
#include <signal.h> s 20 s
) 2#int kill(pid_t pid, int sig); . Co ) Co
( c C (c C.
→ pid>0: Trimite semnalul ansig către procesul pid
 an
→ pid=0: Trimite semnalul D sig către grupul curent de procese

a D Sesiuni a
1 3 m 3 m
20
→ pid<0: Trimite semnalul s
o pid 01 s
Co
sig către grupul de procese
) C )2
(c C. ( c C.
an an
D D
0 13 13
)2 ) 20
(c (c
!371 !372
a a
m m
Sesiune#
C os Co
s
= o mulțime C. de unul sau mai multe grupuri de procese .
Dacă sesiuneaCare terminal de control: 

an n de procese din sesiune este grupul foreground. Doar
- Un singuragrup
D a D a
1 3 m 13 vor fi afectate de CTRL-C, CTRL-\
acest grup va putea citi de la terminal (tastatură).
m
Toate procesele din
0 s acest0grup s
Co o (vor primi semnalele
)2 . ) 2 C
c (c C. sunt grupuri background. Un
corespunzătoare)

( O sesiune are cel mult un terminal C de control, care este un - Toate celelalte grupuri de procese
dispozitiv capabil să afișeze a ndate și să ofere intrare (tastatură)# n
read() de la terminal făcut de aun grup background va suspenda grupul
D a D a
3poate fi asociat unei sesiuni la cererea
m respectiv (grupul va primi 3semnalul SIGTSTP)
Un terminal de control 0 1 s 20
1 sm
procesului “lider de
c) 2sesiune”, numai dacă acest terminalCo nu a fost ) C o
( în care poate fi cerut un terminal
asociat deja. Modul .
C diferă de la o (c C.
variantă de UNIX la alta. La login se alocă automat a n un terminal.# an
D D
0 13 13
)2 ) 20
(c (c
!373 !374

a
s m
Crearea unei onoi sesiuni
C
C. #include <unistd.h>
# an
D pid_t setsid(void); a
3
2 0 1
o sm
(c
)
C .C
Dacă procesul apelant NU e lider
a n de grup, este creată o nouă sesiune:

- sesiunea NU va avea terminal D de control
 a
- procesul devine “lider al13sesiunii”
 m
0 unui nou grup de procese, primul s
- procesul devine lider2al
c) . Co conexiunea
din sesiune

- dacă procesul avea ( terminal de control înainte deCapel, cu
acesta este întreruptă#
an
D
Dacă procesul apelant este lider de grup, funcția
0 13 returnează eroare (-1).
)2
(c
!375

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