首先,核心物件是什麼?引用《windows核心程式設計》原文:
「每個核心物件都只是乙個記憶體塊,它由作業系統核心(ring0)分配,並只能由作業系統核心訪問。」核心物件存在於程序虛擬位址空間的高位址(32位:0x80000000-0xffffffff),它由三個部分組成:物件頭(_object_header)、物件體(_eprocess/_ethread)和附加資訊。
(書中提到的引用計數和安全描述符存在於物件頭中)
由於核心物件只能由作業系統核心訪問,應用程式(ring3)不可直接訪問,因此,作業系統提供了一組api函式用於對核心物件的操作。核心物件被建立時,函式返回乙個控制代碼,用於標識所建立的物件,這些api函式可通過控制代碼對物件進行訪問。控制代碼值和程序是相關的(每個程序各自維護乙個控制代碼表),所以,依靠程序間通訊傳遞控制代碼值並使用,便可能會發生錯誤(在不同程序同一控制代碼值可能標識不同的核心物件)。
多程序共享核心物件有三種方式:核心物件控制代碼繼承、命名物件和複製物件控制代碼。
核心物件控制代碼繼承的關鍵在於兩個程序必須具有父子關係,即乙個程序生成另外乙個程序。子程序成功繼承並能使用繼承的核心物件需滿足兩點條件:一是父程序需設定該核心物件為可繼承物件;二是父程序需將控制代碼值通過某種程序間通訊的方式(命令列引數等)傳遞給子程序。
需要注意的是:
1.父程序控制代碼表中「可繼承控制代碼」會複製到子程序控制代碼表相應位置,也就是說它們的控制代碼值是相同的。這也是父程序和子程序共享核心物件的前提。
2.核心物件控制代碼的繼承只發生在子程序生成時,之後父程序再生成的「可繼承物件」不再繼承給子程序。
3.子程序需要通過某種方式獲得控制代碼值,否則繼承無效(無法對核心物件進行操作)。
測試**:
建立乙個可繼承的事件核心物件,在建立子程序的時候選擇繼承,並將事件物件的控制代碼值以命令列引數(ar**)傳入子程序。子程序得到控制代碼值,並呼叫setevent函式。事件授信,父程序彈框提示成功。
**關鍵點:
1.允許核心物件繼承
2.通過某種方式傳給子程序控制代碼值
//父程序**
#include
#include
void _tmain
(int argc, tchar* ar**[
], tchar* envp)
; startupinfo startupinfo =
; startupinfo.cb =
sizeof
(startupinfo)
; process_information processinfo =
;//建立安全描述符結構體,並設定控制代碼可繼承(第三引數)
security_attributes securityattributes
;//建立乙個可繼承的事件核心物件
handle eventhandle =
createevent
(&securityattributes, true, false,
null);
if(eventhandle ==
null
)else
//解除父程序對子程序資源的占有 //為何?
if(processinfo.hprocess !=
null
|| processinfo.hthread !=
null
)//等待事件授信
waitforsingleobject
(eventhandle, infinite)
;//子程序設定這個事件則授信,並彈出messagebox
messagebox
(null,_t
("子程序觸發事件,繼承成功"),
_t("success"),
1);_tprintf(_t
("input anykey to exit\r\n"))
;_gettchar()
;}exit:
if(eventhandle !=
null)}
//子程序**
#include
#include
void _tmain
(int argc, tchar* ar**[
], tchar* envp)
//停頓5s,檢視一下傳進來的控制代碼值
sleep
(5000);
if(eventhandle !=
null
)exitprocess(0
);} __except (exception_execute_handler)
}
測試**:
程序1建立命名事件物件,程序2使用相同名稱建立事件物件,並呼叫setevent函式。事件授信,程序1彈窗提示成功。
//程序1
#include
#include
void _tmain
(int argc, tchar* ar**[
], tchar* envp)
waitforsingleobject
(eventhandle, infinite)
;messagebox
(null,_t
("子程序觸發事件"),
_t("success"),
1);_tprintf(_t
("input anykey to exit."))
;_gettchar()
;exit:
if(eventhandle !=
null)}
//程序2
#include
#include
void _tmain
(int argc, tchar* ar**[
], tchar* envp)
//停頓5s,檢視一下傳進來的控制代碼值
sleep
(5000);
if(eventhandle !=
null
)exitprocess(0
);}
乙個程序初始化時會生成乙個專供核心物件使用的控制代碼表,控制代碼表本質是乙個結構體陣列。結構體(記錄項)包含指向核心物件頭(_object_header)的指標、訪問掩碼和控制代碼的屬性(繼承屬性和禁止關閉)等。
建立核心物件時程序會為其在控制代碼表中分配乙個記錄項,函式返回核心物件的控制代碼(控制代碼表索引的四倍)。
多程序檔案共享
一種方法是使用檔案鎖,利用fcntl函式對於檔案進行加鎖解鎖操作,以達到互斥訪問的目的,但是在控制時需要注意程序之間的關係,在有多個程序和共享資源時,應注意死鎖的避免。上乙個最開始寫的程式吧,簡單,就是兩個程序互斥訪問檔案。include include include include void r...
多程序共享 同步
usr bin python coding utf 8 from multiprocessing import process,array,value deff n,a n.value 3.1415926 for i in range 5 a i a i if name main num value...
多程序資料共享
不用程序池的多程序的資料共享from multiprocessing import process,queue queue queue def func a,q re f 我是子程序 我放入data q.put re if name main ls for i in range 10 p proce...