Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GNU Bourne Again SHell

1,208 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

GNU Bourne Again SHell

  1. 1. 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
  2. 2. Die GNU-POSIX-Shell BASH Kommandozeileninterpreter eine von vielen Shells nur ein Programm.. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  3. 3. 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
  4. 4. 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
  5. 5. Exit Codes Konventionen 0 = Alles OK >0 = Fehler Ausgabe des letzten Exit Codes echo $? Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  6. 6. 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
  7. 7. Ein / Ausgabe Str¨me o Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. Ausgabe Ausgabe Elternproz.: Kind-PID=18426 Kind: PID=18426 Kind: Eltern-PID=18425 Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  21. 21. Kopiervorgang Was passiert beim Kopieren? Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  22. 22. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  23. 23. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmz¨hler a Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  24. 24. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmz¨hler a Gleiche Dateideskriptoren (!) Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  25. 25. 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
  26. 26. Ausf¨hren eines neuen Programms u exec() Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  27. 27. 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
  28. 28. 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
  29. 29. 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
  30. 30. execl() Ausf¨hrung von execl() u Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  31. 31. execl() Ausf¨hrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. execlp() execlp() Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  36. 36. execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. Michele Corazza, Fabian Becker GNU Bourne-Again SHell
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. 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
  41. 41. 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
  42. 42. 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
  43. 43. 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

×