uniroma1
.*_main.c
.cognome.nome
. Sulle postazioni del laboratorio sarà /home/studente/Desktop/cognome.nome/
.cognome.nome.zip
(zip -r cognome.nome.zip cognome.nome/
).cognome.nome.zip
.rm -rf cognome.nome
).Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Tradurre in IA32 la seguente funzione is_suffix
definita in E1-is-suffix/e1.c
che, date due stringhe s1
e s2
, verifica se la s1
è un suffisso di s2
. Ad esempio ger
è suffisso di hamburger
, mentre gur
non lo è.
e1.c
int is_suffix(const char* s1, const char* s2){
const char *s1_aux = s1;
const char *s2_aux = s2;
while (*s1_aux++);
while (*s2_aux++);
while (s1 != s1_aux && s2 != s2_aux && *(--s1_aux) == *(--s2_aux));
return s1 == s1_aux && *s1_aux == *s2_aux;
}
Scrivere la soluzione nel file E1-is-suffix/e1.s
. Usare il file E1-is-suffix/e1_eq.c
per sviluppare la versione C equivalente e E1-is-suffix/e1_main.c
come programma di prova.
Si vogliono usare i segnali per creare un indicatore di progresso per la funzione do_sort
, che implementa un semplice algoritmo di ordinamento a bolle. L’indicatore di progresso è la percentuale di n
coperta da i
, vale a dire 100.0*i/n
. Si scriva la soluzione nel file E2-sort-timer/e2.c
modificandolo e aggiungendo quanto necessario al raggiungimento dell’obiettivo.
e2.c
#include "e2.h"
static void do_sort(int *v, int n) {
int i, j;
for (i=0; i<n; ++i)
for (j=1; j<n; ++j)
if (v[j-1] > v[j]) {
int tmp = v[j-1];
v[j-1] = v[j];
v[j] = tmp;
}
}
void sort(int *v, int n) {
// completare con gestione segnali...
do_sort(v, n);
}
Il risultato atteso deve essere come segue (ovviamente i numeri esatti delle percentuali possono variare):
start sorting...
-------------------------------
5.4%
11.2% <---- percentuali stampate dal gestore del segnale
17.1%
23.3%
29.7%
36.5%
43.7%
51.5%
59.7%
68.7%
79.0%
90.7%
-------------------------------
v[0]=0
v[1]=1
v[2]=2
v[3]=3
v[4]=4
v[5]=5
v[6]=6
v[7]=7
v[8]=8
v[9]=9
Suggerimento: rendere la variabile i
di do_sort
globale (dichiarata fuori dalla funzione) e tenere in un’altra variabile globale max
il valore di n
. In questo modo è possibile accedervi da un handler di un segnale che può stampare il rapporto tra i
e max
. Fare riferimento alla dispensa del corso sul segnali.
Domanda 1 Quale tra le seguenti affermazioni è VERA?
int
può essere usata esclusivamente per invocare le system callDomanda 2 Quale tra le seguenti affermazioni è VERA?
int
seguita da un numero che identifica la system call da eseguireDomanda 3 Dato il seguente codice, quale tra le seguenti affermazione è VERA?
wait
wait
Domanda 4 Dato il seguente codice, selezionare la risposta corretta:
Domanda 5 Dato il seguente codice, selezionare la risposta corretta:
Domanda 6 Quale delle seguenti affermazioni è FALSA?
SIGKILL
non può essere ignorato né catturatoSIGSEGV
non può essere catturatoSIGCHLD
viene ignorato per defaultSIGINT
, se non catturato o ignorato, causa la terminazione del processo che lo riceveSIGQUIT
, se non catturato o ignorato, causa la terminazione del processo che lo riceveDomanda 7 Quale delle seguenti affermazioni è VERA?
kill -9 <pid>
invia il segnale SIGINT
al processo con pid <pid>
kill -SIGINT <pid>
non può essere catturato dal processo con pid <pid>
alarm(s)
invia il segnale SIGALRM
ogni s
secondiualarm(t, n)
invia un segnale dopo t
microsecondi e successivamente ogni n
microsecondi