亚马逊网站做外贸,建设银行官网首页网站南山片区,宜宾网站制作,网站开发者技术网站使用过 GitHub 的人大多知道它上面有个“Fork”的功能#xff0c;用来将某个仓库克隆到你的账户之下#xff0c;从而可以对其进行修改、衍生#xff0c;也可以比较方便的将你的修改推回到原来的仓库#xff08;所谓的上游#xff09;。
随着 GitHub 的流行#xff0c;我…使用过 GitHub 的人大多知道它上面有个“Fork”的功能用来将某个仓库克隆到你的账户之下从而可以对其进行修改、衍生也可以比较方便的将你的修改推回到原来的仓库所谓的上游。
随着 GitHub 的流行我们经常能在各种文章中见到“fork 某某项目”等说法是的“fork”这个一直没有一个正式的译名。
其实这个问题不独出现在 GitHub 中fork 这个词更早的出现在 Unix/Linux 中的 C 语言编程之中。在 Unix/Linux 的进程模型中fork 是指进程创建自身副本的操作它通常是一个在内核中实现的系统调用。fork 是 Unix 类系统中进程创建的主要方式历史上曾经是唯一的方式。从那个时候起fork 就一直没有一个确定的译名。
不过我们认为对于这样的一个经常使用的专业名词有一个明确的译名比较适合虽然大家都习惯了直接用 fork 一词。
fork 一词在英文中的原意是“叉子” 虽然翻译成“分叉”、“分支”似乎也可以但是前者较少用做动词后者则和 Branch 的译名重复混淆。
据 Linux 中国翻译组LCTT的译者 dongfengweixiao 提议可译作“复刻”我们认为这是一个可取的译法一方面照顾到了音译另一方面其释义也形象直观。
既然说到这里顺便我们对复刻做一个技术方面的简介吧。
复刻 GitHub 仓库
在 GitHub 上评价一个项目仓库是否流行其中一个重要指标就是其复刻数。 在 GitHub 上参与一个开源项目的程度有三个阶段 star点赞如果你觉得某个项目不错可以为其点赞starwatch关注如果你希望进一步关注这个项目的进展可以关注watch它fork复刻如果你还想进一步为这个项目做一些贡献可以复刻fork它到你自己的账户下做出了修改之后通过 Pull-RequestPR方式将你的改动推回给原仓库上游如果被接纳就会进入到原仓库之中 显然一个项目的复刻数越高代表着贡献者越多。
通过复刻 PR 的方式对开源项目进行贡献的流程类似下图 我们知道 GitHub 是运行在 Git 之上的GitHub 中的复刻fork其本质上是 Git 中的克隆clone。关于 GitHub 中的复刻的进一步介绍可以参考“在 Github 和 Git 上 fork 之简单指南”一文。
顺便说一句我们的 LCTT 翻译组就是通过复刻fork PR 的方式运作的这也是 GitHub 上绝大多数开源项目的运作方式。
复刻子进程
在 Unix 下的 C 语言编程中通过 fork() 系统调用来对进程本身进行复制然后被复制出来的子进程就可以执行不同于父进程的操作或通过 exec() 运行其它进程。典型的 C 代码如下
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());
} else { printf(i am the parent process, my process id is %d/n,getpid());
}
所有的服务器守护进程包括你所见到的 Web 服务、MySQL 数据库服务等都是通过这种方式来产生子进程来提供服务的。甚至整个 Linux/Unix 中的进程除了 init 进程本身之外都是由 init 进程复刻fork出来的。关于服务器编程方面的复刻fork的使用可以进一步参阅“搭个 Web 服务器三”一文。
复刻炸弹
其实不只是 C 语言里面有复刻fork的功能在 shell 里面也有想必大家可能都听说过 “fork 炸弹”这就是利用函数的迭代执行无限复刻fork出许多子进程从而耗尽系统资源导致系统崩溃的一个恶意玩笑用法。 复刻炸弹有很多种形式不过最简洁的可能就是如上图的这个了关于这个炸弹的具体解释可以参阅“经典的 Fork 炸弹解析”在此就不赘述了。
如果你对 fork 的翻译有不同的意见欢迎留言评论。