• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
GNU Bourne Again SHell
 

GNU Bourne Again SHell

on

  • 728 views

Presentation slides from a lecture on "Operating Systems" (Betriebssysteme) at FH Giessen-Friedberg (Germany).

Presentation slides from a lecture on "Operating Systems" (Betriebssysteme) at FH Giessen-Friedberg (Germany).

Statistics

Views

Total Views
728
Views on SlideShare
728
Embed Views
0

Actions

Likes
0
Downloads
8
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    GNU Bourne Again SHell GNU Bourne Again SHell Presentation Transcript

    • GNU Bourne-Again SHell Eine Einf¨hrung u Michele Corazza, Fabian Becker FH Giessen-Friedberg 18. Oktober 2010 Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Die GNU-POSIX-Shell BASH Kommandozeileninterpreter eine von vielen Shells nur ein Programm.. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Funktionen der Bash ausf¨hren von Programmen u einzeln mehrere gleichzeitig mit Abh¨ngigkeiten.. a Operatoren ;“ sequenziell: ls ; pwd ” &&“ ausf¨hren bei Erfolg: g++ pipe.cc -o pipe && ./pipe u ” “ ausf¨hren bei Misserfolg: test -d dir mkdir dir u ” Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Interne Bash Kommandos intern cd“ wechselt das Verzeichniss ” extern pwd“ zeigt den aktuellen Verzeichnisspfad ” Test whereis <Programm>“ ” whereis cd =>cd: whereis pwd =>pwd: /bin/pwd Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Exit Codes Konventionen 0 = Alles OK >0 = Fehler Ausgabe des letzten Exit Codes echo $? Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Weitere Shell Funktionen - Shellprogrammierung Shebang #!/bin/sh if, while, for, case Warum Shell Scripting? Automatisierte Verarbeitung von Daten (Batch) Filtern Weitere Shell Kommandos ¨ $1 $2 $3 Erster Zweiter Dritter Ubergabeparameter ¨ $# Anzahl der Ubergabeparameter Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ein / Ausgabe Str¨me o Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ein / Ausgabe Umlenkung Warum? Fehlerausgabe in externe Datei lenken Ausgabe des Programmes unterdr¨cken u Eingabe des Programmes per Datei (automatische Verarbeitung) Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ein / Ausgabe Umleitung in der Shell Standard Ausgabe Umlenken > Standard Eingabe Umlenken < Standard Fehler Umlenken 2> Datei erstellen / anf¨gen u Beispiel: ls /home > dateixy an Datei anf¨gen: ls /home >> dateixy u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ein / Ausgabe Umleitung in C++ Ein / Ausgabe Streams sind Filedeskriptoren (0,1,2) Unix/Linux alles ist eine Datei werden als normale ints behandelt Umlenkung per dup/dup2 dup2 Syntax int dup2(int oldfd, int newfd) R¨ckgabewert: der neue Filedeskriptor u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Pipeline Unnamed Pipes Standard Pipes in C/C++ haben keinen Filedeskriptor kommen zum Einsatz wenn ein Kindprozess in die Pipe schreiben soll Named Pipes haben einen globalen Verzeichnis Eintrag werden immer dann gebraucht wenn die Prozesse unabh¨ngig a voneinader sind (kein Fork()) pipe C-Call int fd[2]; pipe(fd); fd[0] lesen, fd[1] schreiben Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Aufrufender Prozess wird parent“ genannt, die Kopie child“ ” ” Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Aufrufender Prozess wird parent“ genannt, die Kopie child“ ” ” fork() liefert im parent die PID des Kindprozesses, im Kindprozess 0 zur¨ck u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Aufrufender Prozess wird parent“ genannt, die Kopie child“ ” ” fork() liefert im parent die PID des Kindprozesses, im Kindprozess 0 zur¨ck u Kann fork() fehlschlagen? Wenn ja, wann? Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (EAGAIN) u u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (EAGAIN) u u das Prozesslimit des Benutzers erreicht wurde (EAGAIN) Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (EAGAIN) u u das Prozesslimit des Benutzers erreicht wurde (EAGAIN) die n¨tigen Kernelstrukturen nicht allokiert werden konnten o (ENOMEM) In diesen F¨llen liefert fork() -1 im parent zur¨ck und es wird kein a u Kindprozess erstellt. errno“ wird entsprechend gesetzt. ” Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Beispiel Listing 1: Einfaches fork() Beispiel 1 #i n c l u d e <u n i s t d . h> 2 #i n c l u d e < s t d l i b . h> 3 #i n c l u d e < s t d i o . h> 4 #i n c l u d e <s y s / t y p e s . h> 5 6 i n t main ( v o i d ) { 7 pid t fork pid ; 8 s w i t c h ( f o r k p i d=f o r k ( ) ) { 9 c a s e −1: p r i n t f ( ” F e h l e r b e i f o r k ! n” ) ; 10 exit (1); 11 case 0 : p r i n t f ( ” Kind : PID=%dn” , g e t p i d ( ) ) ; 12 p r i n t f ( ” Kind : E l t e r n −PID=%dn” , g e t p p i d ( ) ) ; 13 break ; 14 d e f a u l t : p r i n t f ( ” E l t e r n p r o z . : Kind−PID=%dn” , f o r k p i d ) ; 15 } 16 17 exit (0); 18 } Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ausgabe Ausgabe Elternproz.: Kind-PID=18426 Kind: PID=18426 Kind: Eltern-PID=18425 Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Kopiervorgang Was passiert beim Kopieren? Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmz¨hler a Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmz¨hler a Gleiche Dateideskriptoren (!) Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmz¨hler a Gleiche Dateideskriptoren (!) Gleiche Zugriffsrechte / Eigent¨mer u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ausf¨hren eines neuen Programms u exec() Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ausf¨hren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgef¨hrt u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ausf¨hren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgef¨hrt u Kein neuer Prozess! Das alte Programm wird im Speicher ersetzt. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Ausf¨hren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgef¨hrt u Kein neuer Prozess! Das alte Programm wird im Speicher ersetzt. Keine R¨ckkehr zum aufrufenden Programm. u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execl() Ausf¨hrung von execl() u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execl() Ausf¨hrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execl() Ausf¨hrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Aufruf: execl( ls“, ls“, -al“, /home“, (char *)NULL); ” ” ” ” Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execl() Ausf¨hrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Aufruf: execl( ls“, ls“, -al“, /home“, (char *)NULL); ” ” ” ” Variable Anzahl an Parametern! Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execl() Ausf¨hrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Aufruf: execl( ls“, ls“, -al“, /home“, (char *)NULL); ” ” ” ” Variable Anzahl an Parametern! Aufruf scheitert vermutlich, da execl nur im lokalen Verzeichnis nach ls sucht. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execlp() execlp() Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. int execlp(const char *file, const char *arg, . . .); Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. int execlp(const char *file, const char *arg, . . .); Sucht zus¨tzlich noch im PATH. a Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • exec*() Listing 2: exec-Funktionen 1 #i n c l u d e <u n i s t d . h> 2 3 e x t e r n c h a r ∗∗ e n v i r o n ; 4 i n t e x e c l ( c o n s t c h a r ∗ path , c o n s t c h a r ∗ arg0 , . . . /∗ , 5 ( c h a r ∗ ) 0 ∗/ ) ; 6 i n t e x e c v ( c o n s t c h a r ∗ path , c h a r ∗ c o n s t a r g v [ ] ) ; 7 i n t e x e c l e ( c o n s t c h a r ∗ path , c o n s t c h a r ∗ arg0 , . . . /∗ , 8 ( c h a r ∗ ) 0 , c h a r ∗ c o n s t envp [ ] ∗/ ) ; 9 i n t e x e c v e ( c o n s t c h a r ∗ path , c h a r ∗ c o n s t a r g v [ ] , 10 c h a r ∗ c o n s t envp [ ] ) ; 11 i n t e x e c l p ( c o n s t c h a r ∗ f i l e , c o n s t c h a r ∗ arg0 , . . . /∗ , 12 ( c h a r ∗ ) 0 ∗/ ) ; 13 i n t e x e c v p ( c o n s t c h a r ∗ f i l e , c h a r ∗ c o n s t a r g v [ ] ) ; Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Warten auf den Kindprozess Die Funktion waitpid() pid t waitpid(pid t pid, int status, int options); Warten auf Subprozessterminierung Durch Optionen l¨sst sich abfragen ob ein Subprozess a terminiert ist ohne dabei zu blockieren. Durch Makros aus wait.h lassen sich Terminierungsstatus abfragen. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Abfragen des Terminierungsstatus Makros f¨r waitpid() u waitpid(kind pid, &kind status, 0); WIFEXITED(kind status) ⇒ Normal Terminiert? WIFSIGNALED(kind status) ⇒ Terminiert durch Signal? WTERMSIG(kind status) ⇒ Welches Signal? (numerisch) Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Zombies! Was sind Zombies? Prozess hat Ausf¨hrung beendet u Eintrag in der Prozesstabelle ist noch vorhanden! Michele Corazza, Fabian Becker GNU Bourne-Again SHell
    • Zombies! Was sind Zombies? Prozess hat Ausf¨hrung beendet u Eintrag in der Prozesstabelle ist noch vorhanden! Wie wird man Zombies los? Abfrage des Terminierungsstatus durch wait/waitpid Kann mit Signals (SIGCHLD) vereinfacht werden. Michele Corazza, Fabian Becker GNU Bourne-Again SHell