閱讀777 返回首頁    go 阿裏雲 go 技術社區[雲棲]


複刻:為 fork 的中文翻譯定名

使用過 GitHub 的人大多知道它上麵有個“Fork”的功能,用來將某個倉庫克隆到你的賬戶之下,從而可以對其進行修改、衍生,也可以比較方便的將你的修改推回到原來的倉庫(所謂的上遊)。

隨著 GitHub 的流行,我們經常能在各種文章中見到,“fork 某某項目”等說法,是的,“fork”這個一直沒有一個正式的譯名。

其實這個問題不獨出現在 GitHub 中,fork 這個詞更早的出現在 Unix/Linux 中的 C 語言編程之中。在 Unix/Linux 的進程模型中,fork 是指進程創建自身副本的操作,它通常是一個在內核中實現的係統調用。fork 是 Unix 類係統中進程創建的主要方式(曆史上曾經是唯一的方式)。從那個時候起,fork 就一直沒有一個確定的譯名。

不過,我們認為,對於這樣的一個經常使用的專業名詞,有一個明確的譯名比較適合,雖然大家都習慣了直接用 fork 一詞。

fork 一詞在英文中的原意是“叉子”, 雖然翻譯成“分叉”、“分支”似乎也可以,但是前者較少用做動詞,後者則和 Branch 的譯名重複混淆。

據 Linux 中國翻譯組(LCTT)的譯者 dongfengweixiao 提議,可譯作“複刻”,我們認為這是一個可取的譯法,一方麵照顧到了音譯,另一方麵其釋義也形象直觀。

補充 1,“複刻”這樣的譯法,在網絡上已存在,包括中文維基中也采用該譯法,隻是並未得到公認和流行。

補充 2,據 @愛開源魅影 稱,git 軟件包裏麵,蔣新將“fork”譯為“派生”。似也可取。

既然說到這裏,順便我們對複刻fork做一個技術方麵的簡介吧。

複刻fork GitHub 倉庫

在 GitHub 上評價一個項目(倉庫)是否流行,其中一個重要指標就是其複刻fork數。

在 GitHub 上參與一個開源項目的程度有三個階段:

  • star(點讚),如果你覺得某個項目不錯,可以為其點讚(star)
  • watch(關注),如果你希望進一步關注這個項目的進展,可以關注(watch)它
  • fork(複刻),如果你還想進一步為這個項目做一些貢獻,可以複刻(fork)它到你自己的賬戶下,做出了修改之後通過 Pull-Request(PR)方式將你的改動推回給原倉庫(上遊),如果被接納就會進入到原倉庫之中

顯然,一個項目的複刻數越高,代表著貢獻者越多。

通過複刻fork + PR 的方式對開源項目進行貢獻的流程類似下圖:

我們知道 GitHub 是運行在 Git 之上的,GitHub 中的複刻fork其本質上是 Git 中的克隆clone。關於 GitHub 中的複刻的進一步介紹,可以參考“在 Github 和 Git 上 fork 之簡單指南”一文。

順便說一句,我們的 LCTT 翻譯組就是通過複刻fork + PR 的方式運作的,這也是 GitHub 上絕大多數開源項目的運作方式。

複刻fork子進程

在 Unix 下的 C 語言編程中,通過 fork() 係統調用來對進程本身進行複製,然後被複製出來的子進程就可以執行不同於父進程的操作,或通過 exec() 運行其它進程。典型的 C 代碼如下:


  1. fpid = fork();
  2. if (fpid < 0)
  3. printf("error in fork!");
  4. else if (fpid == 0) {
  5. printf("i am the child process, my process id is %d/n",getpid());
  6. } else {
  7. printf("i am the parent process, my process id is %d/n",getpid());
  8. }

所有的服務器守護進程,包括你所見到的 Web 服務、MySQL 數據庫服務等,都是通過這種方式來產生子進程來提供服務的。甚至,整個 Linux/Unix 中的進程,除了 init 進程本身之外,都是由 init 進程複刻fork出來的。關於服務器編程方麵的複刻fork的使用,可以進一步參閱“搭個 Web 服務器(三)”一文。

複刻fork炸彈

其實,不隻是 C 語言裏麵有複刻fork的功能,在 shell 裏麵也有,想必大家可能都聽說過 “fork 炸彈”,這就是利用函數的迭代執行,無限複刻fork出許多子進程,從而耗盡係統資源,導致係統崩潰的一個惡意(玩笑)用法。

複刻炸彈有很多種形式,不過最簡潔的可能就是如上圖的這個了,關於這個炸彈的具體解釋,可以參閱“經典的 Fork 炸彈解析”,在此就不贅述了。

原文發布時間為:2016-10-20

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-06-06 07:31:42

  上一篇:go  mongo複製數據庫和集合
  下一篇:go  在手機上輕鬆安裝 Ubuntu Touch OS