Übungen zu Systemnahe Programmierung in C (SPiC)

Ähnliche Dokumente
U6-1 Linux-Benutzerumgebung

Verzeichnisse. Foliensatz 5: Dateien und Verzeichnisse Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Hintergrundspeicher (Secondary storage) Katalog. SPiC

Übung aus Systemprogrammierung & Systemnaher Programmierung

E-/A-Funktionalität nicht Teil der Programmiersprache

Übungen zu Systemprogrammierung 1 (SP1)

182. stdio stdio. Eingabe. Ausgabe. Typisch für Zeileneingabe und Analyse: #include <stdio.h>

von Michaël Van Canneyt Einführung in die C-Bibliothek Libc

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

File I/O. Persistieren von Daten. Gastvorlesung Ralph Erdt erdt (bei) informatik.fh-wiesbaden.de

Dateizugriff unter C

Linux Prinzipien und Programmierung

Einführung in die C-Programmierung

X Anmelden am System. X System herunterfahren. X Grundlegendes zur Shell. X Das Hilfesystem. X Dateioperationen. X Bewegen im Verzeichnisbaum

Linux Prinzipien und Programmierung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Arbeiten mit der Shell Teil 2

Grundlagen der Programmierung

Arbeiten mit der Shell Teil 1

Vorsemesterkurs Informatik

Perl-Praxis. Dateien und Daten. Jörn Clausen Daniel Hagemeier, Jan Krüger

Informatik für Schüler, Foliensatz 1 Einführung bis...

Systemsoftware I. Dominanz der Dateisysteme. 8. Dateisysteme. Systemsoftware. Seite 8.1. (c) 2002, Prof. Dr. P. Sturm, Universität Trier

Tafelübung zu BS 1. Prozesse verwalten

Organisatorisches. Übungsleiter: Karsten Otto Homepage: Aufgaben

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

Tafelübung zu BSRvS 1 0. Erste Schritte

Beispiel für einen IPC-Server, der seinen Dienst über den Global Name Service im Netzwerk bekannt gibt. Header-Dateien einbinden

GI Vektoren

Der UNIX-Werkzeugkasten Programmieren mit UNIX

Betriebssysteme I WS 2016/17. Prof. Dr. Dirk Müller. 3 Shell-Grundlagen

Einführung in die Kommandozeile

LINUX Gesamtmitschrift

Linux - a bit advanced

Dateien und Verzeichnisse

Arbeiten mit der Shell Teil 1

Übung 4: Schreiben eines Shell-Skripts

Einführung Unix Shell

Basiskonzepte des Rechnerbetriebs

Linux/Unix Systemprogrammierung

Fortgeschrittene I/O

2. Prozesssynchronisation

Im Windows Betriebssystem sind Dateien eindeutig gekennzeichnet durch ihren Pfad, Dateinamen und nach einem Punkt die Dateierweiterung.

15. C++ vertieft (IV): Ausnahmen (Exceptions)

1 Linux-Befehlsübersicht

Einführung in das wissenschaftliche Rechnen

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

Sichere Programmierung in C

Wiederholung und Vertiefung. Programmieren in C. Pointer und so... thoto. /dev/tal e.v. 6. April 2013 (Version vom 11. April 2013) Programmieren in C

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Modellierung und Programmierung

Sichere Programmierung in C 296

Übungsblatt 1: Zur Benutzung von Computern im CIP-Pool der Informatik

Linux-Befehlsreferenz

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Prüfungsvorleistung Datenstrukturen

SelfLinux Dateien unter Linux

Eprog Starthilfe. 5. Oktober Einleitung 2

Tafelübung zu BS 5. Dateioperationen

Systeme 1. Kapitel 3 Dateisysteme WS 2009/10 1

1 Kommunikation im World-Wide-Web

Material zum Grundlagenpraktikum ITS. eine kleine Linux-Befehlsreferenz. Stand: Oktober 2007 zusammengestellt von: Cornelia Menzel Version 1.

UNIX Grundlagen. Sascha Frank SS August 2006 UNIX I. Sascha Frank. Einführung. Basic Befehle. Quellen

Arbeiten mit der Shell Teil 2

Grundlagen der Programmierung

Einführung in die Programmierung für Computerlinguisten

