GNU Bourne Again SHell

881
-1

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
881
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×