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. Die GNU-POSIX-Shell BASH
Kommandozeileninterpreter
eine von vielen Shells
nur ein Programm..
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. Exit Codes
Konventionen
0 = Alles OK
>0 = Fehler
Ausgabe des letzten Exit Codes
echo $?
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. Ein / Ausgabe Str¨me
o
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. 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. 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. 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 zur¨ck
u
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 zur¨ck
u
Kann fork() fehlschlagen? Wenn ja, wann?
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. 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. 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
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 Programmz¨hler
a
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
24. Kopiervorgang
Was passiert beim Kopieren?
Variablenwerte sind identisch
Gleicher Programmz¨hler
a
Gleiche Dateideskriptoren (!)
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. Ausf¨hren eines neuen Programms
u
exec()
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. 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. execl()
Ausf¨hrung von execl()
u
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. 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. 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. 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 *file, 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 *file, const char *arg, . . .);
Sucht zus¨tzlich noch im PATH.
a
Michele Corazza, Fabian Becker GNU Bourne-Again SHell
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. 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. 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. 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. 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