Documente Academic
Documente Profesional
Documente Cultură
So-Curs V 1 0 PDF
So-Curs V 1 0 PDF
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
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
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
!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
*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
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
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
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
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#
( 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.#
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)#
) )
◦ 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
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
!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 */
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 ...
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
anRecord)
an
o componentă de inițializare și încărcare a sistemului de operare
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
!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)
!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
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
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
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
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()
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
(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 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));
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
{
)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;
(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)
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
!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
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
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
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 {
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);
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");
) )
(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; } }
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]);
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");
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);
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ă
!345 !346
!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.
—
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