python 中 os.fork() 與 os.waitpid(pid,*args, **args) 說明
概述
在linux中os.fork()用來生存新的程式,os.wait()和os.waitpid()是用來控制父程式管理等待子程式的方法
fork()
os.fork() 特點:
- os.fork() 呼叫會copy一份父程式完整的資源
- 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取不同的值時,在這裡有不同的意義。
- pid>0時,只等待程式ID等於pid的子程式,不管其它已經有多少子程式執行結束退出了,只要指定的子程式還沒有結束,waitpid就會一直等下去。
- pid=-1時,等待任何一個子程式退出,沒有任何限制,此時waitpid和wait的作用一模一樣。
- pid=0時,等待同一個程式組中的任何子程式,如果子程式已經加入了別的程式組,waitpid不會對它做任何理睬。
- pid<-1時,等待一個指定程式組中的任何子程式,這個程式組的ID等於pid的絕對值。
options
options提供了一些額外的選項來控制waitpid,目前在Linux中只支援WNOHANG和WUNTRACED兩個選項,這是兩個常數,可以用"|"運算子把它們連線起來使用,比如:
|
如果我們不想使用它們,也可以把options設為0,
如果使用了WNOHANG(wait no hung)引數呼叫waitpid,即使沒有子程式退出,它也會立即返回,不會像wait那樣永遠等下去。
而WUNTRACED引數,由於涉及到一些跟蹤除錯方面的知識,加之極少用到,這裡就不多費筆墨了,有興趣的讀者可以自行查閱相關材料。
返回值和錯誤
waitpid的返回值比wait稍微複雜一些,一共有3種情況:
- 當正常返回的時候,waitpid返回收集到的子程式的程式ID;
- 如果設定了選項WNOHANG,而呼叫中waitpid發現沒有已退出的子程式可收集,則返回0;
- 如果呼叫中出錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在;
當pid所指示的子程式不存在,或此程式存在,但不是呼叫程式的子程式
相關文章
- python中*args的使用Python
- python不定長函式:*args 和 **args的使用Python函式
- Python 擴充之 *args & **kwargsPython
- Python 中的 *args 和 **kwargs 是什麼Python
- Python可變引數*args和**kwargsPython
- methodHandle* method, JavaCallArguments* args, TRAPSJava
- Python 中的可變引數: 什麼是*args和**kwargs?Python
- 如何理解 new (...args: any[]) => any
- Java中main方法引數String[ ] args的使用JavaAI
- 在Jinja巨集裡使用*args和**kwargs
- 【Flask】關於request.json /.values /.args /.formFlaskJSONORM
- python3資料模型-模擬可呼叫物件object.__call__(self[, args...])Python模型物件Object
- spark三種清理資料的方式:UDF,自定義函式,spark.sql;Python中的zip()與*zip()函式詳解//及python中的*args和**kwargsSpark函式SQLPython
- 安裝redis cluster時:undefined method `invoke_with_build_args' for nil:NilClassRedisUndefinedUI
- python中encode和decode函式說明Python函式
- openssh版本更新與說明 openssl版本更新與說明
- C語言實現可變引數列表的system介面:巨集__VA_ARGS__C語言
- 找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args)AI
- python的partial()用法說明Python
- Python保留字及其說明Python
- 【LVS】簡介與說明
- Python包的匯入說明Python
- Python 閉包函式說明Python函式
- Python 版本管理工具選擇與 Pyenv 使用說明Python
- MySQL中的pid與socket是什麼?MySql
- spring中的IOC說明Spring
- PHP中$_SERVER的常用引數與說明——收錄篇PHPServer
- CXP 協議中upconnection 與downconnection的說明及其區別協議
- DataLakeAnalytics中OSSLOCATION的使用說明
- Keil中的USE MicroLib說明
- Kustomize 設計理念與使用說明
- Python基礎語法–註釋說明Python
- 說明
- 淺顯直白的Python深複製與淺複製區別說明Python
- JiaoZiVideoPlayer使用說明(持續更新中...)IDE
- 說說Vue 3.0中Treeshaking特性?舉例說明一下?Vue
- PJzhang: github與出口管制·說明條款Github
- 說明與筆記導航(咕咕咕)筆記