L A TEX, Linux, Python

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

Einführung in die Kommandozeile

Arbeiten mit der Shell Teil 1

Einführung in die Angewandte Bioinformatik

Werkzeuge der Informatik UNIX

7 Ein/Ausgabe. bs-6 1

Computer & GNU/Linux Einführung Teil 4

Linux Prinzipien und Programmierung

6.2 FAT32 Dateisystem

Linux Kurs Vorlesung 2 - Terminal

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Fuse. Filesystem in Userspace PRÄSENTATION VON TIM WELGE

Erste Schritte der Programmierung in C

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Unix Grundlagen. - ii - Ambit Professional Seminar Series. Autor: Prof. J. Anton Illik Diplom-Informatiker

Linux-Einführung Übung

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Computer & GNU/Linux Einführung Teil 3

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Übung: Entwickeln eines Shell-Skripts

Funktionales C++ zum Ersten

Heimetli Software AG HSWModule ... Senden und Empfangen von SMS-Meldungen mit einem GSM-Modul Version

Dr. Monika Meiler. Inhalt

Einführung in die Programmierung WS 2014/15. Übungsblatt 0: Einführung

Einführung in I/O und File-Handling in C ++

LAMP HowTo (Linux Apache MySQL PHP) Zugriff per SSH auf den Server. Servername: gyko.no-ip.info (Lokal: )

Unix/Linux Grundlagen für Einsteiger

Physische Dateistrukturen

Dateisysteme und Links

SSH-Zugang zu Datenbanken beim DIMDI

Systeme I: Betriebssysteme Übungsblatt 3

Lösung Übungszettel 6

Transkript:

Übungen zu Systemnahe Programmierung in C (SPiC) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2013

Inhalt Linux Terminal Arbeitsumgebung Manual Pages Fehlerbehandlung Bibliotheksfunktionen Verzeichnisschnittstelle opendir, closedir, readdir Fehlerbehandlung bei readdir Verwendung von stat Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 2 18

Terminal - historisches (etwas vereinfacht) Als die Computer noch größer waren: Seriell Computer 1 Als das Internet noch langsam war: Netzwerk DFÜ Server Farben, Positionssprünge, etc werden durch spezielle Zeichenfolgen ermöglicht 1 Televideo 925 Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 3 18

Terminal - Funktionsweise Drei Kanäle: stdin Eingaben stdout Ausgaben stdin stdout stderr stderr Fehlermeldungen Prozess Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 4 18

Terminal - stdout und stderr Beispiel stdout und stderr Ausgabe in eine Datei schreiben 1 find. > ordner.txt Vor allem unter Linux wird stdout häufig direkt mit stdin anderer Programme verbunden 1 cat ordner.txt grep tmp wc -l Vorteil von stderr: Fehlermeldungen werden weiterhin am Terminal ausgegeben Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 5 18

Die Shell Wichtige Komandos cd (change directory) Wechseln in ein Verzeichnis 1 cd /proj/i4spic/<login>/aufgabex 1 ls ls (list directory) Verzeichnisinhalt auflisten cp (copy) Datei kopieren 1 cp /proj/i4spic/pub/aufgabex/vorgabe.h /proj/i4spic/<login>/ aufgabex 2 # oder 3 cd /proj/i4spic/<login>/aufgabex 4 cp /proj/i4spic/pub/aufgabex/vorgabe.h. Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 6 18

Arbeitsumgebung Unter Linux: Kate, gedit, Eclipse cdt, Vim, Emacs,... Zugriff aus der Windows-Umgebung über SSH (nur Terminalfenster) Editor unter Linux via SSH: mcedit, nano, emacs, vim Editor unter Windows: Dateizugriff über das Netzwerk AVR-Studio ohne Projekt Notepad++ Übersetzen und Test unter Linux (z.b. via Putty) Emulation der Linux-Umgebung unter Windows für daheim: Cygwin/MinGW Code::Blocks: IDE mit vorkonfiguriertem MinGW/gcc (Support im Forum) Notepad++ und NppFTP Wichtig: Auf jeden Fall auch (per SSH) im CIP testen! Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 7 18

