Libfind neue Paradigmen für UNIX Software

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

Computer & GNU/Linux Einführung Teil 4

Übungen zu Systemprogrammierung I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2003 C-Uebung1.fm

Unix/Linux Grundlagen für Einsteiger

Computernutzung für Experimentalphysiker Frei progammierbare Rechner als Werkzeuge in der Experimentalphysik Teil 2

Shell. Oder Konsole suchen im Application Finder. Auch Terminal, Bash oder Kommandozeile genannt. Bash nimmt Befehle entgegen und führt diese aus

L A TEX, Linux, Python

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

Fallbeispiel Unix. Betriebssysteme. Hermann Härtig TU Dresden

Arbeiten mit der Shell Teil 3

D.2 Sonderzeichen (2)

UNIX Die wichtigsten Befehle

Computer & GNU/Linux Einführung Teil 3

Da einige Befehle gerne in Vergessenheit geraten werden hier einige essentielle und nützliche Befehle aufgelistet.

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

ATB Ausbildung Technische Berufe Ausbildungszentrum Klybeck

UNIX/Linux Lösung. Mär 14, 17 20:40 Seite 1/6. Prozeßsynchronisation (was ist das?, wo kommt es vor?, Beispiel?):

Betriebssysteme UNIX/Linux Übungsthema 3 Zugriffsrechte und Werkzeuge zum Dateihandling. Dirk Wenzel Dr. Jörg Gruner

Okt 02, 17 12:28 UNIX/Linux Lösung

Patrick Ditchen 4. Auflage. Shell-Skript Programmierung. Inklusive CD-ROM

Betriebssysteme UNIX/Linux Übungsthema 1 Einführung in UNIX/Linux. Dirk Wenzel Dr. Jörg Gruner

Einführung in die Angewandte Bioinformatik

SHELL WE BEGIN? EINE EINFÜHRUNG IN DIE SHELL. Max Rosin - ANKÜNDIGUNGEN

cat more less tail head

UNIX-Benutzerumgebung und Shell. die Zuordnung der Zeichen zu den Sonderfunktionen kann durch ein UNIX-Kommando (stty(1)) verändert werden

Basiskonzepte des Rechnerbetriebs

Arbeiten mit der Shell Teil 2

2.Übung Systemsoftware (SYS) Hochschule Mannheim

C-Programme erstellen und ausführen

Arbeiten mit der Shell Teil 2

LINUX Gesamtmitschrift

LINUX TUTORIAL. Repolusk Jürgen Technische Universität Wien Security WS 2006/2007

13. Anhang B: Linux-Grundbefehle

Exkurs: Unix Programme

Hochschule Für Angewandte Wissenschaften FH München Sommersemester Thomas Kolarz. Folie 1.

Archivieren und Komprimieren, Globs

Linux - a bit advanced

Literatur. Einführung in Unix. Login. Passwort. Mag. Thomas Griesmayer. Benutzererkennung und Passwort Case-Sensitiv Prompt

Literatur zu Linux. im Internet Teil der Installation: man, info O'Reilly Verlag: Addison-Wesley: noch viele weitere Bücher und Online-Dokumente

1 Einleitung UNIX und seine Philosophie 13

Einleitung 1. Entwicklung von Unix 11. Bedienung von Linux 19

Grafische Oberfläche, Shell Teil 4 Linux-Kurs der Unix-AG

Linux I II III Res WN/TT NLTK XML Weka E Theorie Terminal Ein- und Ausgabe. Linux I. 1 Linux I. Theorie Terminal Ein- und Ausgabe. Ressourcen-Vorkurs

0. Erste Schritte. Tafelübung zu BSRvS1. Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

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

Strukturen können wie normale Variablen an Funktionen übergeben werden. Strukturen können auch Ergebnis einer Funktion sein

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Linux I II III Res/Pro WN/TT Theorie Terminal Ein- und Ausgabe. Linux I. 1 Linux I. Theorie Terminal Ein- und Ausgabe. Ressourcen-Vorkurs

