python 中 os.fork() 與 os.waitpid(pid,*args, **args) 說明

zhupenghui176發表於2020-10-15

概述

    在linux中os.fork()用來生存新的程式,os.wait()和os.waitpid()是用來控制父程式管理等待子程式的方法

fork()

    os.fork() 特點:

  1.  os.fork() 呼叫會copy一份父程式完整的資源
  2.  os.fork() 返回值 父程式返回子程式的id,子程式執行os.fork()呼叫返回值“0”

    我可以通過這兩個特性去控制使用和控制程式的執行     

 

#最簡單的例項
import os

def test(a):
    print(a)


def main():
    l = [i for i in range(10)]
    cid = os.fork()
    if cid ==0:
        print("this is children process")
    if cid > 0:
        os.waitpid(-1,0)
        print("this is parents process")


if __name__ == "__main__":
    main()

waitpid(pid, *args)

        從本質上講,系統呼叫waitpid和wait的作用是完全相同的,但waitpid多出了兩個可由使用者控制的引數pid和options,從而為我們程式設計提供了另一種更靈活的方式。下面我們就來詳細介紹一下這兩個引數:

pid 

從引數的名字pid和型別pid_t中就可以看出,這裡需要的是一個程式ID。但當pid取不同的值時,在這裡有不同的意義。

  1. pid>0時,只等待程式ID等於pid的子程式,不管其它已經有多少子程式執行結束退出了,只要指定的子程式還沒有結束,waitpid就會一直等下去。
  2. pid=-1時,等待任何一個子程式退出,沒有任何限制,此時waitpid和wait的作用一模一樣。
  3. pid=0時,等待同一個程式組中的任何子程式,如果子程式已經加入了別的程式組,waitpid不會對它做任何理睬。
  4. pid<-1時,等待一個指定程式組中的任何子程式,這個程式組的ID等於pid的絕對值。

options

        options提供了一些額外的選項來控制waitpid,目前在Linux中只支援WNOHANG和WUNTRACED兩個選項,這是兩個常數,可以用"|"運算子把它們連線起來使用,比如:

ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

如果我們不想使用它們,也可以把options設為0, 

如果使用了WNOHANG(wait no hung)引數呼叫waitpid,即使沒有子程式退出,它也會立即返回,不會像wait那樣永遠等下去。

而WUNTRACED引數,由於涉及到一些跟蹤除錯方面的知識,加之極少用到,這裡就不多費筆墨了,有興趣的讀者可以自行查閱相關材料。

 

返回值和錯誤

waitpid的返回值比wait稍微複雜一些,一共有3種情況:

  1. 當正常返回的時候,waitpid返回收集到的子程式的程式ID;
  2. 如果設定了選項WNOHANG,而呼叫中waitpid發現沒有已退出的子程式可收集,則返回0;
  3. 如果呼叫中出錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;

當pid所指示的子程式不存在,或此程式存在,但不是呼叫程式的子程式

相關文章