进程之os模块

os模块

  • os 模块提供大量和系统相关的功能函数接口
  • os 模块的使用时系统相关的,在不同的系统中,可能使用方法不同
os.fork()
  • 平台:只能在linux和unix下使用
  • 功能:创建一个新的进程
  • 参数:无
  • 返回值:
    • < 0 表示进程创建失败
    • == 0 在子进程中fork的返回值为0
    • > 0 在父进程中fork的返回值大于0,返回新的进程的PID号
import os

# 创建新进程
pid = os.fork()

if pid < 0:
    print('Create process failed.')
elif pid == 0:
    print('This is the new process.')
else:
    print('This is the parent process.')

print('The porcess end.')
注意点
  • 子进程会复制父进程全部代码段,包括fork之前产生的内存空间
  • 子进程从fork的下一句开始执行,与父进程互不干扰,理论上不一定谁先执行
  • 父子进程的执行顺序是不一定的,父子进程公用一个终端显示
  • 父子进程通常会根据fork返回值得差异选择执行不同的代码。所以if结构几乎是fork的固定搭配
  • 父子进程空间独立,操作的都是本空间的内容,互不影响
  • 子进程也有自己的特性,比如PID号,PCB,命令集等
  • 子进程的退出不会影响父进程。
  • 子进程不会执行fork语句,会从fork的下一句开始执行,当父进程执行到fork语句时,系统会记录当前的位置,即文件偏移量,子进程从当前的位置开始执行,而fork的下一句并非if语句,而是把fork的返回值赋值给pid的赋值语句。
import os

# 创建新进程
pid = os.fork()
a = 10

if pid < 0:
    print('Create process failed.')
elif pid == 0:
    print('pid =',pid)  # 0
    print('This is the new process.')
    print(a)   # 10
    a = 1000  # 子进程中修改a的值,不会影响父进程a的值
else:
    # 父进程中的PID为子进程的PID号。
    print('Parent pid =',pid)   
    print('This is the parent process.')

print('The porcess end.')
print(a)  # 父进程 a = 10,子进程 a = 1000

进程相关函数

  • os.getpid() 获取当前进程的PID号
  • os.getppid() 获取当前进程父进程的PID号
  • os._exit(status) 结束一个进程
    一个数字表示进程的退出状态,通常0表示正常退出进程,其他数字表示非正常退出
  • sys.exit([status]) 结束一个进程,如果处理了抛出的异常则不结束进程
    • 一个数字表示进程的退出状态,默认为0,还可以是一个字符串,则在进程退出时会打印这个字符串
    • 可以通过捕获 SystemExit 异常阻止退出
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,517评论 1 14
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,190评论 0 23
  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 3,829评论 0 5
  • 1.进程 1.1多线程的引入 现实生活中 有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再...
    TENG书阅读 560评论 0 0
  • 周一时,友人们给我发中秋祝福,顺便还问我腐国的月亮是否不一样,我回复到,一样圆。可周二一早起来,刷爆朋友圈是今年...
    yushanfengse阅读 392评论 2 6