fork()
Unix/Linux操作系统提供了一个fork()
系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()
调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
子进程永远返回0
,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()
就可以拿到父进程的ID。
fork()语法:
功能:为当前进程创建一个子进程
参数:无
返回值:0 和 子进程PID(在父进程中返回)
< 0 子进程创建失败
= 0 在子进程中的返回值
> 0 在父进程中的返回值
特点:
(1)子进程会继承父进程几乎全部代码段(包括fork()前所定义的所有内容)
(2)子进程拥有自己独立的信息标识,如PID
(3)父、子进程独立存在,在各自存储空间上运行,互不影响
(4)创建父子进程执行不同的内容是多任务中固定方法
例子:
import os
from time import sleep
pid = os.fork()
# os.fork()为当前进程创建出一个子进程,返回两个值,一个是0,另外一个是子进程的pid,0在子进程中返回,子进程的pid在父进程返回。
x1, x2 = 3, 7
if pid < 0 :
print("create process failed")
elif pid == 0:
print("this is child process, the pid is %s" % os.getpid())
print('x1 + x2 =', x1+x2)
else :
sleep(1)
print("this is parent process, the pid is %s" % os.getpid())
print('x1 * x2 =', x1*x2)
print("******the end*******")
执行结果:
[root@syztoo ~]# python3 forks.py
this is child process, the pid is 7815
x1 + x2 = 10
******the end*******
this is parent process, the pid is 7814
x1 * x2 = 21
******the end*******