Tipps zum ersten Übungsblatt

Nachdem das Tippgeben heute in der Übung dank des Feueralarms ausgefallen ist, gibt es die Tipps fürs erste Blatt ausnahmsweise online.

Aufgabe 1

Zu jeder Teilaufgabe gibt es einen kleinen Tipp.

  1. Programme, Funktionen, etc. können gleich benannt sein. In der Vorlesung geht es vor allem um Systemaufrufe.
  2. Die Angabe der Section(s) wird in den verschiedenen Versionen von "man" unterschiedlich gehandhabt. Für SunOS können Sie sich z.B. auf thales einloggen und dort "man man" eingeben, unter Linux ebenso. Falls Sie kein Linux-System zur Hand haben, gibt es die Linux-Manpage von man auch online.
  3. Die Navigation innerhalb der Manpage geschieht mit Hilfe des Programms, welches in der Umgebungsvariable PAGER steht. Normalerweise ist dies das Programm "less". Lesen Sie doch einfach dessen Manpage!
  4. Mit der Frage ist gemeint, dass Sie verstehen sollen, wozu die Blöcke NAME, SYNOPSIS etc. stehen. Schauen Sie sich mehrere Manpages verschiedener Abschnitte an, z.B. fork und getpid (in Section 2) sowie ls und cat (in Section 1). Die Wikipedia liefert auch ein paar Informationen dazu.

Aufgabe 2

fork() erzeugt einen weiteren Prozess. Lesen Sie in der Manpage nach, welche Bedeutung die Rückgabewerte haben.

Aufgabe 3

Überlegen Sie sich die Anzahl induktiv und zeichnen Sie sich vielleicht einen "Aufrufbaum": Für n=0 wird nichts erzeugt, also gibt es insgesamt einen Prozess. n=1 bedeutet einen neuen Prozess, insgesamt zwei. Ab n=4 kann man sehr gut sehen, wie der Baum für einen Wert n von allen vorherigen Werten abhängt.

Aufgabe 4

Kompilieren Sie möglichst häufig, um früh Fehler entdecken zu können und testen Sie jeden einzelnen Verarbeitungsschritt. Ansonsten hilft die Angabe auf Seite 3 auch schon ein wenig.

Diese Aufgabe enthält zwei besondere Schwierigkeiten - an dieser Stelle noch ein Dankeschön an Micha Mutschler für die Hinweise!

Byte-Reihenfolge

Die Datei messung.dat verwendet das Big-Endian-Format. Wenn man auf Rechnern mit SPARC-Architektur arbeitet (z.B. theseus, turing, turan), fällt einem nichts auf. Auf einem Rechner mit x86-Architektur (z.B. fast alle Rechner zuhause und einige Recher des IAI) können völlig andere Zahlen auftauchen. Dies liegt daran, dass Ihr Rechner wahrscheinlich mit Little-Endian-Zahlen arbeitet. Bei Interesse können Sie sich auf der entsprechenden Wikipedia-Seite informieren - das Thema wird aber auch im Laufe der Vorlesung behandelt! Für das aktuelle Blatt empfehle ich die Programmierung auf den oben genannten Rechnern des IAI, da die Konvertierung unnötig aufwändig wäre.

read() kann weniger als 12 Byte lesen

Die Manpage von read() in Sektion 2 besagt, dass read() die Anzahl der gelesenen Bytes zurückliefert. Der Rückgabewert kann natürlich unter der angeforderten Anzahl von 12 Bytes liegen. Diesen Fall müssen Sie behandeln. Wie Sie das machen, bleibt Ihnen überlassen - die Verwendung eines Zwischenpuffers fürs Lesen wäre keine schlechte Idee:

	char puffer[12];
	struct messung *m;
	char *m_byteweise;
	// ... (Initialisierung, Datei öffnen, Schleife, Speicher für m allokieren)
	bytes_read = read(fp, &puffer, 12);
	// ... (So lange lesen, bis 12 Bytes gelesen wurden, Fehlerverarbeitung, etc..)
	// Jetzt kommt das Kopieren vom Puffer in die Struktur:
	m_byteweise = (char*)m;
	for(int i = 0; i<12; i++) {
		*(m_byteweise+i) = *(puffer+i);
	}
	// Fertig! ;)

Übrigens könnten Sie auch die Endianness beim Kopieren aus dem Puffer in die Struktur korrigieren. Das ist aber für dieses Blatt nicht nötig.

Viel Erfolg!