进程和线程
进程是资源分配的基本单位,例如内存资源等,进程之间资源是相互隔离的;线程是操作系统调度的最小单位。一个进程可以包括多个线程。
fork函数
Unix/linux系统提供了一个fork函数,这个还是比较特殊,执行一次,返回两次;此时通过系统调用创建一个与原来进程(父进程)基本相同的进程(子进程),然后分别在父子进程中返回。子进程返回值永远是0,父进程的返回值是子进程id。这样做的原因是一个父进程可以fork出若干个子进程,所以,父进程需要记住所有的子进程的id,而子进程只需要通过getppid()这个函数,就可以拿到父进程id。
fork函数返回值
fork函数可能有三种返回值:
1)父进程中返回值是子进程的ID
2)子进程返回值为0
3)如果出现错误,fork函数返回负值
fork函数出现错误的情况:
1)当前进程数已达到系统上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM
python中的fork函数
python的os模块封装了很多系统调用函数,其中就有fork函数,这样就可在python程序中轻松的创建子线程
# -*- coding:utf-8 -*-
import os
print "test Process (%s) starting..." % os.getpid()
pid = os.fork()
if pid == 0:
print "I am child process(%s) and my parent is (%s)" % (os.getpid(), os.getppid())
else:
print "I (%s) just created a child process(%s)" % (os.getpid(), pid)
输出结果为:
从图中的结果可以验证上述结论。
fork函数的应用
windows系统中是没有fork调用的,所以上述代码无法再windows中运行。
有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求