標籤:程式 win32 進程 檔案 進程組 標準 它的 handle 不同的
在UNIX系統中,僅僅有一個系統調用能夠用來建立新進程:fork。這個系統調用會建立一個與調用進程相同的副本。
在調用了fork之後。這兩個進程(父進程和子進程)擁有相同的儲存映像、相同的環境字串和相同的開啟檔案。
這就是所有情形。同城,子進程接著運行execve或一個類似的系統調用,以改動其儲存映像並運行一個新的程式。比如,當一個使用者在shell中鍵入命令時,shell就建立一個子進程,然後,這個子進程運行sort。
之所以要安排兩步建立進程,是為了在fork之後但在execve之前同意該子進程處理其檔案描寫敘述符,這樣能夠完畢對標準輸入、標準輸出和標準出錯的重新導向。
在windows中,情形正相反。一個Win32函數調用CreatProcess既處理進程的建立,也負責把正確的程式裝入新的進程。
該調用有10個參數,期中包含要啟動並執行程式、輸入給該程式的命令列參數、各種安全屬性、有關開啟的檔案是否繼承的控制位、優先順序資訊、為該進程(若有的話)所須要建立的表單規格以及指向一個結構的指標,在該結構中新建立進程的資訊被返回給調用者。
除了CreateProcess。Win32中有大約100個其它的函數用於處理進程的管理、同步以及相關的事物。
在Unix和Windows中。進程建立之後,父進程和子進程有各自不同的地址空間。
假設當中某個進程在其地址空間中改動了一個字,這個改動對其它進程而言是不可見的。
在UNIX中,子進程的初始地址是父進程的一個副本,可是這裡涉及兩個不同的地址空間,不可寫的記憶體去是共用的(某些UNIX的實現使程式徵文在兩者間共用,由於它不能被改動)。可是。對於一個新建立的進程而言,確實有可能共用其建立者的其它資源。諸如開啟的檔案等。在Windows中,從一開始父進程的地址空間和子進程的地址空間就是不同的。
在UNIX中,進程和它的全部子女以及後裔project組成一個進程組。
相反,Windows中沒有進程層次的概念,全部的進程都是地位同樣的。唯一類似於進程層次的暗示是在建立進程的時候。父進程得到一個特別的令牌(成為控制代碼handle),該控制代碼能夠用來控制子進程。可是,它有權把這個令牌傳給某個其它進程。這樣就不存在進程層次了。在UNIX中,進程就不能剝奪其子女的“繼承權”。
作業系統 - unix和windows下進程異同