天天看點

Python:OS 子產品 -- 程序管理

建議檢視原作者原文。

這裡我們介紹os子產品中的程序管理相關的操作。

os子產品提供給了我們通路作業系統功能的接口,我們可以通過os子產品提供給我們的程序管理接口,編寫多程序程式,這對編寫高效、并發的程式提供了友善。

下面是一個最簡單的父子程序互動的例子(僅限Unix系統下):

#! /usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys      
import time

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()      

運作結果:

parent process is running

waiting for child process(暫停5秒)

child process is running

waited child process's PID = 10324

為了控制程序,我們需要學習os提供給我們的有關程序控制的接口,下面給出了os子產品支援的程序操作(僅限Unix系統下):

程序管理

os子產品提供了許多程序管理相關的操作,如果熟悉Unix下的系統程式設計的話,那麼看到這些函數會覺得很熟悉,因為這些函數都是對相應的C API的Python實作,讓我們看看都有些什麼函數:

os.abort()

向調用該函數的程序發送一個SIGABRT信号,在Unix系統上預設的行為是産生一個core檔案。

注意:當調用os.abort()函數的時候不會調用python的信号處理函數signal.signal()。

os.exe系列函數

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)

傳回導緻程序停止的信号