05566 20202 PRA2 SOL - Solució pràctica 2 Sistemes Operatius del curs 2020/21-2 PDF

Title 05566 20202 PRA2 SOL - Solució pràctica 2 Sistemes Operatius del curs 2020/21-2
Author Garro
Course Sistemas Operativos
Institution Universitat Oberta de Catalunya
Pages 9
File Size 423.2 KB
File Type PDF
Total Downloads 272
Total Views 572

Summary

Multim`edia iTelecomunicaci ́oPresentaci ́oAquesta pr`actica planteja un seguit d’activitats amb l’objectiu que l’estudiantpugui aplicar sobre un sistema Unix alguns dels conceptes introdu ̈ıts als darrersm`oduls de l’assignatura.L’estudiant haur`a de realitzar un seguit d’experiments i respondre le...


Description

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

Presentaci´ o Aquesta pr`actica planteja un seguit d’activitats amb l’objectiu que l’estudiant pugui aplicar sobre un sistema Unix alguns dels conceptes introdu¨ıts als darrers m`oduls de l’assignatura. L’estudiant haur`a de realitzar un seguit d’experiments i respondre les preguntes plantejades. Tamb´e haur`a d’escriure un programa en llenguatge C.

Compet` encies Transversals: • Capacitat per a adaptar-se a les tecnologies i als futurs entorns actualitzant les compet`encies professionals Espec´ıfiques: • Capacitat per a analitzar un problema en el nivell d’abstracci´o adequat a cada situaci´o i aplicar les habilitats i coneixements adquirits per a abordarlo i resoldre’l • Capacitat per a dissenyar i construir aplicacions inform`atiques mitjan¸cant t`ecniques de desenvolupament, integraci´o i reutilitzaci´o

Enunciat Per a fer aquesta pr`actica us facilitem el fitxer pr2so.zip amb fitxers font. Descompacteu-lo amb la comanda unzip pr2so.zip. Per compilar un fitxer, per exemple prog.c, cal executar la comanda gcc -o prog prog.c 1. (6 punts, 1 punt per apartat) Donats els seg¨ uents codis, indiqueu justificadament quin ´es el resultat d’executar-los. Indiqueu quins par`ametres esperen, la jerarquia de processos creada, quins missatges (i en quin ordre) es mostren pels dispositius d’entrada/sortida, bloquejos, processos zombies,... S’aconsella que en primer terme intenteu determinar el seu comportament sense executar-los al terminal. Executeu-los per a verificar la vostra resposta. Podeu assumir que cap crida al sistema tornar`a error. No heu de corregir els codis. Nom´es es demana que expliqueu el seu comportament. (a) Codi 1: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h > < f cnt l . h >

int main ( int argc , char * ar gv []) {

1

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

char s [2 0] ; fo rk ( ); fo rk ( ); sprintf (s , " % d % d \ n " , ge tp id () , g et pp id ( )) ; wr it e (1 , s , st rl en ( s )) ; wh i le ( w ai t ( NUL L ) > 0); }

El proc´es inicial crea un fill. A continuaci´o, tots dos processos creeen un fill amb el que tenim 4 processos (l’inicial, dos fills i un net). Tots quatre processos imprimeixen una l´ınia amb el seu pid i el del seu pare (no podem garantir en quin ordre s’escriuran les l´ınies). Finalment, els processos entren a un bucle on esperen la mort dels seus fills. El proc´es net i un dels fills (el que no t´e descend`encia) surten inmediatament del bucle, el fill que ha tingut fa descend`encia far`a una iteraci´o del bucle i el proc´es inicial far`a dues iteracions. (b) Codi 2: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h > < f cnt l . h >

int main ( int argc , char * ar gv []) { int s t ; char s [1 0] ; switch ( fo rk ( )) { case 0: execlp (" g re p " , " gre p " , " abracadabra " , " pr2 . c " , NU LL ); default : wa it (& st ) ; sprintf (s , " % d \ n " , W EX IT ST AT US ( st ) ); wr i te (1 , s , s t r le n ( s )); } switch ( fo rk ( )) { case 0: execlp (" g re p " , " gre p " , " abracadabra " , " pr1 . c " , NU LL ); default : wa it (& st ) ; sprintf (s , " % d \ n " , W EX IT ST AT US ( st ) ); wr i te (1 , s , s t r le n ( s )); } }

2

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

Inicialment es crea un proc´es fill que executa la comanda grep que busca la paraula abracadabra al propi fitxer pr2.c. Com la paraula existeix, l’execuci´o de la comanda mostra el contingut de les dues l´ınies del fitxer pr2.c que contenen la paraula. El proc´es inicial espera la mort del fill i mostra el seu codi d’acabament (que ser` a 0 perqu`e grep ha trobat la paraula). A continuaci´ o es crea un altre proc´es fill que tamb´e executa la comanda grep que busca la paraula abracadabra per`o ara ´es al fitxer pr1.c. Com ara no existeix, grep no escriu res. El proc´es inicial espera la mort del fill i mostra el seu codi d’acabament (que ser`a 1 perqu`e grep no ha trobat la paraula). (c) Codi 3: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h > < f cnt l . h >

