能否在 Windows 中完整模擬 fork(3)?若能,如何?
要求:
- 必須實現為一個正常的 C 函數。
#include &
pid_t fork(){
// your implementation
}
- 必須可以用正常的 Visual Studio 和正常的 Windows SDK 將如下代碼
#include &
#include &
// 此處可以有額外代碼
pid_t fork() {
// your implementation
}
int main () {
// 此處有可選初始化代碼
pid_t fpid;
int count = 0;
fpid = fork();
if (fpid &< 0) { printf("error in fork!"); } else if (fpid == 0) { printf("i am the child process, my process id is %d/n",getpid()); count++; } else { printf("i am the parent process, my process id is %d/n",getpid()); count++; } printf("Count is: %d/n",count); return 0; }編譯為 EXE,此 EXE 不得依賴任何非系統 dll,可以在剛安裝完成的 Windows 7+ x64 上面運行,並且得到正確的結果。
- 不要求實現寫時複製。
- 可以使用 NT API/Undocumented API。
可以,當年有本書叫「Windows NT/2000 Native API Reference」,裡面有詳細介紹怎麼實現 fork。當然有些細節語意不可能與 Linux 下的完全一致,不過 copy-on-write 之類的肯定是有的。
一句話摘抄大概就是fork 系統調用可以用 NtCreateProcess 來實現,只要其中的 SectionHandle 參數為 NULL,另外系統調用實現所需要的各種句柄在創建時應指定其為可繼承。
不僅如此,在 XP 上其實就可以實現這種 native 的子系統,當然性能上不能要求太多了。有興趣的話可以看看答主 07 年讀書時的大作業報告 https://1drv.ms/b/s!Alw_UD23f9RwlTfWEUPHcB76WIvt。請忽略其中的渣渣代碼。。。當時實現的程度是簡單的命令行工具比如 grep, gzip 之類的可以拿過來直接跑,只要連同把他們依賴的一坨 so 一併 copy 過來即可。
我能說去搜msys2源碼嗎……人家用Zw系API做的fork
我只知道有個API叫RtlCloneUserProcess
我知道cygwin和msys是有fork的,雖然性能不行,Windows開進程開銷就是大這個沒辦法的。反正,思路在這裡了,去cygwin和msys扒拉源代碼吧。我是懶得寫實現了。
不能,until windows 10。
fork/CreateProcess的本質區別在於是否複製地址空間和eip寄存器,這兩件事都只有內核才能幹的了,尤其是後者,用戶空間是無法控制的。至於CoW,那只是個優化,先搞定複製再說。
樓上有說node能做,效果上是但不嚴格。node複製的是js虛擬機,其地址空間和上下文都是用戶空間的,所以能指定。
實際上像postgre這樣的程序10年前就在自己模擬fork從而移植到windows上,但這要求將整個程序改造為若干個無狀態的子模塊,且fork只發生在子模塊之間,這個工作量非常大,以至於像nginx這樣的都選擇在windows上改用線程。
windows10在subsystem for linux里專門實現了fork,是內核級的,所以才能bash for windows。POSReady 7 EVAL題主好像沒有指定 Windows 7 的版本,那用自帶 SUA 的不就行了?(逃
node.exe就有類似樓主所需要的能力。
推薦閱讀:
※「記事本」程序的BUG?
※中國大部分人什麼時候可以用上正版 Windows?
※為什麼還會有購買的win10?
※如何看待windows 10不能通過正常方法卸載數個應用商店內的metro應用?
※為什麼SSD能夠使成熟的操作系統的體驗獲得如此多的提升?
TAG:MicrosoftWindows | C | Windows開發 |