OS之os.fork()

  有两种方式来实现并发性,

  一种方式是让每个“任务"或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另一个时间片的到来。

  另一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效,因为操作系统不必为每个线程创建单独的内存空间。



  新建进程用os.fork函数。但它只在POSIX系统上可用,在windows版的python中,os模块没有定义os.fork函数。相反,windows程序员用多线程编程技术来完成并发任务。

  os.fork函数创建进程的过程是这样的。程序每次执行时,操作系统都会创建一个新进程来运行程序指令。进程还可调用os.fork,要求操作系统新建一个进程。父进程是调用os.fork函数的进程。父进程所创建的进程叫子进程。每个进程都有一个不重复的进程ID号。或称pid,它对进程进行标识。子进程与父进程完全相同,子进程从父进程继承了多个值的拷贝,如全局变量和环境变量。两个进程的唯一区别是fork的返回值。子进程接收返回值0,而父进程接收子进程的pid作为返回值。一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。 对于程序,只要判断fork的返回值,就知道自己是处于父进程还是子进程中。

  子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
  用os.fork创建的子进程和父进程作为异步的并发进程而单独执行。异步是指它们各行其是,相互间不进行同步;并发是指它们可同时执行。所以我们无法知道子进程和父进程的相对速度。
  os.wait函数用于等待子进程结束(只适用于UNIX兼容系统)。该函数返回包含两个元素的元组,包括已完成的子进程号pid,以及子进程的退出状态,返回状态为0,表明子进程成功完成。返回状态为正整数表明子进程终止时出错。如没有子进程,会引发OSError错误。os.wait要求父进程等待它的任何一个子进程结束执行,然后唤醒父进程。

  要指示父进程等候一个指定的子进程终止,可在父进程中使用os.waitpid函数(只适用于unix兼容系统)。它可等候一个指定进程结束,然后返回一个双元素元组,其中包括子进程的pid和子进程的退出状态。函数调用将pid作为第一个参数传递,并将一个选项作为第二个选项,如果第一个参数大于 0,则waitpid会等待该pid结束,如果第一个参数是-1,则会等候所有子进程,也就和os.wait一样。
  用os.system 和 os.exec函数族来执行系统命令和其它程序。os.system使用shell来执行系统。

时间: 2024-08-05 02:37:47

OS之os.fork()的相关文章

os模块 os.stat('path/filename') os.path.dirname(path) os.path.exists(path)  os.path.join(path1[, path2[, ...]])

提供对操作系统进行调用的接口 1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname")  改变当前脚本工作目录:相当于shell下cd 3 os.curdir  返回当前目录: ('.') 4 os.pardir  获取当前目录的父目录字符串名:('..') 5 os.makedirs('dirname1/dirname2')    可生成多层递归目录 6 os.removedirs('dirname1')    若

关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折腾的序幕 db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp() 稍微查询一下就能了解到 tempfile是一个临时文件模块. 包含了一些临时文件的操作 tempfile.mkstemp() 在很老很老的python版本的时候,第一个参数是

浏览器新实用功能开发研究:启动到浏览器(Fire OS, Chrome OS, Web OS)与浏览器容器化

启动到浏览器(Fire OS, Chrome OS, Web OS)与浏览器容器化 本文试图阐明2种不同的技术方案:一个是启动到浏览器(如Fire OS, Chrome OS, HP Web OS, Tizen Web Rutime),另外一个我称为浏览器容器化 启动到浏览器相信大家多少已经有了解,它就是通过底层的驱动支持.HTML5 Device API等等,把浏览器内核做成整个操作系统的应用运行时,使用用户的所有应用都可以通过HTML + CSS + JavaScript的方式编写,这无疑节

Microsoft Azure Host OS&Guest OS

Microsoft Azure的计算资源其实可以理解为运行在Azure数据中心中成千上万的Rack. Rack上的多台物理服务器本身需要运行操作系统,这个操作系统可以理解为Host OS,即物理服务器的操作系统. 物理服务器通过特殊版本的Hyper-V,同时运行多个Azure VM虚拟机,这些虚拟机就是Guest OS,即虚拟机的操作系统. 用户只能够接触到Guest OS而无法接触到Host OS. Microsoft Azure所有的计算功能都是基于虚拟机完成的,既然是虚拟机那么就会存在一个

python执行系统命令:os.system,os.popen,commands

写脚本的时候经常会直接执行系统命令. 一.最先使用的是os.system()命令. import os os.system("cat /etc/hosts") 但是吧,这个方法并不能取得输出和返回值的. 二.接着我就使用了os.popen()命令 import os output = os.popen("cat /etc/hosts") print output.read() 通过os.popen返回的是file read对象,因此要获取内容的话,直接可以outpu

python模块之os和os.path模块

1.os模块os.listdir(dirname) 列出dirname下的目录和文件os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径.os.getenv()和os.putenv()函数分别用来读取和设置环境变量.os.curdir:返回但前目录(’.') os.chdir(dirname):改变工作目录到dirnameos.sep 可以取代操作系统特定的路径分割符.os.name字符串指示你正在使用的平台.比如对于Windows,它是’nt’,而对于Linux/U

python—— 文件的打开模式和文件对象方法 & os、os.path 模块中关于文件、目录常用的函数使用方法

引用自"鱼c工作室"     文件的打开模式和文件对象方法  : https://fishc.com.cn/forum.php?mod=viewthread&tid=45279&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403 os.os.path 模块中关于文件.目录常用的函数使用方法: https://fishc.com.cn/forum.php?mod=viewthread&tid=45512&extr

[Python] Mac OS 下 os.startfile 的替代方案

在 Windows 系统上,Python 3.X 有一个os.startfile函数,用于模拟双击一个文件的操作 这一操作在非 Windows 系统上不受支持,但是采用 OS X 命令行中实现的open命令来实现类似的效果 # Win32 import os os.startfile(filename) # OS X import subprocess subprocess.call(["open", filename]) 后者实现的是执行open <filename>命令

[py] os.system os.popen commands 执行shell

? 1.仅输出到屏幕,pwd保存的是状态<=====可用于执行shell命令 pwd=os.system(pwd) ? 2.popen可以保存命令结果 pwd=os.popen('pwd').read() ? 3,返回状态和命令结果 pwd=commands.getstatusoutput('pwd') (0, '/home/py')