搜尋此網誌

2011年11月10日 星期四

fork()、exec()、exit()對IPC(interprocess communication)物件的影響

IPC(interprocess communication)行程間的通訊。
Posix(realtime standard)即時標準。
RPC(Remote Procedure Call)遠端程序呼叫。

當多個thread的行程呼叫fork後,會讓沒有被命名的同步變數(mutex、條件變數、讀寫鎖定、及記憶體式的semaphore)變的一團混亂。


IPC種類
fork()
exec()
exit()
pipeFIFO
子行程將會取得所有父行程所開啟的描述子的被份。
除非子描述的FD_CLOEXEC位元為ON,否則所有已開啟的子描述仍然將保持在開啟之狀態。
所有已開啟的子描述會被關閉;如果這是最後的關閉者,則pipeFIFO中的所有資料都會被移除。
Posix訊息佇列
子行程將會取得所有父行程所開啟之訊息佇列子描述的備份。
所有已開啟的訊息佇列子描述都會被關閉。
所有已開啟的訊息佇列子描述都會被關閉。
System V訊息佇列
沒有影響。
沒有影響。
沒有影響。
Posix mutex及條件變數
如果這些物件再共享記憶體中,而且有行程共享的屬性,則可被父子行程共享。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
Posix讀寫鎖定
如果這些物件再共享記憶體中,而且有行程共享的屬性,則可被父子行程共享。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
Posix記憶體式semaphore
如果這些物件再共享記憶體中,而且有行程共享的屬性,則可被父子行程共享。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
除非這些物件在保持開放狀態且有行程共享屬性的共享記憶體中,否則會消失。
Posix命名式semaphore
所有在父行程中已開啟的物件,在子行程中仍然維持開啟狀態。
所有已開啟的物件都會被關閉。
所有已開啟的物件都會被關閉。
System V semaphore
在子行程中,所有semadj的值都會設為0
所有semadj的值都會移植到新的程式去。
所有semadj的值都會加到對應的semaphore值上。
fnctl記錄鎖定
子行程不會繼承父行程所擁有的鎖定。
只要描述子維持開放狀態,鎖定就會維持不變。
行程所有進行中的鎖定都會被解除。
Mmap記憶體映射
子行程將保留所有父行程的記憶體映射。
記憶體映射會被解除。
記憶體映射會被解除。
Posix共享記憶體
子行程將保留所有父行程的記憶體映射。
記憶體映射會被解除。
記憶體映射會被解除。
System V共享記憶體
所有連結的共享記憶體區段都會被連結到子行程。
所有連結的共享記憶體區段都會被解除。
所有連結的共享記憶體區段都會被解除。
door
子行程將取得所有父行程所開啟之子描述的備份,但只有父行程可作為以door子描述做door呼叫的伺服端。
所有的door子描述都應該要被關閉,因為它們開啟時都有設定FD_CLOEXEC位元。
所有子描述都應該要被關閉。


沒有留言:

張貼留言