Du befindest dich hier: FSI Informatik » jahrgaenge » 2006 » "Muster"-Lösungen » "Muster"-Lösungen zu Klausuren aus Softwaresysteme 1 » Vordiplomsklausuren » März 2005

Dies ist eine alte Version des Dokuments!


März 2005

Aufgabe 1

  • a) 3 (?)
  • b) 1
  • c) 3 (Quelle)
  • d) 3
  • e) 1
  • f) 1(?) das ist mal ne wirklich interessante frage…
  • g) 3
  • h) 2
  • i) 4
  • j) 4 (?) ich tippe auf 2: eine seite = 4096, hauptspeicher = 4GB ⇒ ca. 2000 seiten im system, jeder eintrag in der tabelle 4 byte (32bit) macht dann 2000 x 4 = 8000 byte… 4 ist korrekt, Rechnung: 4294967296 / 4096 *32 / 8 = 4194304 Ich will nen TR!
  • k) 3
  • l) 2
  • m) 4
  • n) 2
  • o) 4

Aufgabe 2

  • a)
/* includes */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/stat.h>
 
/* Funktionsdeklarationen, globale Variablen */
 
#define MAX_LEN 128
 
int main(int argc, char **argv);
static void serve(int sock);
static void prattr(char *filename);
static void error(char *msg);
static void sighandler(int sig);
 
/* Funktion main */
 
int main(int argc, char **argv)
{
	/* lokale Variablen und was man sonst am Anfang so vorbereitet */
 
	int port;
	int sock;
	struct sockaddr_in addr;
	struct sockaddr_in client_addr;
	int client_addr_len = sizeof(struct sockaddr_in);
	int client_sock;
	int pid;
	struct sigaction action;
 
	if (argc != 2) {
		printf("usage: fileattrd PORT\n");
		exit(1);
	}
	port = atoi(argv[1]);
 
	/* Ein Signal-Handler für SIGCHLD (ein Kindprozess stirbt) wird installiert. So können Zombies mit waitpid abgeholt werden. /*
	action.sa_handler = sighandler;
	sigemtpyset(&action.sa_mask);
	action.flags = SA_RESTART;
	sigaction(SIGCHLD, &action, NULL);
 
	/* Socket oeffnen */
 
	sock = socket(PF_INET, SOCK_STREAM, 0);
	if (sock == -1) error("creating socket failed");
 
	/* Socket an angegebenen Port und beliebige IP-Adressen binden */
 
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sock, (const struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == -1) error("binding socket failed");
 
	/* Warteschlange ankommender Verbindungen auf 5 einstellen */
 
	if (listen(sock, 5) == -1) error("listening failed");
 
	/* Server-Schleife */
 
	while (1) {
 
		/* Verbindung aufnehmen */
 
		client_sock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len);
		if (client_sock == -1) error("accepting failed");
 
		/* Prozess zur Kommandoausführung erzeugen */
 
		pid = fork();
		switch(pid) {
 
		/* Fehler bei Prozesserzeugung */
 
		case -1:
			error("forking failed");
			break;
 
		/* Sohnprozess */
 
		case 0:
			serve(client_sock);
			break;
 
		/* Vaterprozess */
 
		default:
			break;
		}
	}
 
} /* Ende Funktion main */
 
/* serve-Funktion */
 
static void serve(int sock) {
	FILE *f;
	char buffer[MAX_LEN + 2];
 
	f = fdopen(sock, "rw");
	if (f == NULL) error("opening socket for reading failed");
 
	errno = 0;
	while (fgets(buffer, MAX_LEN + 1, f) != NULL) {
		buffer[strlen(buffer) - 1] = '\0';
		prattr(buffer);
		errno = 0;
	}
	if (errno != 0) error("reading string failed");
 
	fclose(f);
	close(sock);
 
	exit(0);
}
 
/* prattr-Funktion */
 
static void prattr(char *filename) {
	struct stat info;
 
	if (stat(filename, &info) == -1) {
		printf("%s %s\n", filename, strerror(errno));
		return;
	}
 
	if (S_ISREG(info.st_mode)) {
		printf("%s F %i\n", filename, info.st_size);
	} else if (S_ISDIR(info.st_mode)) {
		printf("%s D\n", filename);
	} else {
		printf("%s X\n", filename);
	}
}
 
/* weitere Funktionen, falls benoetigt */
 
static void error(char *msg) {
	perror(msg);
	exit(1);
}
 
static void sighandler(int sig) {
	int pid;
	int status;
 
	while ((pid = waitpid(-1, &status, WNOHANG)) != 0) {
		if (pid == -1) error("waiting for zombies failed");
	}
}
  • b)
fileattrd: fileattrd.c
	gcc -o fileattrd fileattrd.c

.PHONY = clean
clean:
	rm -rf fileattrd

Aufgabe 3

  • a)
  • b)
  • c)
  • d)

Aufgabe 4