Tafelübung zu BSRvS 1 0. Erste Schritte

Betriebssysteme Ein Überblick

UNIX/Linux Lösung. Okt 12, 13 13:57 Seite 1/6. Pipe (was ist das?, wo kommt es vor?, Beispiel?): Datenverbindung zwischen 2 Prozessen(Kommandos)

Betriebssysteme 2. Foliensatz Z Zusammenfassung. Prof. Dr.-Ing. Hans-Georg Eßer. 12. Januar 2017

1. Aufgabenblatt Unix

Computer & GNU/Linux Einführung Teil 2

Unix-Shells. mehrere Befehle in einer Zeile. bash: Grundlagen. Ein- und Ausgaben umlenken. Befehle: Dateien und Verzeichnisse (1)

Prüfung Betriebssysteme 1

Einführung Unix Shell

Übung 1 - Betriebssysteme I

Literatur. Einführung in Unix. Login. Passwort. Mag. Thomas Griesmayer. Benutzererkennung und Passwort Case-Sensitiv Prompt

Arbeiten mit der Shell Teil 1

Archivieren und Komprimieren, SSH

Okt 10, 16 17:29 UNIX/Linux Lösung

Einführung in die Kommandozeile

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

Arbeiten mit der Shell Teil 1

2 2. Tag. 2.1 Das Dateisystem. das Dateisystem organisiert die Speicherung von Daten. viele Betriebssysteme haben verschiedene Dateisysteme

U5 5. Übung. U5-1 Überblick. Besprechung 3. Aufgabe (mini_sh) Fragen zur Aufgabe 4 (malloc)??? Erstellen von C-Funktionsbibliotheken. SoS I - Ü U5.

Ein- und Ausgabeumlenkung

Dateisystem. Heimo Schön 4/2002 Seite 1/31

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

Praktikum RO1 Einführung Linux / Ubuntu / Bash

Das CIP der Mathematik

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Archivieren und Komprimieren, Globs

Tafelübung zu BS 0. Erste Schritte

Inhalt Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Terminal - historisches (etwas vereinfacht) Seriell. Computer. Netzwerk DFÜ.

Arbeiten mit der Shell Teil 2

(Unix) Shell Programmierung

Der UNIX Markt. Verteilung von WEB servers (Quelle: netcraft) Geschichte des UNIX Betriebssystemes 2

Vorlesung Unix-Praktikum

Introduction to Linux/bash Carl Herrmann Cancer Regulatory Genomics B080 - DKFZ

Lösungshinweise/-vorschläge zum Übungsblatt 13: Software-Entwicklung 1 (WS 2017/18)

1. Aufgabenblatt Unix

1. Aufgabenblatt Unix

Die Kommandozeile der vergessene Riese

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

Archivieren und Komprimieren, Globs

Linux Prinzipien und Programmierung

Archivieren und Komprimieren, Globs

Prozesse, Logs und Systemverwaltung

Desktop ade: Me and my shell

Dateien und Verzeichnisse

U5-2 Erstellen von C-Funktionsbibliotheken

Pipes. 1 Prozessverwaltung. 2 Pipes. 3 Rechteverwaltung. 4 Secure Shell Fernsteuern anderer Rechner. 5 Kommandos, Kommandos, Kommandos,...

Konzepte der Programmiersprachen

Archivieren und Komprimieren, Globs

Linux Grundlagen Tutorium

FH Frankfurt am Main WS 2007/2008. Unix-Praktikum

Transkript:

Libfind neue Paradigmen für UNIX Software Jörg Schilling