int main ( int argc , char * ar gv []) { int n = -1; char s [1 0] ; if ( for k () = = 0) /* 1 */ n = o p en ( "/ d ev / n ul l " , O _R D O N LY ); if ( for k () = = 0) /* 2 */ n = o p en ( "/ d ev / n ul l " , O _R D O N LY ); if ( for k () = = 0) /* 3 */ n = o p en ( "/ d ev / n ul l " , O _R D O N LY ); if ( for k () = = 0) /* 4 */ n = o p en ( "/ d ev / n ul l " , O _R D O N LY ); wh i le ( w ai t ( N UL L ) > 0 ); sprintf (s , " % d \ n " , n ) ; wr it e (1 , s , s tr le n ( s )); }

Al primer fork, el proc´es inicial crea un proc´es fill. El fill crida a open i rep com a resultat un 3 (inicialment, els canals 0, 1 i 2 estan ocupats). Tots dos processos executen el segon fork, amb el que es creen dos nous processos. Els dos processos acabats de crear invoquen a open. El fill del proc´es inicial rebr`a 3 com a resultat, per`o el n´et del proc´es inicial rebr`a 4 perqu`e ha heredat el canal 3. Tots quatre processos executen el tercer fork, amb el que es creen quatre nous processos. El retorn de la crida open dependr`a de quants canals oberts tingui cada proc´es.

3

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

Tots vuit processos executen el quart fork, amb el que es creen vuits nous processos. El retorn de la crida open dependr`a de quants canals oberts tingui cada proc´es. Finalment, cada proc´es escriur`a el valor que ha retornat open (llevat el proc´es inicial, que no arriba a invocar mai a open amb el que escriu -1). Al gr`af es mostra la jerarquia de processos creada. El proc´es inicial el trobem a la part superior de la jerarquia. Les arestes indiquen relacions paterno-filials (l’etiqueta de cada aresta indica en quina crida fork s’ha creat el proc´es). Les etiquetes dins dels nodes indiquen el nombre

escrit per cada procces (d) Codi 4: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h > < f cnt l . h >

int main ( int argc , char * ar gv []) { cl o se ( 0) ; open (" / bin / ls " , O_ R D O N LY ) ; execlp (" wc " , " wc " , " - c " , NU LL ); cl o se ( 1) ; open (" t mp _s o . tx t " , O_W R O N L Y | O_ C R EA T | O_ TR UN C , 06 0 0) ; execlp (" wc " , " wc " , " - c " , NU LL ); }

