进程之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 异常阻止退出

你可能感兴趣的:(进程之os模块)