Du befindest dich hier: FSI Informatik » jahrgaenge » 2006 » "Muster"-Lösungen » "Muster"-Lösungen zu Klausuren aus Softwaresysteme 1 » Vordiplomsklausuren » September 2004
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
jahrgaenge:2006:loesungen:softwaresysteme_1:vordiplom:sep2004 [27.08.2007 08:28] – angelegt Der Ich | jahrgaenge:2006:loesungen:softwaresysteme_1:vordiplom:sep2004 [06.09.2007 22:29] (aktuell) – 84.149.131.54 | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
==== Aufgabe 1 ==== | ==== Aufgabe 1 ==== | ||
+ | |||
+ | * a) 3 | ||
+ | * b) 3 | ||
+ | * c) 2 | ||
+ | * d) 1 | ||
+ | * e) 4 | ||
+ | Warum? gibts dafür ne Begründung? | ||
+ | * f) 2 | ||
+ | * g) 1 | ||
+ | * h) 4 | ||
+ | * i) 3 | ||
+ | * j) 3 | ||
+ | * k) 4 | ||
+ | Ich wäre für 3: physikalische Betriebsmittel können nie entzogen werden... aber virtuelle schon - In der Übung wo man März 2006 gemacht hat kam auch die Frage, da wars meines Wissens das 4te? | ||
+ | -> Die virtuellen Betriebsmittel können nicht entzogen werden, weil dazu in den Prozeß eingegriffen werden müßte. Das System kann aber die physikalischen Mittel als Grundlage entziehen, um sie neu zu vergeben. | ||
+ | * l) 2 | ||
+ | * m) 2 | ||
+ | |||
+ | Folgende Aufgaben sind der Musterlösung entnommen: | ||
==== Aufgabe 2 ==== | ==== Aufgabe 2 ==== | ||
+ | |||
+ | * a) | ||
+ | |||
<code c> | <code c> | ||
+ | |||
+ | /* includes */ | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | /* Funktionsdeklarationen, | ||
+ | |||
+ | void sighup_handler(); | ||
+ | void msgserver(); | ||
+ | char *getconf(int *); | ||
+ | static char cfile[256]; | ||
+ | static int reload_msg = 1; | ||
+ | |||
+ | int main(int argc, char *argv[]) { | ||
+ | |||
+ | /* Argumente prüfen */ | ||
+ | |||
+ | if (argc == 1) { | ||
+ | strcpy(cfile, | ||
+ | } | ||
+ | else if (argc == 2) { | ||
+ | strcpy(cfile, | ||
+ | } | ||
+ | else { | ||
+ | fprintf(stderr, | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | | ||
+ | /* Serverprozess starten */ | ||
+ | |||
+ | { | ||
+ | pid_t pid; | ||
+ | pid = fork(); | ||
+ | |||
+ | if (pid == -1) { | ||
+ | perror(" | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | else if (pid == 0) { | ||
+ | msgserver(); | ||
+ | } | ||
+ | else { | ||
+ | printf(" | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* msgserver-Funktion */ | ||
+ | |||
+ | void msgserver() { | ||
+ | |||
+ | /* Variablendefintionen */ | ||
+ | |||
+ | char *message; | ||
+ | int msg_size; | ||
+ | int sock_accept; | ||
+ | int sock_listen; | ||
+ | struct sockaddr_in sa_listen; | ||
+ | struct sockaddr_in sa_accept; | ||
+ | |||
+ | /* Socken öffnen, binden, usw. */ | ||
+ | |||
+ | if ( (sock_listen = socket(PF_INET, | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | sa_listen.sin_addr.s_addr = INADDR_ANY; | ||
+ | sa_listen.sin_family = AF_INET; | ||
+ | sa_listen.sin_port = htons(9999); | ||
+ | |||
+ | if ( bind(sock_listen, | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | listen(sock_listen, | ||
+ | |||
+ | /* Signal-Handler für SIGHUP einrichten */ | ||
+ | |||
+ | { | ||
+ | struct sigaction act; | ||
+ | act.sa_handler = sigchld_handler; | ||
+ | sigemptyset(& | ||
+ | act.sa_flags = 0; | ||
+ | sigaction(SIGHUP, | ||
+ | } | ||
+ | |||
+ | while (1) { | ||
+ | |||
+ | if (reload_msg) { | ||
+ | if ( (message = getconf(& | ||
+ | fprintf(stderr, | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | reload_msg = 0; | ||
+ | } | ||
+ | |||
+ | /* Verbindung annehmen */ | ||
+ | |||
+ | { | ||
+ | int addr_size = sizeof(sa_accept); | ||
+ | |||
+ | if ( (sock_accept = accept(sock_listen, | ||
+ | if (ERRNO = EINTR) { | ||
+ | continue; | ||
+ | } | ||
+ | perror(" | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | /* Text ausgeben */ | ||
+ | |||
+ | { | ||
+ | FILE *conn; | ||
+ | int i; | ||
+ | |||
+ | if ( (conn = fdopen(sock_accept, | ||
+ | perror(" | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | |||
+ | for (i = 0; i < msg_size; i++) { | ||
+ | putc(message[i], | ||
+ | } | ||
+ | |||
+ | fclose(conn); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | char *getconf(int *s) { | ||
+ | |||
+ | /* Variablendefinitionen */ | ||
+ | |||
+ | static char *buffer = NULL; | ||
+ | struct stat statbuf; | ||
+ | int i; | ||
+ | FILE *cf; | ||
+ | |||
+ | /* Groeße der Datei ermitteln */ | ||
+ | |||
+ | if ( stat(cfile, & | ||
+ | perror(" | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | /* Speicher allokieren */ | ||
+ | |||
+ | if ( (buffer = realloc(buffer, | ||
+ | perror(" | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | /* Datei einlesen */ | ||
+ | |||
+ | if ( (cf = fopen(cfile, | ||
+ | perror(" | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | if ( fread(buffer, | ||
+ | fprintf(stderr, | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | fclose(cf); | ||
+ | |||
+ | /* Ergebnis liefern */ | ||
+ | |||
+ | *s = statbuf.st_size; | ||
+ | return buffer; | ||
+ | } | ||
+ | |||
+ | void sighup_handler() { | ||
+ | | ||
+ | reload_msg = 1; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | * b) | ||
+ | |||
+ | < | ||
+ | |||
+ | msgd: msgd.c | ||
+ | ($CC) -o msgd msgd.c | ||
+ | |||
+ | msgd.c: | ||
+ | co msgd.c | ||
+ | |||
+ | clean: | ||
+ | rm -f msgd | ||
+ | |||
</ | </ | ||
==== Aufgabe 3 ==== | ==== Aufgabe 3 ==== | ||
+ | |||
+ | * a) | ||
+ | * b) | ||
+ | * c) | ||
==== Aufgabe 4 ==== | ==== Aufgabe 4 ==== | ||