GNU Bourne-Again SHell
                    Eine Einf¨hrung
                             u


       Michele Corazza, Fabian...
Die GNU-POSIX-Shell BASH




     Kommandozeileninterpreter
     eine von vielen Shells
     nur ein Programm..




      ...
Funktionen der Bash



      ausf¨hren von Programmen
          u
          einzeln
          mehrere gleichzeitig
       ...
Interne Bash Kommandos



  intern
   cd“ wechselt das Verzeichniss
  ”
  extern
   pwd“ zeigt den aktuellen Verzeichnissp...
Exit Codes




  Konventionen
      0 = Alles OK
      >0 = Fehler

  Ausgabe des letzten Exit Codes
  echo $?




       ...
Weitere Shell Funktionen - Shellprogrammierung



      Shebang #!/bin/sh
      if, while, for, case

  Warum Shell Script...
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...
Ein / Ausgabe Umleitung in der Shell




      Standard Ausgabe Umlenken >
      Standard Eingabe Umlenken <
      Standar...
Ein / Ausgabe Umleitung in C++



      Ein / Ausgabe Streams sind Filedeskriptoren (0,1,2)
           Unix/Linux alles is...
Pipeline
  Unnamed Pipes
      Standard Pipes in C/C++
      haben keinen Filedeskriptor
      kommen zum Einsatz wenn ein...
Systemcall fork()




  Eigenschaften von fork()
      Erstellt eine Kopie des Prozesses




              Michele Corazza...
Systemcall fork()




  Eigenschaften von fork()
      Erstellt eine Kopie des Prozesses
      Aufrufender Prozess wird pa...
Systemcall fork()




  Eigenschaften von fork()
      Erstellt eine Kopie des Prozesses
      Aufrufender Prozess wird pa...
Systemcall fork()




  Eigenschaften von fork()
      Erstellt eine Kopie des Prozesses
      Aufrufender Prozess wird pa...
Fehlschlagen von fork()




  fork() kann fehlschlagen, wenn..
      nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (E...
Fehlschlagen von fork()




  fork() kann fehlschlagen, wenn..
      nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (E...
Fehlschlagen von fork()




  fork() kann fehlschlagen, wenn..
      nicht gen¨gend freier Arbeitspeicher verf¨gbar ist (E...
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...
Ausgabe




  Ausgabe
  Elternproz.: Kind-PID=18426
  Kind: PID=18426
  Kind: Eltern-PID=18425




             Michele Co...
Kopiervorgang




  Was passiert beim Kopieren?




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch




              Michele Corazza, Fab...
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch
      Gleicher Programmz¨hler
        ...
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch
      Gleicher Programmz¨hler
        ...
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch
      Gleicher Programmz¨hler
        ...
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
      ...
Ausf¨hren eines neuen Programms
    u




  exec()
      Mit den exec-Funktionen wird ein neues Programm ausgef¨hrt
      ...
Ausf¨hren eines neuen Programms
    u




  exec()
      Mit den exec-Funktionen wird ein neues Programm ausgef¨hrt
      ...
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




  ...
execl()




  Ausf¨hrung von execl()
      u
      int execl(const char *path, const char *arg, . . .); // unistd.h
      ...
execl()




  Ausf¨hrung von execl()
      u
      int execl(const char *path, const char *arg, . . .); // unistd.h
      ...
execl()




  Ausf¨hrung von execl()
      u
      int execl(const char *path, const char *arg, . . .); // unistd.h
      ...
execlp()




  execlp()




             Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
execlp()




  execlp()
      Bei execl() muss immer der gesammte Pfad angegeben
      werden.




             Michele Co...
execlp()




  execlp()
      Bei execl() muss immer der gesammte Pfad angegeben
      werden.
      int execlp(const char...
execlp()




  execlp()
      Bei execl() muss immer der gesammte Pfad angegeben
      werden.
      int execlp(const char...
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...
Warten auf den Kindprozess




  Die Funktion waitpid()
      pid t waitpid(pid t pid, int status, int options);
      War...
Abfragen des Terminierungsstatus




  Makros f¨r waitpid()
          u
      waitpid(kind pid, &kind status, 0);
      WI...
Zombies!




  Was sind Zombies?
      Prozess hat Ausf¨hrung beendet
                      u
      Eintrag in der Prozess...
Zombies!




  Was sind Zombies?
      Prozess hat Ausf¨hrung beendet
                      u
      Eintrag in der Prozess...
Nächste SlideShare
Wird geladen in …5
×

GNU Bourne Again SHell

1.030 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.030
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
2
Aktionen
Geteilt
0
Downloads
9
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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

×