Übersetzen spezielle Aufrufoptionen des Compilers -pedantic liefert Warnungen in allen Fällen, die nicht 100% dem ANSI-C-Standard entsprechen -Wall Warnt vor möglichen Fehlern (z.b.: if(x = 7)) diese Optionen führen zwar oft zu nervenden Warnungen, helfen aber auch dabei, Fehler schnell zu erkennen. Wir Testen die Abgaben mit: 1 gcc -pedantic -Wall -Werror -std=c99 -D_BSD_SOURCE -o print printdir.c -Werror wandelt Warnungen in Fehler um -std=c99 Setzt verwendeten Standard auf C99 -D_BSD_SOURCE Fügt unter anderem die POSIX Erweiterungen hinzu die in C99 nicht enthalten sind -o print Die Ausgabe wird in die Datei print geschrieben. Standardwert: a.out Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 8 18

Manual Pages Das Linux-Hilfesystem aufgeteilt nach verschiedenen Sections 1 Kommandos 2 Systemaufrufe 3 Bibliotheksfunktionen 5 Dateiformate (spezielle Datenstrukturen, etc.) 7 verschiedenes (z.b. Terminaltreiber, IP,... ) man-pages werden normalerweise mit der Section zitiert: printf(3) 1 # man [section] Begriff 2 man 3 printf Suche nach Sections: man -f Begriff Suche von man-pages zu einem Stichwort: man -k Stichwort Alternativ: Webseiten, z.b. http://die.net Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 9 18

Fehlerursachen Fehler können aus unterschiedlichsten Gründen im Programm auftreten Systemressourcen erschöpft malloc(3) schlägt fehl Fehlerhafte Benutzereingaben (z.b. nicht existierende Datei) fopen(3) schlägt fehl Transiente Fehler (z.b. nicht erreichbarer Server) connect(2) schlägt fehl Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 10 18

Fehlerbehandlung Gute Software erkennt Fehler, führt eine angebrachte Behandlung durch und gibt eine aussagekräftige Fehlermeldung aus Kann das Programm trotz des Fehlers sinnvoll weiterlaufen? Beispiel 1: Ermittlung des Hostnamens zu einer IP-Adresse für Log Fehlerbehandlung: IP-Adresse im Log eintragen, Programm läuft weiter Beispiel 2: Öffnen einer zu kopierenden Datei schlägt fehl Fehlerbehandlung: Kopieren nicht möglich, Programm beenden Oder den Kopiervorgang bei der nächsten Datei fortsetzen Entscheidung liegt beim Softwareentwickler Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 11 18

Fehler in Bibliotheksfunktionen Fehler treten häufig in Funktionen der C-Bibliothek auf erkennbar i.d.r. am Rückgabewert (Manpage!) Die Fehlerursache wird meist über die globale Variable errno übermittelt Bekanntmachung im Programm durch Einbinden von errno.h Bibliotheksfunktionen setzen errno nur im Fehlerfall Fehlercodes sind immer >0 Fehlercode für jeden möglichen Fehler (siehe errno(3)) Fehlercodes können mit perror(3) und strerror(3) ausgegeben bzw. in lesbare Strings umgewandelt werden 1 char *mem = malloc(...); /* malloc gibt im Fehlerfall */ 2 if(null == mem) { /* NULL zurück */ 3 fprintf(stderr, "%s:%d: malloc failed with reason: %s\n", 4 FILE, LINE -3, strerror(errno)); 5 perror("malloc"); /* Alternative zu strerror + fprintf */ 6 exit(exit_failure); /* Programm mit Fehlercode beenden */ 7 } Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 12 18

Erweiterte Fehlerbehandlung Signalisierung von Fehlern normalerweise durch Rückgabewert Nicht bei allen Funktionen möglich, z.b. getchar(3) 1 int c; 2 while ((c=getchar())!= EOF) {... } 3 /* EOF oder Fehler? */ Rückgabewert EOF sowohl im Fehlerfall als auch bei End-of-File Erkennung im Fall von I/O-Streams mit ferror(3) und feof(3) 1 int c; 2 while ((c=getchar())!= EOF) {... } 3 /* EOF oder Fehler? */ 4 if(ferror(stdin)) { 5 /* Fehler */ 6... 7 } Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 13 18

