能否在 Windows 中完整模擬 fork(3)?若能,如何?

要求:

  1. 必須實現為一個正常的 C 函數。

    #include &
    pid_t fork(){
    // your implementation
    }

  2. 必須可以用正常的 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 上面運行,並且得到正確的結果。

  3. 不要求實現寫時複製。
  4. 可以使用 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開發 |