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