Lösningsförslag till omtentamen
Systemprogrammering, 5p
9 April 1994
Uppgift 1 (14 p)
Var väl inte så svårt?
Uppgift 2 (4 p)
a) Inbyggda kommandon
Implementerade i shell-programmet. Exekveras av direkt i shellet. Inget subshell startas.
b) Aliases
Användardefinierade komandon som exekveras i shellet. Består av kombinationer av alla
typer av kommandon.
c) Externa kommandon
Shell scripts eller binärfiler som exekveras av ett subshell. Lagras på /bin eller /usr/bin
eller liknande.
d) Egna kommandon
Samma som externa kommandon. Definierade av användaren. Lagras på dennes /bin
directory eller liknande.
Uppgift 3 (4)
a) BIT0(x)
#define BIT0(x) ((x) & 1)
b) BIT(x,n)
#define BIT(x,n) ((x) >> (n) & 1)
c) Förutsatt att man använder heltalsuttryck, kan användandet av macrona ovan resultera i
oväntande/oönskade resultat? Motivera ditt svar.
NEJ
Uppgift 4 (12 p)
char *optarg;
int optind = 0;
int getopt(int argc, char **argv, char *optstr)
{
char *op;
if (++optind == argc) /* No more arguments */
return -1;
if (argv[optind][0] != `-') /* No more options */
return -1;
for (op = optstr; *op; op++) {
char optchar = argv[optind][1];
if (optchar == *op) {
if (*(op + 1) == `:') {
/* Option has arguments */
if (++optind < argc)
optarg = argv[optind];
else
return `?'; /* Missing argument */
}
return optchar; /* Correct option */
}
}
return `?'; /* Unknown option */
}
Uppgift 5 (12 p)
Beskriv vad som karaktäriserar följande synkroniseringsprimitiv. Beskriv hur synkronisering
går till, vilka data som utbyts etc.
a) Busy waiting
b) Shared Variables
c) Semaforer
d) Monitorer
e) Meddelandeöverföring
f) Remote procedure call
Uppgift 6 (4 p)
qsort(infoarr, INFOLEN, sizeof (infotype), strcmp);
eller
int compare(infotype *s1, infotype *s2);
. . .
qsort(infoarr, INFOLEN, sizeof (infotype), compare);
. . .
int compare(infotype *s1, infotype *s2)
{
return strcmp(s1->key, s2->key);
}
Uppgift 7 (4 p)
Arrayer är konstanpekare till minnesareor som innehåller data.
En pekarvariabler är en minnescell som innehåller adressen till en minnesarea.
Minne till pekarvariabler allokeras på heapen med malloc eller liknande eler genom tilldelning
av perkarvariabeln med en adress.
Minne till statiska arrayer allokeras i dataarean när programmet startas upp. Automatiska
arrayer allokeras på stacken vi d aktivering av funktionen den är deklarerad i.
Uppgift 8 (6 p)
a) Rita en bild av datastrukturen a[ ] med pilar som markerar hur pekarvärden är satta.
b) Vad skrivs ut av programmet?
a[0].s = abcd p->s = abcd a[2].s1p->s = abcd
--a[i].i = 0 a[i].s[3] + 1 = e
--a[i].i = 1 a[i].s[3] + 1 = i
++(p->s) = bcd a[(++p)->i].s = efgh a[--(p->s1p->i)].s = ijkl