opendir, closedir, readdir Funktions-Prototypen (details siehe Vorlesung) 1 #include <sys/types.h> 2 #include <dirent.h> 3 DIR *opendir(const char *dirname); 4 int closedir(dir *dirp); 5 struct dirent *readdir(dir *dirp); Rückgabewert von readdir Zeiger auf Datenstruktur vom Typ struct dirent NULL, wenn EOF erreicht wurde oder im Fehlerfall bei EOF bleibt errno unverändert (auch wenn errno!= 0), im Fehlerfall wird errno entsprechend gesetzt Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 14 18

Fehlerbehandlung bei readdir Fehlerprüfung durch Setzen und Prüfen von errno 1 #include <errno.h> 2... 3 struct dirent *ent; 4 while(1) { 5 errno = 0; 6 ent = readdir(...); 7 if(ent == NULL) break; 8... /* keine weiteren break-statements in der Schleife */ 9 } 10 /* EOF oder Fehler? */ 11 if(errno!= 0) { 12 /* Fehler */ 13... 14 } errno=0 unmittelbar vor Aufruf der problematischen Funktion errno wird nur im Fehlerfall gesetzt und bleibt sonst evtl. unverändert Abfrage der errno unmittelbar nach Rückgabe des pot. Fehlerwerts errno könnte sonst durch andere Funktion verändert werden Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 15 18

Fehlerbehandlung bei readdir Fehlerprüfung durch Setzen und Prüfen von errno 1 #include <errno.h> 2... 3 struct dirent *ent; 4 while(errno=0, (ent=readdir())!= NULL) { 5 6 7 8... /* keine weiteren break-statements in der Schleife */ 9 } 10 /* EOF oder Fehler? */ 11 if(errno!= 0) { 12 /* Fehler */ 13... 14 } errno=0 unmittelbar vor Aufruf der problematischen Funktion errno wird nur im Fehlerfall gesetzt und bleibt sonst evtl. unverändert Abfrage der errno unmittelbar nach Rückgabe des pot. Fehlerwerts errno könnte sonst durch andere Funktion verändert werden Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 15 18

Datei-Attribute ermitteln: stat readdir(3) liefert nur Name und Typ eines Verzeichniseintrags Weitere Attribute stehen im Inode stat(2) Funktions-Prototyp: 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 int stat(const char *path, struct stat *buf); Argumente: path: Dateiname buf: Zeiger auf Puffer, in den Inode-Informationen eingetragen werden Rückgabewert: 0 wenn OK, -1 wenn Fehler Beispiel: 1 struct stat buf; 2 stat("/etc/passwd", &buf); /* Fehlerabfrage... */ 3 printf("inode-nummer: %ld\n", buf.st_ino); Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 16 18

Das struct stat Ausgewählte Elemente dev_t st_dev Gerätenummer (des Dateisystems) = Partitions-Id ino_t st_ino Inodenummer (Tupel st_dev, st_ino eindeutig im System) mode_t st_mode Dateimode, u.a. Zugriffs-Bits und Dateityp nlink_t st_nlink Anzahl der (Hard-) Links auf den Inode uid_t st_uid UID des Besitzers gid_t st_gid GID der Dateigruppe dev_t st_rdev DeviceID, nur für Character oder Blockdevices off_t st_size Dateigröße in Bytes time_t st_atime Zeit des letzten Zugriffs (in Sekunden seit 1.1.1970) time_t st_mtime Zeit der letzten Veränderung (in Sekunden...) time_t st_ctime Zeit der letzten Änderung der Inode-Information (...) unsigned long st_blksize Blockgröße des Dateisystems unsigned long st_blocks Anzahl der von der Datei belegten Blöcke Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 17 18

stat / lstat: st_mode st_mode enthält Informationen über den Typ des Eintrags: S_IFMT 0170000 bitmask for the file type bitfields S_IFSOCK 0140000 socket S_IFLNK 0120000 symbolic link S_IFREG 0100000 regular file S_IFBLK 0060000 block device S_IFDIR 0040000 directory S_IFCHR 0020000 character device S_IFIFO 0010000 FIFO Zur einfacheren Auswertung werden Makros zur Verfügung gestellt: S_ISREG(m) - is it a regular file? S_ISDIR(m) - directory? S_ISCHR(m) - character device? S_ISLNK(m) - symbolic link? Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2013) 18 18