SlideShare ist ein Scribd-Unternehmen logo
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
Die GNU-POSIX-Shell BASH




     Kommandozeileninterpreter
     eine von vielen Shells
     nur ein Programm..




             Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
Exit Codes




  Konventionen
      0 = Alles OK
      >0 = Fehler

  Ausgabe des letzten Exit Codes
  echo $?




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
                                    u
      Eingabe des Programmes per Datei (automatische
      Verarbeitung)



              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
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
Systemcall fork()




  Eigenschaften von fork()
      Erstellt eine Kopie des Prozesses




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
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
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
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
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
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
Ausgabe




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




             Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
Kopiervorgang




  Was passiert beim Kopieren?




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
Kopiervorgang




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




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
Kopiervorgang




  Was passiert beim Kopieren?
      Variablenwerte sind identisch
      Gleicher Programmz¨hler
                        a
      Gleiche Dateideskriptoren (!)




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
                                                            u




             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
                                                            u
      Kein neuer Prozess! Das alte Programm wird im Speicher
      ersetzt.




             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
                                                            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
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




              Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
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
execlp()




  execlp()




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




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




             Michele Corazza, Fabian Becker   GNU Bourne-Again SHell
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
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
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
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
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
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
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

Weitere ähnliche Inhalte

Andere mochten auch

Advanced Scala
Advanced ScalaAdvanced Scala
Advanced Scala
Fabian Becker
 
Seminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-MechanismusSeminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-Mechanismus
Fabian Becker
 
Ruby
RubyRuby
Scala case of case classes
Scala   case of case classesScala   case of case classes
Scala case of case classes
VulcanMinds
 
Case class scala
Case class scalaCase class scala
Case class scala
Matt Hicks
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Stanford GSB Corporate Governance Research Initiative
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
Luminary Labs
 

Andere mochten auch (7)

Advanced Scala
Advanced ScalaAdvanced Scala
Advanced Scala
 
Seminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-MechanismusSeminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-Mechanismus
 
Ruby
RubyRuby
Ruby
 
Scala case of case classes
Scala   case of case classesScala   case of case classes
Scala case of case classes
 
Case class scala
Case class scalaCase class scala
Case class scala
 
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job? Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 

GNU Bourne Again SHell

  • 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
  • 20. Ausgabe Ausgabe Elternproz.: Kind-PID=18426 Kind: PID=18426 Kind: Eltern-PID=18425 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