Lösningsförslag till tentamen Systemprogrammering 18 mars 1994

Uppgift 1

Den var väl inte så svår?

Uppgift 2

Uppgift 3

int execute(char *command, char **args)
{
    int pid, status;

    /* Fork new process */
    if ((pid = fork()) == 0) {
        /* Child process */

        /* Execute command */
        if (execvp(command, args) == -1) {
            exit(-1);
        }
    }

    if (pid == -1)
        return -1;

    /* Wait for termination */
    while (wait(&status) != pid)
        ;

    /* Return exit status of child */
    return (status & 0xff00) >> 8;
}

Uppgift 4

NEW INTERVIEW

Uppgift 5

#include 
#include 
#include 
#include 

char *progname = NULL, *command = NULL, *pattern = NULL;
int pflg = 0;

main(argc, argv)
int argc;
char **argv;
{
    extern char *optarg;
    extern int optind;

    int c, errflg = 0;
    char *optstr = "n:px:";
    char *usagestr = "[-n namepat -p -x command] dir...";

    progname = argv[0];
    while ((c = getopt(argc, argv, optstr)) != -1)
        switch (c) {
            case `p':
                pflg++; break;
            case `n':
                pattern = optarg; break;
            case `x':
                command = optarg; break;
            case `?':
                errflg++; break;
        }

    if (errflg) {
        fprintf(stderr, "usage: %s %s", progname, usagestr);
        exit (1);
    }

    if (optind == argc) /* No directory arguments, use . */
        find(".");

    /* Loop through all directories */
    for (; optind < argc; optind++)
        find(argv[optind]);

    exit(0);
}

find(char *directory)
{
    DIR *dirp;
    struct dirent *dp;
    char fullname[MAXPATHLEN], *argv[3];

    if ((dirp = opendir(directory)) == NULL) {
        perror(directory);
        return;
    }

    while ((dp = readdir(dirp)) != NULL) {
        /* Construct full name */
        sprintf(fullname, "%s/%s", directory, dp->d_name);

        /* Test if name matches optional pattern */
        if (!pattern || regmatch(pattern, dp->d_name)) {
            if (pflg)
                printf("%s\n", fullname);
            if (command) {
                argv[0] = command;
                argv[1] = fullname;
                argv[2] = 0;
                if (execute(command, argv) == -1)
                    perror(command);
            }
        }
        /* Test if directory */
        if (IsDirectory(fullname, dp->d_name))
            find(fullname);
    }
    closedir (dirp);
    return;
}

int IsDirectory(char *fullname, char *shortname)
{
    struct stat statbuf;

    /* Get information about file */
    if (stat(fullname, &statbuf) == -1) {
        perror(fullname);
        return 0;
    }

    /* Test if directory and not . or .. */

    return S_ISDIR(statbuf.st_mode) && strcmp(shortname, ".")
                                 && strcmp(shortname, "..")
}

Uppgift 6

Här gick det bra med nästan vad som helst.

Uppgift 7

· Datastruktur, data åtkoms endast via monitorfunktioner 2
· En process i taget exekverar i monitorn 1
· Synkronisering med konditionsvariabler 1

Uppgift 8

· Rendezvous. Dubbelriktad, synkron meddelandeöverföring.
· Sändaren initierar kommunikation. Talar om att han vill kommunicera med en mottagare. Specificerar ett meddelande
· Mottagaren talar om att han vill vara med på kommunikationen och får meddelandet från sändaren.
· Mottagaren får tid på sig att beräkna ett svarsmeddelande som han så småningom skickar tillbaks till sändaren.
· Sändaren har varit blockerad hela tiden, med får nu svar på sin förfrågan.