今天在看《Beginning Linux Programming》中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Python的 os 模块实现了对应的函数封装了这些系统调用: os.system , os.exec , os.fork , os.wait,本文和大家分享的就是这部分内容,希望通过本文的分享对大家学习python http://www.maiziedu.com/course/python/有所帮助。

  1. os.system(command)

  # 在一个程序内部启动另一个程序,从而创建一个新进程

  # os.system 在一个shell中执行command命令,这是一个对C函数system()的python实现,具有相同的限制条件。在Unix系统中,返回值是命令执行后的退出状态值。由于POSIX没有为C函数system()的返回值指定明确的含义,所以os.system()的返回值依# 赖具体的系统。在Windowns中,返回值由系统环境变量决定: COMSPEC, 此环境变量依据不同系统版本不同

  # 因为os.system的局限性,官方文档建议用 subprocess模块的功能来代替此函数

  2. os.exec系列

  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类型的对象。

  3. os.fork (只在Unix有效)

  # 要想让进程同时执行多个函数,可以使用线程或者从原程序中创建一个完全分离的进程。可以通过fork创建一个新进程。这个调用复制当前进程,在系统的进程表上创建一个新表项,新表项中的许多属性与当前进程相同。但新进程有自己的数据空间、环境和文件描述符

  # os.fork出一个子进程,在子进程中返回0,在父进程中返回子进程ID,如果发生错误,则抛出OSError异常

  # 注意:在一些平台下如FreeBSD,Cygwin和OS/2 EMX系统中使用该函数会有问题。

  4. os.wait (只在Unix有效)

  # 当fork启动一个子进程时,子进程有了自己的生命周期并独立运行,有时候希望知道一个子进程何时结束,这时可以通过wait函数让父进程等待子进程运行结束

  # os.wait 等待任何一个子进程结束,返回一个tuple,包括子进程的进程ID和退出状态信息:一个16位的数字,低8位是杀死该子进程的信号编号,而高8位是退出状态(如果信号编号是0),其中低8位的最高位如果被置位,则表示产生了一个core文件。

  # 相关的的有os.waitpid(pid, options)

  举例

  os.fork

  #!/usr/bin/python#coding=utf-8import os

  def child():

  print('hello from child', os.getpid(), os.getppid()) #前者获取进程id, 或者获取父进程id

  os._exit(0) # 退出进程, 通常只用在fork() 产生的子进程中

  def parent():

  pid = os.fork() # 返回的pid在父进程中为子进程PID,在资进程中为0, 所以下面根据pid判断是哪个进程

  if pid == 0:

  child()

  print 'fork child process error!' #如果打印该字符串,说明调用child()出错

  else:

  print('hello from parent', os.getpid(), pid)

  parent()

  我电脑上运行结果如下:

  -> python test.py

  ('hello from parent', 1952, 1953)

  ('hello from child', 1953, 1952)

  os.exec 和 os.system

  os.execlp的测试代码如下:

  #!/usr/bin/python#coding=utf-8import os

  def main():

  print "Running ps with execlp"

  os.execlp("ps", 'ps', 'ax')

  print "Done."

  main()

  运行结果:

  -> python test4.py

  Running ps with execlp

  PID TT STAT TIME COMMAND

  1 ?? Ss 0:12.43 /sbin/launchd

  42 ?? Ss 0:03.05 /usr/libexec/UserEventAgent (System)

  43 ?? Us 0:05.24 /usr/sbin/syslogd

  ...

  481 s000 S+ 0:00.14 -zsh

  1803 s001 Ss+ 0:00.49 /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versio

  1806 s002 Ss 0:00.10 /bin/zsh -i

  2070 s002 R+ 0:00.02 ps ax

  os.system的测试代码如下:

  #!/usr/bin/python#coding=utf-8import os

  def main():

  print "Running ps with execlp"

  os.system("ps ax")

  print "Done."

  main()

  运行结果如下:

  -> python test4.py

  Running ps with execlp

  PID TT STAT TIME COMMAND

  1 ?? Ss 0:12.71 /sbin/launchd

  42 ?? Ss 0:03.11 /usr/libexec/UserEventAgent (System)

  ...

  481 s000 S+ 0:00.14 -zsh

  1803 s001 Ss+ 0:00.50 /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versio

  1806 s002 Ss 0:00.10 /bin/zsh -i

  2113 s002 S+ 0:00.02 /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versio

  2114 s002 R+ 0:00.00 ps ax

  Done.

  以上两个例子对比可以看到 exec系列 的调用使得原进程接下的代码都不会运行。

  os.wait

  #! /usr/bin/python#coding=utf-8

  import osimport 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() # 返回值是一个pid 和退出状态的元组

  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)

  main()

  运行结果:

  -> python test4.py

  parent process is running

  waiting for child process

  child process is running

  waited child process's PID = 2152

  总结

  本文简单介绍了系统进程相关的 os.system , os.exec , os.fork , os.wait 系统调用。相关的其它调用如:

  os.kill , os.ncie , os.popen , os.spawn系列 可以参照官方文档。另外实际上python多进程编程更加推荐 multiprocessing 模块提供的相关功能,将在以后的文章中探究。

