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