GNU Bourne Again SHell

  • View
    745

  • Download
    1

Embed Size (px)

DESCRIPTION

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

Text of GNU Bourne Again SHell

  • 1. GNU Bourne-Again SHell Eine EinfhrunguMichele Corazza, Fabian Becker FH Giessen-Friedberg 18. Oktober 2010 Michele Corazza, Fabian Becker GNU Bourne-Again SHell

2. Die GNU-POSIX-Shell BASHKommandozeileninterpretereine von vielen Shellsnur ein Programm..Michele Corazza, Fabian Becker GNU Bourne-Again SHell 3. Funktionen der Bashausfhren von Programmen u einzeln mehrere gleichzeitig mit Abhngigkeiten.. aOperatoren; sequenziell: ls ; pwd && ausfhren bei Erfolg: g++ pipe.cc -o pipe && ./pipe u ausfhren bei Misserfolg: test -d dir mkdir dir u Michele Corazza, Fabian Becker GNU Bourne-Again SHell 4. Interne Bash Kommandosinterncd wechselt das Verzeichniss externpwd zeigt den aktuellen Verzeichnisspfad Testwhereis whereis cd =>cd: whereis pwd =>pwd: /bin/pwd Michele Corazza, Fabian Becker GNU Bourne-Again SHell 5. Exit Codes Konventionen 0 = Alles OK >0 = FehlerAusgabe des letzten Exit Codes echo $? Michele Corazza, Fabian Becker GNU Bourne-Again SHell 6. Weitere Shell Funktionen - ShellprogrammierungShebang #!/bin/sh if, while, for, caseWarum Shell Scripting? Automatisierte Verarbeitung von Daten (Batch) FilternWeitere Shell Kommandos $1 $2 $3 Erster Zweiter Dritter Ubergabeparameter $# Anzahl der Ubergabeparameter Michele Corazza, Fabian Becker GNU Bourne-Again SHell 7. Ein / Ausgabe StrmeoMichele Corazza, Fabian Becker GNU Bourne-Again SHell 8. Ein / Ausgabe Umlenkung Warum? Fehlerausgabe in externe Datei lenken Ausgabe des Programmes unterdrcken u Eingabe des Programmes per Datei (automatische Verarbeitung)Michele Corazza, Fabian Becker GNU Bourne-Again SHell 9. Ein / Ausgabe Umleitung in der Shell Standard Ausgabe Umlenken > Standard Eingabe Umlenken < Standard Fehler Umlenken 2>Datei erstellen / anfgenu Beispiel: ls /home > dateixy an Datei anfgen: ls /home >> dateixy uMichele Corazza, Fabian Becker GNU Bourne-Again SHell 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/dup2dup2 Syntax int dup2(int oldfd, int newfd) Rckgabewert: der neue Filedeskriptoru Michele Corazza, Fabian Becker GNU Bourne-Again SHell 11. Pipeline Unnamed Pipes Standard Pipes in C/C++ haben keinen Filedeskriptor kommen zum Einsatz wenn ein Kindprozess in die Pipe schreiben sollNamed Pipeshaben einen globalen Verzeichnis Eintrag werden immer dann gebraucht wenn die Prozesse unabhngiga 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. Systemcall fork() Eigenschaften von fork() Erstellt eine Kopie des Prozesses Michele Corazza, Fabian Becker GNU Bourne-Again SHell 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. 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 zurcku Michele Corazza, Fabian Becker GNU Bourne-Again SHell 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 zurckuKann fork() fehlschlagen? Wenn ja, wann? Michele Corazza, Fabian Becker GNU Bourne-Again SHell 16. Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gengend freier Arbeitspeicher verfgbar ist (EAGAIN)u uMichele Corazza, Fabian Becker GNU Bourne-Again SHell 17. Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gengend freier Arbeitspeicher verfgbar ist (EAGAIN)u u das Prozesslimit des Benutzers erreicht wurde (EAGAIN)Michele Corazza, Fabian Becker GNU Bourne-Again SHell 18. Fehlschlagen von fork() fork() kann fehlschlagen, wenn.. nicht gengend freier Arbeitspeicher verfgbar ist (EAGAIN)u u das Prozesslimit des Benutzers erreicht wurde (EAGAIN) die ntigen Kernelstrukturen nicht allokiert werden konnteno (ENOMEM)In diesen Fllen liefert fork() -1 im parent zurck und es wird keinau Kindprozess erstellt. errno wird entsprechend gesetzt.Michele Corazza, Fabian Becker GNU Bourne-Again SHell 19. BeispielListing 1: Einfaches fork() Beispiel1 #i n c l u d e 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 56 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 ( ) ) {9c 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); 11case 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 . : KindPID=%dn , f o r k p i d ) ; 15 } 16 17 exit (0); 18 } Michele Corazza, Fabian Becker GNU Bourne-Again SHell 20. Ausgabe Ausgabe Elternproz.: Kind-PID=18426 Kind: PID=18426 Kind: Eltern-PID=18425Michele Corazza, Fabian Becker GNU Bourne-Again SHell 21. Kopiervorgang Was passiert beim Kopieren? Michele Corazza, Fabian Becker GNU Bourne-Again SHell 22. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Michele Corazza, Fabian Becker GNU Bourne-Again SHell 23. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmzhler a Michele Corazza, Fabian Becker GNU Bourne-Again SHell 24. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmzhler a Gleiche Dateideskriptoren (!) Michele Corazza, Fabian Becker GNU Bourne-Again SHell 25. Kopiervorgang Was passiert beim Kopieren? Variablenwerte sind identisch Gleicher Programmzhler a Gleiche Dateideskriptoren (!) Gleiche Zugrisrechte / Eigentmer u Michele Corazza, Fabian Becker GNU Bourne-Again SHell 26. Ausfhren eines neuen Programms u exec()Michele Corazza, Fabian Becker GNU Bourne-Again SHell 27. Ausfhren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgefhrt uMichele Corazza, Fabian Becker GNU Bourne-Again SHell 28. Ausfhren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgefhrt u Kein neuer Prozess! Das alte Programm wird im Speicher ersetzt.Michele Corazza, Fabian Becker GNU Bourne-Again SHell 29. Ausfhren eines neuen Programms u exec() Mit den exec-Funktionen wird ein neues Programm ausgefhrt u Kein neuer Prozess! Das alte Programm wird im Speicher ersetzt. Keine Rckkehr zum aufrufenden Programm.uMichele Corazza, Fabian Becker GNU Bourne-Again SHell 30. execl() Ausfhrung von execl() u Michele Corazza, Fabian Becker GNU Bourne-Again SHell 31. execl() Ausfhrung von execl() u int execl(const char *path, const char *arg, . . .); // unistd.h Michele Corazza, Fabian Becker GNU Bourne-Again SHell 32. execl() Ausfhrung 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. execl() Ausfhrung 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. execl() Ausfhrung 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. execlp() execlp()Michele Corazza, Fabian Becker GNU Bourne-Again SHell 36. execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden.Michele Corazza, Fabian Becker GNU Bourne-Again SHell 37. execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. int execlp(const char *le, const char *arg, . . .); Michele Corazza, Fabian Becker GNU Bourne-Again SHell 38. execlp() execlp() Bei execl() muss immer der gesammte Pfad angegeben werden. int execlp(const char *le, const char *arg, . . .); Sucht zustzlich noch im PATH.a Michele Corazza, Fabian Becker GNU Bourne-Again SHell 39. exec*() Listing 2: exec-Funktionen1 #i n c l u d e 23 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. Warten auf den Kindprozess Die Funktion waitpid() pid t waitpid(pid t pid, int status, int options); Warten auf Subprozessterminierung Durch Optionen lsst 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. Abfragen des Terminierungsstatus Makros fr 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. Zombies! Was sind Zombies? Prozess hat Ausfhrung beendet u Eintrag in der Prozesstabelle ist noch vorhan