os模块的简介参看 Python::OS 模块 -- 简介html
os模块的文件相关操做参看 Python::OS 模块 -- 文件和目录操做python
os模块的进程参数 Python::OS 模块 -- 进程参数shell
这里咱们介绍os模块中的进程管理相关的操做。编程
os模块提供给了咱们访问操做系统功能的接口,咱们能够经过os模块提供给咱们的进程管理接口,编写多进程程序,这对编写高效、并发的程序提供了方便。数组
下面是一个最简单的父子进程交互的例子(仅限Unix系统下):并发
#! /usr/bin/python # -*- coding: utf-8 -*- import os import sys def child_process(): '''child process''' print 'child process is running' sys.exit(0) def parent_process(): '''parent process''' print 'parent process is running' print 'waiting for child process' exit_stat = os.wait() print "waited child process's PID = %d" % (exit_stat[0]) sys.exit(0) def main(): '''main function''' try: pid = os.fork() if pid > 0: '''parent process''' parent_process() else: child_process() except OSError, e: print os.strerror(e.errno) if __name__ == '__main__': main()
为了控制进程,咱们须要学习os提供给咱们的有关进程控制的接口,下面给出了os模块支持的进程操做(仅限Unix系统下):app
os模块提供了许多进程管理相关的操做,若是熟悉Unix下的系统编程的话,那么看到这些函数会以为很熟悉,由于这些函数都是对相应的C API的Python实现,让咱们看看都有些什么函数:函数
os.abort()post
向调用该函数的进程发送一个SIGABRT信号,在Unix系统上默认的行为是产生一个core文件。学习
注意:当调用os.abort()函数的时候不会调用python的信号处理函数signal.signal()。
os.execl(path, arg0, arg1, ...)
os.execle(path, arg0, arg1, ..., env)
os.execlp(file, arg0, arg1, ...)
os.execlpe(file, arg0, arg1, ..., env)
os.execv(path, args)
os.execve(path, args, env)
os.execvp(file, args)
os.execvpe(file, args, env)
这些函数都执行一个新的程序,而后用新的程序替换当前子进程的进程空间,而该子进程重新程序的main函数开始执行。在Unix下,该新程序的进程id是原来被替换的子进程的进程id。在原来子进程中打开的全部描述符默认都是可用的,不会被关闭。
execv*系列的函数表示其接受的参数是以一个list或者是一个tuple表示的参数表
execl*系列的函数表示其接受的参数是一个个独立的参数传递进去的。
exec*p*系列函数表示在执行参数传递过去的命令时使用PATH环境变量来查找命令
exec*e系列函数表示在执行命令的时候读取该参数指定的环境变量做为默认的环境配置,最后的env参数必须是一个mapping对象,能够是一个dict类型的对象。
os._exit(n)
退出进程,而且返回退出状态n,在退出的时候不会执行清理工做,直接退出。
注意:正常的退出应该使用sys.exit(n),而_exit()函数通常只用在fork以后的子进程中调用以退出。
可用的退出状态(并不适用全部的Unix平台均可用):
os.EX_OK - 正常退出
os.EX_USAGE - 命令执行不正确,如命令参数错误
os.EX_DATAERR - 输入数据有误
os.EX_NOINPUT - 输入文件不存在或者不可读
os.EX_NOUSER - 指定的用户不存在
os.EX_NOHOST - 指定的主机id不存在
os.EX_UNAVAILABLE - 请求的服务不可用
os.EX_SOFTWARE - 内部软件错误
os.EX_OSERR - 操做系统错误
os.EX_OSFILE - 系统文件不存在
os.EX_CANTCREAT - 没法建立指定的输出文件
os.EX_IOERR - 在进行I/O操做时出错
os.EX_PROTOCOL - 协议切换操做非法,或者协议切换不可用
os.EX_NOPERM - 没有权限执行该操做
os.EX_CONFIG - 配置错误
os.fork()
fork出一个子进程,在子进程中返回0,在父进程中返回子进程ID,若是发生错误,则抛出OSError异常
注意:在一些平台下如FreeBSD,Cygwin和OS/2 EMX系统中使用该函数会有问题。
os.kill(pid, sig)
发送一个信号sig给进程id为pid的进程
os.nice(increment)
增长increment到进程的nice值,返回一个新的nice值。
os.system(command)
在一个shell中执行command命令,这是一个对C函数system()的python实现,具备相同的限制条件。在Unix系统中,返回值是命令执行后的退出状态值。因为POSIX没有为C函数system()的返回值指定明确的含义,因此os.system()的返回值依赖具体的系统。
os.times()
返回一个由浮点数组成的5元组,指定进程的累积运行时间,单位为秒(s)。时间包括:user time,system time,子进程的user time,子进程的system time 以及一个通过的墙上钟表时间。
os.wait()
等待任何一个子进程结束,返回一个tuple,包括子进程的进程ID和退出状态信息:一个16位的数字,低8位是杀死该子进程的信号编号,而高8位是退出状态(若是信号编号是0),其中低8位的最高位若是被置位,则表示产生了一个core文件。
os.waitpid(pid, options)
等待进程id为pid的进程结束,返回一个tuple,包括进程的进程ID和退出信息(和os.wait()同样),参数options会影响该函数的行为。在默认状况下,options的值为0。
若是pid是一个正数,waitpid()请求获取一个pid指定的进程的退出信息,若是pid为0,则等待并获取当前进程组中的任何子进程的值。若是pid为-1,则等待当前进程的任何子进程,若是pid小于-1,则获取进程组id为pid的绝对值的任何一个进程。当系统调用返回-1时,抛出一个OSError异常。
os.wait3(options)
和waitpid()函数相似,区别是不须要指定pid,函数返回一个3元组,包括结束的子进程的进程id,退出状态以及资源的使用信息。关于资源使用可使用resource.getusage()来获取详细的信息。
os.wait4(pid, options)
和waitpid()函数相似,可是函数返回一个3元组外,这点和wait3()函数相似。
waitpid()函数的options选项:
os.WNOHANG - 若是没有子进程退出,则不阻塞waitpid()调用
os.WCONTINUED - 若是子进程从stop状态变为继续执行,则返回进程自前一次报告以来的信息。
os.WUNTRACED - 若是子进程被中止过并且其状态信息尚未报告过,则报告子进程的信息。
以下的函数用于处理那些自system(),wait()和waitpid()返回的状态信息,并将这些状态信息做为以下函数的参数传递。
os.WCOREDUMP(status)
若是一个core文件被建立,则返回True,不然返回False。
os.WIFCONTINUED(status)
若是一个进程被中止过,而且继续执行,则返回True,不然返回False。
os.WIFSTOPPED(status)
若是子进程被中止过,则返回True,不然返回False。
os.WIFSIGNALED(status)
若是进程因为信号而退出,则返回True,不然返回False。
os.WIFEXITED(status)
若是进程是以exit()方式退出的,则返回True,不然返回False。
os.WEXITSTATUS(status)
若是WIFEXITED(status)返回True,则返回一个整数,该整数是exit()调用的参数。不然返回值是未定义的。
os.WSTOPSIG(status)
返回致使进程中止的信号
os.WTERMSIG(status)
返回致使进程退出的信号