fork

142 阅读2分钟

fork接口

在fork()是基于unix/linux内核的函数,在windows中无法使用,因此multiprocessing模块作为跨平台的存在。

pid os.fork() 功能:创建新的进程 返回值:整数,如果创建进程失败返回一个负数,如果 成功则在原有进程中返回新进程的PD,在新进程中返 回0

  • 子进程会复制父进程全部内存空间,从fork下句开始执行。
  • 父子进程各自独立运行,运行顺序不一定。
  • 利用父子进程fok返回值的区别,配合f结构让父子进程执行不同的内容几乎是固定搭配。
  • 父子进程有各自特有特征比如PID PCB命令集等
  • 父进程fok之前开辟的空间子进程同样拥有父子井程对各白空间的操作不会相互影响

os.rgetpid()

  • 功能:获取一个进程的PD值
  • 返回值:返回当前进程的PD

os.getppid()

  • 功能:获取父进程的PD号
  • 返回值:返回父进程PD

os._exit(status)

  • 功能:结束一个进程
  • 参数:进程的终止状态

sys.exit([status])

  • 功能:退出进程
  • 参数:整数表示退出状态
  • 字符串表示退出时打印内容

孤儿进程和僵尸进程

1.孤儿进程:父进程先于子进程退出,此时子进程成为孤 儿进程

2.特点:孤儿进程会被系统进程收养,此时系统进程就会 成为孤)儿进程新的父进程,孤儿进程退出该进程会自动 处理

1.僵尸进程:子进程先于父进程退出,父进程又没有处理 子进程的退出状态,此时子进程就会称为僵尸进程。

2.特点:僵尸进程虽然结束,但是会存留部分PCB在内存 中,大量的僵尸进程会浪费系统的内存资源。

如何避免僵尸进程产生

1.使用wait函数处理子进程退出

pid,status os.wait()

  • 功能:在父进程中阻塞等待处理子进程退出
  • 返回值:pid退出的子进程的PID
  • status 子进程退出状态

2.创建二级子进程处理僵

  1. 父进程创建子进程,等待回收子进程
  2. 子进程创建二级子进程然后退出
  3. 二级子进程称为孤儿,和原来父进程一同执行事件

3.通过信号处理子程序的退出

  • 原理:子进程退出时会发送信号给父进程,如果父进程忽略子进程信号,则系统就会自动处理子进程退出。
  • 方法:使用signal模块在父进程创建子进程前写如下语句

image.png

  • 特点:非阻塞,不会影响父进程运行。可以处理所有子进程退出