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