Develop a record and replay system on rasbian

fork():

既然子进程是父进程创建的,那么父进程退出之后,子进程会怎么样呢?此时,子进程会被PID为1的进程接管,就是init进程了。这样子进程就不会受终端退出影响了,使用这个特性就可以创建在后台执行的程序,俗称守护进程(daemon)。








 

python中使用fork创建新的进程

Python 9年前 (2012-11-04) 21432浏览 1评论

python中如果要创建新进程的话,可以使用os模块中的fork方法。为了了解其中工作原理,笔者结合linux的查看进程ps命令,对这个方法做了一些测试。

python运行时进程

python一开始运行的时候,系统会生成一个新的进程。先看下面代码:

#!/usr/bin/env python
#coding=utf8
 
from time import sleep
 
sleep(30)
1
2
3
4
5
6
#!/usr/bin/env python
#coding=utf8
 
from time import sleep
 
sleep(30)

因为代码执行完后,进程就会被销毁,所以这里睡眠30秒,方便看到效果。在linux下执行这个代码:

python hello.py &

加上&符号,可以让程序在后台运行,不会占用终端。输入ps -l命令查看进程,在电脑上输出如下:

python运行时进程

python运行时进程

其中第二条记录就是刚才运行的python了。

使用fork来创建一个新进程

使用fork创建一个新进程成功后,新进程会是原进程的子进程,原进程称为父进程。如果发生错误,则会抛出OSError异常。

#!/usr/bin/env python
#coding=utf8
 
from time import sleep
import os
 
try:
    pid = os.fork()
except OSError, e:
    pass
 
sleep(30)
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
#coding=utf8
 
from time import sleep
import os
 
try:
    pid = os.fork()
except OSError, e:
    pass
 
sleep(30)

运行代码,查看进程,在电脑上输出如下:

python中fork进程

python中fork进程

可以看出第二条python进程就是第一条的子进程。

fork进程后的程序流程

使用fork创建子进程后,子进程会复制父进程的数据信息,而后程序就分两个进程继续运行后面的程序,这也是fork(分叉)名字的含义了。在子进程内,这个方法会返回0;在父进程内,这个方法会返回子进程的编号PID。可以使用PID来区分两个进程:

#!/usr/bin/env python
#coding=utf8
 
import os
 
#创建子进程之前声明的变量
source = 10
 
try:
    pid = os.fork()
 
    if pid == 0: #子进程
        print "this is child process."
        #在子进程中source自减1
        source = source - 1
        sleep(3)
    else: #父进程
        print "this is parent process."
 
    print source
except OSError, e:
    pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
#coding=utf8
 
import os
 
#创建子进程之前声明的变量
source = 10
 
try:
    pid = os.fork()
 
    if pid == 0: #子进程
        print "this is child process."
        #在子进程中source自减1
        source = source - 1
        sleep(3)
    else: #父进程
        print "this is parent process."
 
    print source
except OSError, e:
    pass

上面代码中,在子进程创建前,声明了一个变量source,然后在子进程中自减1,最后打印出source的值,显然父进程打印出来的值应该为10,子进程打印出来的值应该为9。为了明显区分父进程和子进程,让子进程睡3秒,就看的比较明显了。

既然子进程是父进程创建的,那么父进程退出之后,子进程会怎么样呢?此时,子进程会被PID为1的进程接管,就是init进程了。这样子进程就不会受终端退出影响了,使用这个特性就可以创建在后台执行的程序,俗称守护进程(daemon)。

转载请注明:快乐编程 » python中使用fork创建新的进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值