El codi redirecciona el canal d’entrada est` andar al fitxer /bin/ls i fa un canvi d’imatge per passar a executar el programa /bin/wc amb el par`amentre -c, que compta quants car` acters llegeix per la seva entrada est`andar i mostra el resultat per la sortida est`andar. Per tant, s’imprimeix per la sortida est`andar la mida del fitxer /bin/ls. La resta del codi no s’executa perqu`e el codi ha realitzat un canvi

4

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

d’imatge. (e) Codi 5: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h > < f cnt l . h >

int main ( int argc , char * ar gv []) { int p [2]; pi pe ( p ); switch ( fo rk ( )) { case 0: cl o se ( 0) ; dup ( p [0 ]); execlp (" uptime " , " uptime " , N UL L ); default : cl o se ( 1) ; dup ( p [1 ]); execlp (" nl " , " nl " , N UL L ); } }

El proc´es inicial crea una pipe i a continuaci´o un fill que hereda la pipe. El proc´es fill redirecciona la seva entrada est`andar a la pipe i passa a executar uptime. El proc´es inicial redirecciona la seva sortida est`andar a la pipe i passa a executar nl. Ara b´e, com nl espera llegir dades per l’entrada est` andar (que per defecte estar` a associada al teclat), es bloquejar`a mentre no llegeixi res. El proc´es fill mostrar`a el resultat de uptime per la sortida est`andar i morir`a; com el proc´es inicial no invoca la crida al sistema wait, aquest proc´es quedar`a zombie fins que el proc´es inicial finalitzi. (f) Codi 6: # i nc lu de # i nc lu de # i nc lu de # i nc lu de # i nc lu de

< u ni st d .h > < sy s / wa it . h> < s tdi o . h > < s td li b .h > < s tr in g .h >

int main ( int argc , char * ar gv []) { char s [1 0] ; int st , n ; if ( ar gc != 2) exit (0);

5

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

n = a to i ( a rg v [1 ]); if ( n > 0 ) { switch ( fo rk ( )) { case 0: sprintf (s , " % d" , n - 1); ex ec l ( a rg v [0 ] , a rg v [0] , s , NU LL ); default : wa it (& st ) ; n = n + W E X I T S T AT U S ( st ); } } sprintf (s , " % d \ n " , n ) ; wr it e (1 , s , s tr le n ( s )); ex it ( n ); }

El codi rep un par`ametre num`eric N i mostra els resultats de les sumes 0, 0+1, 0+1+2, ..., 0+1+2+...+N truncats a 8 bits. La implementaci´ o es basa en crear una cadena de processos (fill, net, besnet,...) on tots executen recursivament el mateix programa, per`o cadascun amb un valor inferior del par`ametre. El retorn del resultat es fa mitjan¸cant el codi d’acababament del proc´es (par`ametre de la crida exit, un nombre natural de 8 bits, que ´es recollit mitjan¸cant la crida wait). El cas trivial ´es N=0 i el cas general consisteix a retornar la suma del par`ametre del proc´es amb el valor que ha retornat el seu proc´es fill. Degut a que el codi d’acabament ´es un natural de 8 bits, per a valors de N m´es grans o iguals que 24, el resultat final mostrat no seria correcte utilitzant l’aritm`etica convencional.

6

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

2. (4 punts) Escriviu en llenguatge C el programa multihead que mostrar`a per la seva sortida est`andar les N primeres l´ınies de cadascun del fitxers especificats a una llista de fitxers. Primer es mostraran les N primeres l´ınies del primer fitxer de la llista, a continuaci´o les N primeres l´ınies del segon fitxer, ..., i finalment les N primeres l´ınies del darrer fitxer de la llista. El programa multihead rebr`a els par`ametres N i la llista de fitxers com a par`ametres per la l´ınia de comandes (vector argv). Per a implementar el programa creareu un fill que executar`a el programa head passant-li com a par`ametres el nombre de l´ınies (N) i el nom del primer fitxer de la llista. Quan head hagi finalitzat, fareu el mateix amb el segon fitxer de la llista, i aix´ı succesivament fins a tractar tots els fitxers de la llista. Si es detecta que el codi d’acabament retornat per head al tractar el fitxer i-`essim ´es diferent de 0, multihead finalitzar`a la seva execuci´o immediatament i tindr`a per codi d’acabament el valor i. S’adjunten diversos exemples d’execuci´o:

Observacions: • No existeix un l´ımit per al nombre de fitxers de la lllista. • Posem un - davant del nombre de l´ınies perqu`e ´es el format que espera el programa head. No cal que comproveu que el format sigui correcte. 7

05.566 · Sistemes Operatius · PRA2 · 20202 · Enginyeria inform` a tica · Estudis d’Inform` a tica, Multim` edia i Telecomunicaci´ o

• Cal que la vostra soluci´ o mostri la mateixa informaci´o que mostra l’exemple. • S’aconsella que dividiu el programa en parts i que no comenceu una nova part fins que l’anterior funcioni. • No podeu utilitzar la rutina system ni similars. ´ prec´ıs fer el tractament d’errors a les crides al sistema. • Es • Amb l’ordre echo $? mostrem el codi d’acabament de la darrera comanda executada • Els missatges d’error que indiquen que un fitxer no existeix els est`a escrivint la pr` opia comanda head. No els ha d’escriure el vostre codi. # include # include # include # include # include # include



< s t d l i b . h>

void e r r o r ( char ∗m) { char s [ 1 2 8 ] ; s p r i n t f ( s , " Er ro r % d % s \ n% s \ n" , err no , m, w ri t e ( 2 , s , s t r l e n ( s ) ) ;

s t r e r r o r ( er rno ) ) ;

exit (0); } int main ( in t a rg c , char ∗ a rg v [ ] ) { int i , s t ; if ( a r g c < 3 ) e r r o r ( " mi s s in g ar g u m e n ts " ) ; for ( i =2; i...


Similar Free PDFs