Erstes UNIX ~ 1970 auf PDP-7 UNIX Systeme der 1970er Jahre UNIX V6 (1976) auf PDP-11 Adressraum 2x64 kb Kein virtueller Speicher Programme können nur als Ganzes in den Swap Adressraum bestimmt Programmgröße Große Programme mit Fehlermeldungen unmöglich Lösung durch Douglas McIlroy Pipes (1973) Kombination kleiner Programme out1 -> in2 Steve Bourne: einen Tag nach der Erfindung der Pipes konnten wir uns nicht mehr vorstellen wie es ohne war

Wenig Speicher und Pipes bestimmen Regeln Regeln aus der Pipe Philosophie Schreibe kleine Programme mit nur einer Aufgabe Schreibe Programme mit Text Ein- und Ausgabe Schreibe Programme die gut zusammenarbeiten Fazit: Mach nur eine Sache aber die gut Extreme Beispiele: SCCS (1972) get s.file --> s.file nonexistant (ut4) help ut4 --> The file and/or a directory in the pathname does not exist. Check for typos.

Stimmen die Regeln der 1970er Jahre noch? 1975: 2x64 kb Adressraum 2007: Hunderte von MB sind kein Problem Können alle Probleme durch die Kombination kleiner Programme gelöst werden? Können alle Probleme durch die Kombination kleiner Programme sinnvoll gelöst werden? Geben uns heutige Betriebssysteme vielleicht bessere Hilfsmittel für bessere Lösungen?

Untersuchungen am praktischen Beispiel TAR ist ein Dateiarchivierungprogramm Es archiviert mehrere Dateien in eine neue Datei Es extrahiert eine oder mehrere Dateien aus einem Archiv Es listet den Inhalt eines Archivs auf Möglichkeiten der traditionellen Pipe Philosophie: Erstellen einer Vorauswahl der zu archivierenden Dateien mit Hilfe von find(1) und anschließende Archivierung Extrahieren des Archivs und anschließende Modifikation von Dateirechten und Dateieigentümern mit Hilfe von find(1) Auflisten einer Auswahl des Inhaltes des Archivs mit Hilfe von grep(1)

Was die traditionelle Philosohie nicht kann Auflisten aller Dateien des Archivs die z.b. älter als 3 Tage sind ohne das Archiv dazu auszupacken Extrahieren nur der Dateien des Archivs, die einem bestimmten Benutzer gehören Regelbasiertes Archivieren von Dateien mit anderen Zugriffsrechten oder Eigentümern als in der Originaldatei Extrahieren von Dateien und Modifizieren der Rechte bzw. Eigentümer in einem Schritt

Schlüsse aus der historischen Methode Die historische Methode kombiniert bestehende Programme und ermöglicht so eine Wiederverwendung der Funktionen dieser Programme in einem größeren Projekt Wenn mehr als ein einfacher Datenfluß a -> b benötigt wird dann versagt die Pipe Methode Fazit: Die historische Methode ist beschränkt

Hoher Speicherbedarf ist kein Problem Heutige Randbedingungen Alle modernen Plattformen bieten dynamische (shared) Bibliotheken Fast alle modernen Plattformen bieten zur Laufzeit ladbare Bibliotheken fork()/exec() ist relativ aufwendig Aufruf von Unterprogramm -Prozessen ist teuer ARG_MAX ist zwar größer als früher aber nicht unendlich find. -name '*.[hc]' -exec wc {} + nicht immer erfolgreich Solaris 32 Bit: 1MB, 64 Bit: 2MB

Die Lösung: shared libraries intelligent nutzen Alt: kleine Programme sind kombinierbar und wiederverwendbar Neu: kleine shared libraries sind kombinierbar und wiederverwendbar Alt: Pipes ermöglichen Datenfluß in eine Richtung Neu: shared libraries ermöglichen komplexen Datenfluß Alt: Laden von Programmen ist teuer Neu: Laden von shared libraries ist weniger aufwendig Alt: Die Anzahl der Parameter bei exec() is begrenzt Neu: Datenmenge bei Parameterübergabe mit shared lib nur durch Speicher begrenzt