Python学习之模块进程函数详解的更多相关文章

  1. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  2. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  3. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  4. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  5. 数字的可视化:python画图之散点图sactter函数详解

    最近开始学习python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  6. Python学习记录3-函数参数详解

    参数详解 参数分类 普通参数 默认参数 关键字参数 收集参数 普通参数 定义时直接定义变量名 调用的时候直接把变量或者值放入指定位置 def 函数名 (参数1, 参数2, ....): 函数体 # 调 ...

  7. Python os模块常用函数详解

    当前使用平台: os.name #返回当前使用平台的代表字符,Windows用'nt'表示,Linux用'posix'表示 当前路径和文件 os.getcwd() #返回当前工作目录 os.listd ...

  8. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  9. python select.select模块通信全过程详解

    要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值.select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接 ...

随机推荐

  1. extjs5 一个容器中有几个组件公用一个控制器和一个模型

    Ext.define('TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to v ...

  2. PS转手绘

    2014-08-03  一.人物皮肤处理 复制两层图层,对背景图层隐藏,最后一层 高斯模糊 ,按住ALT创建图层蒙版, 使用画笔工具涂抹人物皮肤,眼睛不涂,把阴影和高光处抹均匀,最后应用图层蒙版,向下 ...

  3. 写启动界面Splash的正确姿势,解决启动白屏(转)

    原文链接:http://www.jianshu.com/p/cd6ef8d3d74d 从我学习写第一个android项目以来,我都是这样写着启动界面: 在里面做一些事,比如:第一次启动时拷贝数据. 然 ...

  4. Java对象的访问

    对象访问在Java语言中无处不在,即使最简单的访问也涉及Java栈.Java堆.方法区这三个重要的内存区域中. 例:Object obj = new Object(); Object obj     ...

  5. ElasticSearch的各种服务的URL

    1.curl192.168.106.58:9200/_cat/health?v 集群健康查看 epoch      timestamp cluster       status node.total ...

  6. 概率 light oj 1248

    t组样例 n<100010 dp[i]  从i翻到n面的期望 接下来翻 可能是i面已经有的 也可能是n-i面没有的 dp[i]=i/n*(dp[i]+1)+(n-i)/n*(dp[i+1]+1) ...

  7. Android Studio开发调试使用

    Android Studio调试其实也非常方便,一般问题直接通过AS的DDMS的Logcat就可以搞定.AS支持类似Eclipse的DDMS的所有功能.这里要说的是疑难问题的调试方式,即断点调试. 首 ...

  8. Echarts-柱状图柱图宽度设置

    先看两张图 图中柱图只需要设置series中的坐标系属性barWidth就可以, 这种图柱状图,折叠柱状图都适应 eg: /** * 堆积柱状图 * @param xaxisdata x轴:标签(数组 ...

  9. 进程间通信方式与Binder机制原理

    1, Intent隐式意图携带数据 2, AIDL(Binder) 3, 广播BroadCast 4, 内容提供者ContentProvider --------------------------- ...

  10. C#-黑客-数据库访问-字符串的攻击和防御

    C#中用基本的方法对数据库进行增删改查,会被黑客利用,写入其他的代码以实现对数据库的数据进行其他的操作.例如: 对下列数据库的某个信息进行修改操作 修改代码: using System; using ...