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 和**kwargsPython
- python不定長函式:*args 和 **args的使用Python函式
- Python中如何使用*args和**kwargsPython
- Python中*args和**kwargs 的簡單使用Python
- Python 中的 *args 和 **kwargs 是什麼Python
- Python 擴充之 *args & **kwargsPython
- 【Python】*args 和 **kwargs的用法Python
- Python中func(*args, **kwargs)的引數問題Python
- 詳解Python的*args和 **kwargsPython
- Python可變引數*args和**kwargsPython
- Python基礎-*args和**kwargs魔法變數Python變數
- Python 中的可變引數: 什麼是*args和**kwargs?Python
- 如何理解 new (...args: any[]) => any
- methodHandle* method, JavaCallArguments* args, TRAPSJava
- Methods with Variable Argument Lists (var-args)
- Java中main方法引數String[ ] args的使用JavaAI
- 【Flask】關於request.json /.values /.args /.formFlaskJSONORM
- python3資料模型-模擬可呼叫物件object.__call__(self[, args...])Python模型物件Object
- 安裝redis cluster時:undefined method `invoke_with_build_args' for nil:NilClassRedisUndefinedUI
- Nginx Parsing HTTP Package、header/post/files/args Sourcecode AnalysisNginxHTTPPackageHeader
- spark三種清理資料的方式:UDF,自定義函式,spark.sql;Python中的zip()與*zip()函式詳解//及python中的*args和**kwargsSpark函式SQLPython
- openssh版本更新與說明 openssl版本更新與說明
- C語言實現可變引數列表的system介面:巨集__VA_ARGS__C語言
- python中encode和decode函式說明Python函式
- Python保留字及其說明Python
- 找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args)AI
- Python 閉包函式說明Python函式
- Python包的匯入說明Python
- Python常用函式及說明Python函式
- Python 版本管理工具選擇與 Pyenv 使用說明Python
- PHP中$_SERVER的常用引數與說明——收錄篇PHPServer
- 【轉載】ArcGIS中topolopy說明
- spring中的IOC說明Spring
- MySQL中的pid與socket是什麼?MySql
- 【LVS】簡介與說明
- Bitbucket使用說明與SourceTree的使用
- (zz)WSAEWOULDBLOCK 與 FD_WRITE 說明BloC