进程和程序
编写完毕的代码,在没有运⾏的时候,称之为程序
正在运⾏着的代码,就成为进程
进程,除了包含代码以外,还有需要运⾏的环境等,所以和程序是有区别的
1 import os
2 import time
3
4 ret = os.fork() #注意,fork函数,只在Unix/Linux/Mac上运⾏,windows不可以
5 if ret == 0:
6 while True:
7 print("---1---")
8 time.sleep(1)
9
10 else:
11 while True:
12 print("---2---")
13 time.sleep(1)
程序执⾏到os.fork()时,操作系统会创建⼀个新的进程(⼦进程),然后复制⽗进程的所有信息到⼦进程中 然后⽗进程和⼦进程都会从fork()函数中得到⼀个返回值,在⼦进程中这 个值⼀定是0,⽽⽗进程中是⼦进程的 id号在Unix/Linux操作系统中,提供了⼀个fork()系统函数,它⾮常特殊。
普通的函数调⽤,调⽤⼀次,返回⼀次,但是fork()调⽤⼀次,返回两次,因 为操作系统⾃动把当前进程(称为⽗进程)复制了⼀份(称为⼦进程),然 后,分别在⽗进程和⼦进程内返回。
⼦进程永远返回0,⽽⽗进程返回⼦进程的ID。
这样做的理由是,⼀个⽗进程可以fork出很多⼦进程,所以,⽗进程要记下 每个⼦进程的ID,⽽⼦进程只需要调⽤getppid()就可以拿到⽗进程的ID。
大于0父进程执行 等于0子进程执行。
可能会同样的代码运行的结果不一样,不一定那个会先执行这个跟当前的cpu占用 内存的占用等等都有关所以调度算法不一样,所以结果就不一样。
getpid,getppid
17 import os
18 rpid = os.fork()
19 if rpid<0:
20 print("fork调用失败")
21
22 elif rpid == 0:
23 print("我是⼦进程(%s),我的⽗进程是(%s)"%(os.getpid(),os.getppid()))
24
25 else:
26 print("我是父进程(%s),我是子进程(%s)"%(os.getpid(),rpid))
27
执行结果:
fork的返回值就是子进程的id。
全局变量在多个进程中不能共享
执行结果:
多次fork问题
执行结果:
原理:
fork炸弹:
import os
while True:
os.fork()