os模塊的簡介參看 Python::OS 模塊 -- 簡介html
os模塊的文件相關操做參看 Python::OS 模塊 -- 文件和目錄操做python
os模塊的進程參數 Python::OS 模塊 -- 進程參數shell
這裏咱們介紹os模塊中的進程管理相關的操做。編程
os模塊提供給了咱們訪問操做系統功能的接口,咱們能夠經過os模塊提供給咱們的進程管理接口,編寫多進程程序,這對編寫高效、併發的程序提供了方便。數組
下面是一個最簡單的父子進程交互的例子(僅限Unix系統下):併發
#! /usr/bin/python # -*- coding: utf-8 -*- import os import sys def child_process(): '''child process''' print 'child process is running' sys.exit(0) def parent_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) def main(): '''main function''' try: pid = os.fork() if pid > 0: '''parent process''' parent_process() else: child_process() except OSError, e: print os.strerror(e.errno) if __name__ == '__main__': main()
爲了控制進程,咱們須要學習os提供給咱們的有關進程控制的接口,下面給出了os模塊支持的進程操做(僅限Unix系統下):app
os模塊提供了許多進程管理相關的操做,若是熟悉Unix下的系統編程的話,那麼看到這些函數會以爲很熟悉,由於這些函數都是對相應的C API的Python實現,讓咱們看看都有些什麼函數:函數
os.abort()post
向調用該函數的進程發送一個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)
返回致使進程退出的信號