2017-03-06 64 views
2

我正在寫一個小程序,它有點是一個服務器,它產生了它的客戶端程序(本地,不在網絡上)並在它們之間做有趣的事情。雖然我使用的主要操作系統是Linux,但我希望這可以在包括Windows在內的其他操作系統上運行。有forkexec這是做這項工作,但是當我通過cygwin將程序移植到Windows時,我不希望在cygwin中實現蹩腳的fork,實際上它調用CreateProcess並將當前進程的內存區域複製到新的使用帶共享內存互斥的setjmp/longjmp進行處理,所有這些以便被另一個程序(exec)替換。在閱讀cygwin的FAQ頁面時,我發現了spawn.h及其posix_spawn,它在windows中基本上看起來像CreatePorcess(Ex)。它看起來像一個新的功能(...我的意思不是原來的UNIX系統功能之一),所以我有一些問題。「posix_spawn」的能力

  1. 實施得好,廣泛嗎? (我在網上看到一些帖子,這是不是他/她的系統下的定義。)

  2. 我可以期待通過使用posix_spawn,而不是在Linux中fork/exec任何性能的改善或惡化?

  3. 爲什麼posix_spawn不太爲人所知,比fork/exec雖然是自1999年以來標準少用?

回答

1

posix_spawn不是被廣泛實施,但您應該在無論如何都可以使用它。

  • 如果平臺沒有它,它總是可以很容易使用簡易替換,只是不叉和高管。如果一個「原生」/最優實現可用(作爲系統的一部分,或者是一個嵌入式平臺特定的實現),它將對系統造成很大影響,其中fork昂貴,甚至更多對於根本不能做fork的系統(無MMU的系統,沒有類似cygwin的Windows等)的差異。

  • 即使在系統中fork是本機和「快」,它仍然是,如果父母擁​​有大量虛擬映射的相當緩慢,這是輕度不是最佳posix_spawn即使是一個小的父母慢。看到這個微博線程的一些發現:https://twitter.com/RichFelker/status/602313644026761216

至於爲什麼它沒有更廣泛的應用/實施,它可能不被廣爲人知的混合,以及相當klunky,無償面向對象的API設計。

1

根據Linux man pages它出現在glibc的2.2版本於2000年發佈,並實現符合POSIX.1-2001與POSIX.1-2008。我希望它至少在任何至少使用這個glibc版本的平臺上得到支持,因爲它的行爲至少可以在這些平臺上使用fork + exec來模擬。

在Linux上你所期望的輕微的性能改進了fork/exec如果vfork使用的fork代替:使用了vfork創建

子進程(2)而不是fork(2)當任的以下爲真:

  • 屬性的產卵-標誌元素對象通過attrp指向包含特定GNU標誌POSIX_SPAWN_USEVFORK;或
  • file_actions是NULL和屬性的產卵-標誌元素對象指向attrp不含POSIX_SPAWN_SETSIGMASK,POSIX_SPAWN_SETSIGDEF,POSIX_SPAWN_SETSCHEDPARAM, POSIX_SPAWN_SETSCHEDULER,POSIX_SPAWN_SETPGROUP,或POSIX_SPAWN_RESETIDS。

換句話說,如果調用者請求它,或者如果在子節點exec(3)請求的文件之前沒有期望子節點的清理,則使用vfork(2)。

0
  1. 它是實現好,廣泛? (我在互聯網上看到一些帖子,它沒有在他/她的系統下定義。)

高級實時XSI選項組是可選的,因此您可以遵守POSIX,但不執行它。但是對於GNU/Linux,你可以指望現在可用。

  • 我可以期待通過在Linux中使用的posix_spawn代替叉/ EXEC任何性能改善或惡化?
  • 可能是肯定的,對於大的過程quite some time都可用於複製頁表只在exec時間被丟棄。 posix_spawn的實施例如musl's或glibc的使用vfork(2)(或直接clone(2)),以避免這種情況。對於像cygwin這樣的系統,forkemulated,成本相當可觀,posix_spawn大大降低了開銷。

  • 爲什麼的posix_spawn以下已知的,並且比叉/ EXEC雖然是自1999年以來標準較少使用?
  • 慣性,我想。