Preguntes curtes
-
¿En quins casos, a més de bloqueig o final del procés, pot produir-se un canvi de procés en un sistema amb planificador basat en la política “Completely Fair Scheduling” (CFS)? I en Round-Robin (RR)?
Resposta
-
Donada la següent jerarquia de processos:

-
Indica per a cada procés quins pids poden conèixer de la resta de la jerarquia.
Resposta
-
Quin codi implementaries perquè cadascun mostri aquests pids per pantalla?
Resposta
1int main(int argc, char *argv[]) { 2 char buffer[128]; 3 int res, pid, status, i; 4 for (i = 0; i < 3; i++) { 5 res = fork(); 6 switch(res) { 7 case -1: 8 perror("Error en fork"); 9 exit(1); 10 break; 11 case 0: 12 sprintf(buffer,"proc %d, pare %d\n",getpid(),getppid()); 13 write(1,buffer,strlen(buffer)); 14 exit(0); 15 } 16 } 17 for (i = 0; i < 3; i++) { 18 pid = waitpid(-1,&status,0); 19 } 20} -
¿És possible garantir que l’ordre dels missatges sigui sempre el mateix?
Resposta
-
Processos i signals
-
Donat el següent codi, contesta raonadament a les següents preguntes:
1void f_signal(int s) { 2 char b[128]; 3 sprintf(b,"Signal ack %d\n",s); 4 write(1,b,strlen(b)); 5} 6int main(int argc,char *argv[]) { 7struct sigaction sa; 8sigset_t m,m1; 9sigfillset(&m); 10sigprocmask(SIG_BLOCK,&m,NULL); 11sa.sa_handler=f_signal; 12sigemptyset(&sa.sa_mask); 13sa.sa_flags=0; 14sigaction(SIGUSR1,&sa,NULL); 15sigdelset(&m,SIGUSR1); 16while(1) { 17 sigsuspend(&m); 18} 19}-
Si, des de teclat, enviem un
SIGUSR1al procés mitjançant la comandakill, veurem el missatge "Signal ack XX"? (a on XX és el codi del SIGUSR1)Resposta
-
Què passarà si enviem un
SIGINTquan estem bloquejats alsigsuspend?Resposta
-
-
Donat el següent codi (el tractament d’errors ha estat omès per claredat; cap crida al sistema retorna error), respon a les següents preguntes, justificant totes les respostes, suposant que executem el programa amb la línia de comandes:
$ ./ejercicio_exec 4
1 int sigchld_recibido = 0; 2 int pid_h; 3 void trat_sigalrm(int signum) { 4 char buff[128]; 5 if (!sigchld_recibido) kill(pid_h, SIGKILL); 6 strcpy(buff, “Timeout!”); 7 write(1,buff,strlen(buff)); 8 exit(1); 9 } 10 void trat_sigchld(int signum) { 11 sigchld_recibido = 1; 12 } 13 void main(int argc,char *argv[]) 14 { 15 int ret,n; 16 int nhijos = 0; 17 char buff[128]; 18 struct sigaction trat; 19 trat.sa_flags = 0; 20 sigempty(&trat.sa_mask); 21 trat.sa_handler = trat_sigchld; 22 sigaction(SIGCHLD, &trat, NULL); 23 /* linia 23 */ 24 n=atoi(argv[1]); 25 if (n>0) { 26 pid_h = fork(); 27 if (pid_h == 0){ 28 n--; 29 trat.sa_flags = 0; 30 sigempty(&trat.sa_mask); 31 trat.sa_handler = trat_sigalrm; 32 sigaction(SIGALRM, &trat, NULL); 33 sprintf(buff, "%d", n); 34 execlp("./ejercicio_exec", "ejercicio_exec", buff, (char *)0); 35 } 36 strcpy(buff,"Voy a trabajar \n"); 37 write(1,buff,strlen(buff)); 38 alarm (10); 39 hago_algo_de_trabajo();/*no ejecuta nada relevante para el problema */ 40 alarm(0); 41 while((ret=waitpid(-1,NULL,0))>0) { 42 nhijos++; 43 } 44 sprintf(buff,"Fin de ejecución. Hijos esperados: %d\n",nhijos); 45 write(1,buff,strlen(buff)); 46 } else { 47 strcpy(buff,"Voy a trabajar \n"); 48 write(1,buff,strlen(buff)); 49 alarm(10); 50 hago_algo_de_trabajo();/*no ejecuta nada relevante para el problema */ 51 alarm(0); 52 strcpy(buff, “Fin de ejecución\n”); 53 write(1,buff, strlen(buff)); 54 } 55 }-
Dibuixa la jerarquia de processos que crea i assigna a cada procés un identificador per poder referir-te a ells a les següents preguntes.
Resposta
-
Suposant que l’execució de la funció
hago_algo_de_trabajo()triga sempre menys de 10 segons.-
Per cada procés, indica quins missatges mostrarà per pantalla.
Resposta
-
Per a cada procés, indica quins signals rebrà.
Resposta
-
Suposa que movem les sentències des de la línia 29 a la 32 a la posició de la línia 23, afectaria d’alguna manera les respostes de les dues preguntes anteriors? Com?
Resposta
-
-
Suposem ara que l’execució de la funció
hago_algo_de_trabajotriga sempre més de 10 segons.-
Per a cada procés, indica quins missatges mostrarà per pantalla.
Resposta
-
Per a cada procés, indica quins signals rebrà.
Resposta
-
Suposa que movem les sentències des de la línia 29 a la 32 a la posició de la línia 23, afectaria d’alguna manera les respostes de les dues preguntes anteriors? Com? Es possible garantir que el resultat sigui sempre el mateix?
Resposta
-
-
-
Donat el següent codi:
1act.sa_handler = funcio_meva; 2act.sa_flags = SA_RESTART; 3sigemptyset(act.sa_mask); 4sigaction(SIG_ALRM, &act, NULL) 5pid = fork(); 6alarm(1); 7if (pid == 0) 8 execlp(``./binari”, ``binari”, (char *)0); 9funcio_meva();Suposant que cap crida al sistema dona error, que el programa binari i la funció
funcio_mevatriguen 10 segons cadascuna i que tot el codi que apareix abans de l'execlpi defuncio_mevatriga menys d’un segon en executar-se.-
Quin processos rebràn un
SIGALRM?Resposta
-
Com reacciona cada procés al
SIGALRMen cas de rebre’l?Resposta
-
-
Analitza el codi que et mostrem a continuació i respon a les preguntes de la manera més detallada possible dins l’espai de que disposes. Suposa que executem el programa des del terminal amb la següent línia de comandes:
$ ./a.out 21#define FORBYTES 32 2int beep = 0; 3void ras(int s) { 4 sigset_t m; 5 if (s == SIGALRM) { 6 write(1, " FINAL!\n", 8); 7 beep++; 8 } 9 if (beep < 1) { 10 sigprocmask(SIG_SETMASK,NULL, &m); 11 sigdelset(&m,SIGALRM); 12 if (sigsuspend(&m)>0) write(1,"SO",2); 13 } 14} 15int main(int argc, char *argv[]) { 16 int i; 17 struct sigaction sa; 18 int n = atoi(argv[1]); 19 sa.sa_handler = ras; 20 sigfillset(&sa.sa_mask); 21 sa.sa_flags = SA_RESTART; 22 for (i = 0; i < FORBYTES; i++) { 23 sigaction(i, &sa, NULL); 24 alarm(FORBYTES+1-i); 25 } 26 for (i = 0; i < n; i++) fork(); 27 while (waitpid(-1, NULL, 0)>0); 28 write(1,"\tEXAMEN!",8); 29 exit(0);30. 30}-
Dibuixa la jerarquia de processos creada. Etiqueta cadascun per poder referir-te a ells durant la resta de la teva resposta.
Resposta
-
Quins signals estan bloquejats quan comencem a executar la funció
ras()?Resposta
-
Quins processos escriuen "EXAMEN!"? I "FINAL!"? I "SO"?
Resposta
-
Quina o quines línies de comandes hauries d’executar perquè tots els processos arribessin a la línia 29, escrivint per pantalla?
Resposta
-


