fork() a jeho priatelia

Link na stiahnutie je vždy pod kódom.

Program sa spúšťa

python program.py

prípadne

python program.py parametre

druhá možnosť je

chmod a+x program.py
./program.py parametre

fork.py

Parent po skončení child procesu preberie jeho návratovú hodnotu pomocou wait.

   1 #!/usr/bin/python
   2 # -*- coding: utf-8 -*-
   3 
   4 # Nacitaju sa moduly
   5 import os
   6 import time
   7 import sys
   8 
   9 # Zavolame fork
  10 pid_chld=os.fork()
  11 # child dostane vratene 0, parent dostane PID child procesu
  12 if pid_chld==0:
  13         string="child"
  14 elif pid_chld<0:
  15         print "fork vratil chybu"
  16 else:
  17         print "PID child = %d" % pid_chld
  18         string="parent"
  19 
  20 # Oba procesy bezia sucasne
  21 for i in range(20):
  22         print string
  23         time.sleep(0.1)
  24 
  25 if pid_chld==0:
  26 # child vrati cislo 101
  27         print "child konci"
  28         sys.exit(101)
  29 else:
  30 # parent si preberie navratovu hodnotu od jadra
  31         ret_wait=os.wait()
  32 # os.wait vracia v Pythone dvojicu hodnot
  33         pid_chld_wait=ret_wait[0] # pid child procesu
  34         ret_chld=ret_wait[1] >> 8 # a nahratovu hodnotu (shiftnutu)
  35         print "child %d vratil %d" % (pid_chld_wait,ret_chld)
fork.py

fork_exec.py

Tento očakáva ako parameter meno_adresara pre /bin/ls. Skúste dať nejeký neexistujúci adresár, pozorujte návratovú hodnotu.

   1 #!/usr/bin/python
   2 # -*- coding: utf-8 -*-
   3 
   4 # Nacitaju sa moduly
   5 import os
   6 import time
   7 import sys
   8 
   9 if len(sys.argv)<=1:
  10         print "Spust ma s parametrom meno_adresara"
  11         sys.exit(1)
  12 
  13 # Zavolame fork
  14 pid_chld=os.fork()
  15 # child dostane vratene 0, parent dostane PID child procesu
  16 if pid_chld==0:
  17         # Spusti sa ls pre prvy argument
  18         # Prve /bin/ls je co sa ma spustit
  19         # Druhe /bin/ls je argv[0] pre ls - tradicne to je meno programu
  20         time.sleep(0.5)
  21         os.execlp("/bin/ls","/bin/ls",sys.argv[1])
  22         print "Sem sa nikdy tok riadenia nedostane"
  23 elif pid_chld<0:
  24         print "fork vratil chybu"
  25         sys.exit(1)
  26 else:
  27         print "PID child = %d" % pid_chld
  28 
  29 # Oba procesy bezia sucasne, sem sa ale teraz dostane iba parent
  30 for i in range(20):
  31         print "parent"
  32         time.sleep(0.1)
  33 
  34 # parent si preberie navratovu hodnotu od jadra
  35 ret_wait=os.wait()
  36 # os.wait vracia v Pythone dvojicu hodnot
  37 pid_chld_wait=ret_wait[0] # pid child procesu
  38 ret_chld=ret_wait[1] >> 8 # a nahratovu hodnotu (shiftnutu)
  39 print "child %d vratil %d" % (pid_chld_wait,ret_chld)
fork_exec.py

fork_exec_sigchld.py

Jadro po skončení child procesu upozorní parenta, že si má prevziať jeho hodnotu cez wait. Parent dostane signál SIGCHLD.

   1 #!/usr/bin/python
   2 # -*- coding: utf-8 -*-
   3 
   4 # Nacitaju sa moduly
   5 import os
   6 import time
   7 import sys
   8 import signal
   9 
  10 # Funkcia zabezpecujuca obsluhu signalu SIGCHLD
  11 # frame je interna pythonovska zalezitost, ignorujme
  12 def handler(signum,frame):
  13         print "Zavolal sa handler, signal = %d" % (signum)
  14         # parent si preberie navratovu hodnotu od jadra
  15         ret_wait=os.wait()
  16         # os.wait vracia v Pythone dvojicu hodnot
  17         pid_chld_wait=ret_wait[0] # pid child procesu
  18         ret_chld=ret_wait[1] >> 8 # a nahratovu hodnotu (shiftnutu)
  19         print "child %d vratil %d" % (pid_chld_wait,ret_chld)
  20 
  21 
  22 if len(sys.argv)<=1:
  23         print "Spust ma s parametrom meno_adresara"
  24         sys.exit(1)
  25 
  26 # Nastavime si osetrovanie signalu o tom, ze ls skoncil
  27 signal.signal(signal.SIGCHLD, handler)
  28 
  29 # Zavolame fork
  30 pid_chld=os.fork()
  31 # child dostane vratene 0, parent dostane PID child procesu
  32 if pid_chld==0:
  33         # Spusti sa ls pre prvy argument
  34         # Prve /bin/ls je co sa ma spustit
  35         # Druhe /bin/ls je argv[0] pre ls - tradicne to je meno programu
  36         time.sleep(1)
  37         print "Este zijem"
  38         os.execlp("/bin/ls","/bin/ls",sys.argv[1])
  39         print "Sem sa nikdy tok riadenia nedostane"
  40 elif pid_chld<0:
  41         print "fork vratil chybu"
  42         sys.exit(1)
  43 else:
  44         print "PID child = %d" % pid_chld
  45         string="parent"
  46 
  47 # Oba procesy bezia sucasne, sem sa ale teraz dostane iba parent
  48 for i in range(20):
  49         print string
  50         time.sleep(0.1)
fork_exec_sigchld.py

PocitacoveSiete/Fork (last edited 2008-10-02 18:56:58 by GejzaJenca)