Existierende Implementierungen auf lib-basis David Korn und Glenn Fowler libcmd von ksh93(1) enthält eine rentrante Implementierung der wichtigsten UNIX Kommandos basename, cat, chgrp, chmod, chown, cmp, comm, cp, cut, date, dirname, expr, fmt, fold, getconf, head, id, join, ln, logname, mkdir, mkfifo, mv, paste, rm, rmdir, stty, tail, tee, tty, uname, uniq, wc Aufruf z.b. b_cat(int argc, char **argv, void *context); Ksh93 ermöglicht das Laden von shared libs zur Laufzeit Jörg Schilling libfind wird zur Zeit durch star(1) und mkisofs(1) genutzt libfind ist eine vollständige reentrante find(1) Implementierung

Vergleich libcmd libfind libcmd hat einfache separat aufzurufende Kommandos ksh93 ruft die Kommandofunktionen mit argc, argv Jede Kommandofunktion hat ihren eigenen unabhängigen Optionsparser libfind wird typischerweise in Programme eingebettet sfind(1) ist ein 10 Zeilen Programm um libfind star/mkisofs find(1) Kommandosyntax wird eingebettet SCCS (geplant) libfind wird unerkannt genutzt libfind könnte auch durch ksh93 genutzt werden und dann statt fork()/exec() direkt wieder Kommandofunktionen aus libcmd rufen

Einbindung von libfind in star und mkisofs Im Create- Modus ruft libfind eine Callbackfunktion von star zur Archivierung der Datei auf Im List- und Extrakt- Modus ruft star den Expression- Interpreter von libfind für jede Datei auf In beiden Fällen wird die Datei übersprungen wenn der libfind Interpreter FALSE liefert In beiden Fällen kann libfind den struct stat modifizieren Nach der Option -find erfolgt die Übergabe an den Kommandozeilenparser von libfind

Sind shared libs die Lösung für alles? Zuviel Funktionen -> zuviele Optionen Kleiner ist immer noch besser Kombination von vielen Funktionen nur dann wenn die notwendigen Optionen überschaubar bleiben Schlecht: unübliche neue Optionen geringer Mächtigkeit z.b. GNU tar Gut: zusätzlich die mächtige und bekannte find(1) Kommandozeilensyntax z.b. star

Regeln für für Verwendung von shared libs Nutzung von Funktionen aus shared librares nur wenn es sinnvoll ist: Komplexer Datenfluß ist nicht durch Pipes zu erreichen Grenzen durch fork()/exec() ARG_MAX können vermieden werden Performance Gewinn ist erreichbar Gewünschte Funktion ist in Reentranter lib verfügbar Nicht alle alten Regeln verwerfen sondern ergänzen Selbst sinnvolle Funktionen als shared lib implementieren

Aufwand und aktueller Zustand Das sfind(1) Programm wurde in einer Woche von Scratch im Juli 2004 implementiert Seit Oktober 2005 entsteht daraus libfind Erste nutzbare Kombination sfind/star nach 1 Mannmonat Bislang mehr als 3 Mannmonate Aufwand bei der Konvertierung zu einer sauberen Bibliothek libfind ist seit Ende 2006 ausreichend entwickelt Vollständige Implementierung im März 2007

Konvertierung Programm -> Biliothek Keine globalen modifizierbaren Daten sondern Funktionsparameter Kein exit() sondern return(error_code) Keine Speicherlecks, auch bei Fehlern free() aller allozierter Daten Ausgaben zu Fehlern vermeiden, stattdessen Fehlercodes Ausgaben sollen umlenkbar sein (z.b. FILE *std[3]) Nachdenken über Interrupts vom Shell (Variable prüfen)

Der sfind(1) Sourcecode libfind #include <stdio.h> main(int argc, char **av) { FILE *std[3]; } std[0] = stdin; std[1] = stdout; std[2] = stderr; return (bfind(argc, argv, std));