python中的os abort_Python::OS 模块 -- 进程管理
這里我們介紹os模塊中的進(jìn)程管理相關(guān)的操作。
os模塊提供給了我們?cè)L問操作系統(tǒng)功能的接口,我們可以通過os模塊提供給我們的進(jìn)程管理接口,編寫多進(jìn)程程序,這對(duì)編寫高效、并發(fā)的程序提供了方便。
下面是一個(gè)最簡(jiǎn)單的父子進(jìn)程交互的例子(僅限Unix系統(tǒng)下):
#! /usr/bin/python#-*- coding: utf-8 -*-
importosimportsysdefchild_process():'''child process'''
print 'child process is running'sys.exit(0)defparent_process():'''parent process'''
print 'parent process is running'
print 'waiting for child process'exit_stat=os.wait()print "waited child process's PID = %d" %(exit_stat[0])
sys.exit(0)defmain():'''main function'''
try:
pid=os.fork()if pid >0:'''parent process'''parent_process()else:
child_process()exceptOSError, e:printos.strerror(e.errno)if __name__ == '__main__':
main()
為了控制進(jìn)程,我們需要學(xué)習(xí)os提供給我們的有關(guān)進(jìn)程控制的接口,下面給出了os模塊支持的進(jìn)程操作(僅限Unix系統(tǒng)下):
進(jìn)程管理
os模塊提供了許多進(jìn)程管理相關(guān)的操作,如果熟悉Unix下的系統(tǒng)編程的話,那么看到這些函數(shù)會(huì)覺得很熟悉,因?yàn)檫@些函數(shù)都是對(duì)相應(yīng)的C API的Python實(shí)現(xiàn),讓我們看看都有些什么函數(shù):
os.abort()
向調(diào)用該函數(shù)的進(jìn)程發(fā)送一個(gè)SIGABRT信號(hào),在Unix系統(tǒng)上默認(rèn)的行為是產(chǎn)生一個(gè)core文件。
注意:當(dāng)調(diào)用os.abort()函數(shù)的時(shí)候不會(huì)調(diào)用python的信號(hào)處理函數(shù)signal.signal()。
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)
這些函數(shù)都執(zhí)行一個(gè)新的程序,然后用新的程序替換當(dāng)前子進(jìn)程的進(jìn)程空間,而該子進(jìn)程從新程序的main函數(shù)開始執(zhí)行。在Unix下,該新程序的進(jìn)程id是原來被替換的子進(jìn)程的進(jìn)程id。在原來子進(jìn)程中打開的所有描述符默認(rèn)都是可用的,不會(huì)被關(guān)閉。
execv*系列的函數(shù)表示其接受的參數(shù)是以一個(gè)list或者是一個(gè)tuple表示的參數(shù)表
execl*系列的函數(shù)表示其接受的參數(shù)是一個(gè)個(gè)獨(dú)立的參數(shù)傳遞進(jìn)去的。
exec*p*系列函數(shù)表示在執(zhí)行參數(shù)傳遞過去的命令時(shí)使用PATH環(huán)境變量來查找命令
exec*e系列函數(shù)表示在執(zhí)行命令的時(shí)候讀取該參數(shù)指定的環(huán)境變量作為默認(rèn)的環(huán)境配置,最后的env參數(shù)必須是一個(gè)mapping對(duì)象,可以是一個(gè)dict類型的對(duì)象。
os._exit(n)
退出進(jìn)程,并且返回退出狀態(tài)n,在退出的時(shí)候不會(huì)執(zhí)行清理工作,直接退出。
注意:正常的退出應(yīng)該使用sys.exit(n),而_exit()函數(shù)一般只用在fork之后的子進(jìn)程中調(diào)用以退出。
可用的退出狀態(tài)(并不適用所有的Unix平臺(tái)都可用):
os.EX_OK - 正常退出
os.EX_USAGE - 命令執(zhí)行不正確,如命令參數(shù)錯(cuò)誤
os.EX_DATAERR - 輸入數(shù)據(jù)有誤
os.EX_NOINPUT - 輸入文件不存在或者不可讀
os.EX_NOUSER - 指定的用戶不存在
os.EX_NOHOST - 指定的主機(jī)id不存在
os.EX_UNAVAILABLE - 請(qǐng)求的服務(wù)不可用
os.EX_SOFTWARE - 內(nèi)部軟件錯(cuò)誤
os.EX_OSERR - 操作系統(tǒng)錯(cuò)誤
os.EX_OSFILE - 系統(tǒng)文件不存在
os.EX_CANTCREAT - 無法創(chuàng)建指定的輸出文件
os.EX_IOERR - 在進(jìn)行I/O操作時(shí)出錯(cuò)
os.EX_PROTOCOL - 協(xié)議切換操作非法,或者協(xié)議切換不可用
os.EX_NOPERM - 沒有權(quán)限執(zhí)行該操作
os.EX_CONFIG - 配置錯(cuò)誤
os.fork()
fork出一個(gè)子進(jìn)程,在子進(jìn)程中返回0,在父進(jìn)程中返回子進(jìn)程ID,如果發(fā)生錯(cuò)誤,則拋出OSError異常
注意:在一些平臺(tái)下如FreeBSD,Cygwin和OS/2 EMX系統(tǒng)中使用該函數(shù)會(huì)有問題。
os.kill(pid, sig)
發(fā)送一個(gè)信號(hào)sig給進(jìn)程id為pid的進(jìn)程
os.nice(increment)
增加increment到進(jìn)程的nice值,返回一個(gè)新的nice值。
os.system(command)
在一個(gè)shell中執(zhí)行command命令,這是一個(gè)對(duì)C函數(shù)system()的python實(shí)現(xiàn),具有相同的限制條件。在Unix系統(tǒng)中,返回值是命令執(zhí)行后的退出狀態(tài)值。由于POSIX沒有為C函數(shù)system()的返回值指定明確的含義,所以os.system()的返回值依賴具體的系統(tǒng)。
os.times()
返回一個(gè)由浮點(diǎn)數(shù)組成的5元組,指定進(jìn)程的累積運(yùn)行時(shí)間,單位為秒(s)。時(shí)間包括:user time,system time,子進(jìn)程的user time,子進(jìn)程的system time 以及一個(gè)經(jīng)過的墻上鐘表時(shí)間。
os.wait()
等待任何一個(gè)子進(jìn)程結(jié)束,返回一個(gè)tuple,包括子進(jìn)程的進(jìn)程ID和退出狀態(tài)信息:一個(gè)16位的數(shù)字,低8位是殺死該子進(jìn)程的信號(hào)編號(hào),而高8位是退出狀態(tài)(如果信號(hào)編號(hào)是0),其中低8位的最高位如果被置位,則表示產(chǎn)生了一個(gè)core文件。
os.waitpid(pid, options)
等待進(jìn)程id為pid的進(jìn)程結(jié)束,返回一個(gè)tuple,包括進(jìn)程的進(jìn)程ID和退出信息(和os.wait()一樣),參數(shù)options會(huì)影響該函數(shù)的行為。在默認(rèn)情況下,options的值為0。
如果pid是一個(gè)正數(shù),waitpid()請(qǐng)求獲取一個(gè)pid指定的進(jìn)程的退出信息,如果pid為0,則等待并獲取當(dāng)前進(jìn)程組中的任何子進(jìn)程的值。如果pid為-1,則等待當(dāng)前進(jìn)程的任何子進(jìn)程,如果pid小于-1,則獲取進(jìn)程組id為pid的絕對(duì)值的任何一個(gè)進(jìn)程。當(dāng)系統(tǒng)調(diào)用返回-1時(shí),拋出一個(gè)OSError異常。
os.wait3(options)
和waitpid()函數(shù)類似,區(qū)別是不需要指定pid,函數(shù)返回一個(gè)3元組,包括結(jié)束的子進(jìn)程的進(jìn)程id,退出狀態(tài)以及資源的使用信息。關(guān)于資源使用可以使用resource.getusage()來獲取詳細(xì)的信息。
os.wait4(pid, options)
和waitpid()函數(shù)類似,但是函數(shù)返回一個(gè)3元組外,這點(diǎn)和wait3()函數(shù)類似。
waitpid()函數(shù)的options選項(xiàng):
os.WNOHANG - 如果沒有子進(jìn)程退出,則不阻塞waitpid()調(diào)用
os.WCONTINUED - 如果子進(jìn)程從stop狀態(tài)變?yōu)槔^續(xù)執(zhí)行,則返回進(jìn)程自前一次報(bào)告以來的信息。
os.WUNTRACED - 如果子進(jìn)程被停止過而且其狀態(tài)信息還沒有報(bào)告過,則報(bào)告子進(jìn)程的信息。
如下的函數(shù)用于處理那些自system(),wait()和waitpid()返回的狀態(tài)信息,并將這些狀態(tài)信息作為如下函數(shù)的參數(shù)傳遞。
os.WCOREDUMP(status)
如果一個(gè)core文件被創(chuàng)建,則返回True,否則返回False。
os.WIFCONTINUED(status)
如果一個(gè)進(jìn)程被停止過,并且繼續(xù)執(zhí)行,則返回True,否則返回False。
os.WIFSTOPPED(status)
如果子進(jìn)程被停止過,則返回True,否則返回False。
os.WIFSIGNALED(status)
如果進(jìn)程由于信號(hào)而退出,則返回True,否則返回False。
os.WIFEXITED(status)
如果進(jìn)程是以exit()方式退出的,則返回True,否則返回False。
os.WEXITSTATUS(status)
如果WIFEXITED(status)返回True,則返回一個(gè)整數(shù),該整數(shù)是exit()調(diào)用的參數(shù)。否則返回值是未定義的。
os.WSTOPSIG(status)
返回導(dǎo)致進(jìn)程停止的信號(hào)
os.WTERMSIG(status)
返回導(dǎo)致進(jìn)程退出的信號(hào)
總結(jié)
以上是生活随笔為你收集整理的python中的os abort_Python::OS 模块 -- 进程管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gis根据范围批量分开图斑_基于BIM-
- 下一篇: intro to cs with pyt