포크

From Hidden Wiki
Jump to navigation Jump to search

어떠한 것에서 분기되는 것

어떠한 내용이 있을 때 그 내용을 바탕으로 다른 내용을 만들어 분기하는 것을 말한다. 이 경우에 라이선스 등만 지켜지면 포크하는데 문제는 없다. 오픈 라이선스 같은 자료의 이용을 허용하는 형태이기에 가능한 것. 게다가 기존 라이센스와 호환된다면 대체 라이선스를 사용해도 된다! 또한, 이렇기 때문에 오픈 소스 프로젝트는 fork되어서 다양하게 분화하는 것이 가능하다. 예를 들어서, 커뮤니티에서 특화된 기능이 필요한 경우 기존 프로젝트를 포크하여 필요한 부분을 수정하는 것이 가능하다. 혹은 기존 프로젝트가 진행과정이 부진하거나 문제를 일으켰을 때도 이에 대한 반발로 새로운 프로젝트를 꾸리는 경우에도 포크를 사용한다. 오라클의 정책에 반발하여 오픈오피스에서 리브레오피스로 갈라져 나오거나, 하트블리드 사태 이후에 OpenBSD 커뮤니티에서 OpenSSL을 좀 더 보안성이 높은 구조와 가이드라인으로 바꾸는 LibreSSL이 갈라져 나오기도 했던 것이 그 예이다. 이렇게 포크가 가능한 구조는 오픈소스 커뮤니티의 다양성의 원동력이기도 하지만 반대로 파편화 문제를 일으키는 원인이기도 하다.

중국어로는, 소프트웨어에서 쓰이는 포크를 가리킬 때는, 포크(Fork)와 발음이 비슷한 복각(复刻/fu ke)으로 표기한다.[* [[1]] ] 복각판 할 때 그 복각이다.

본 위키 나무위키오리위키리그베다 위키에서 파생하여 탄생하였다.[* 리브레위키는 리그베다 위키 DB를 사용하지 않고 백지에서 시작하여서 포크에 해당하지 않는다.] 이외의 예로 오픈오피스에서 파생된 리브레오피스[* 이 사례가 본 나무위키와 옆동네 리브레 위키의 설립 과정과 매우 많이 닮아 있다. 심지어 리브레 위키는 포크가 아님에도 압도적인 지지를 받아 이 명칭을 채택했을 정도로, 사실 스페인어 위키백과의 사용자들이 새로 만든 엔시클로페디아 리브레 우니베르살 엔 에스파뇰과 닮았다. 다만 공식적으로 리브레오피스와의 연관성은 불명이다.], MySQL에서 파생된 MariaDB, WebKit에서 파생된 블링크, 위키트래블에서 파생된 위키여행 등이 있다.


예시

"원본 -> 포크" 순이며, abc 가나다 순이다.

* MySQL -> MariaDB
* b2/cafelog -> 워드프레스
* Ethereum -> Ethereum Classic
* OpenSSL -> LibreSSL
* 나무위키 -> 바다위키
* 나무위키 -> 우만위키
* 레드햇 엔터프라이즈 리눅스 -> CentOS
* 리그베다 위키 -> 나무위키
* 리그베다 위키 -> 오리위키[* 오리위키의 경우, 나무위키의 갱신사항도 가져와서 반영했다.]
* 비트코인 -> 비트코인 캐시
* 비트코인 -> 비트코인 골드
* 오픈오피스 -> 리브레오피스
* WebKit 1.0 -> 블링크
* 위키트래블 -> 위키여행


유닉스의 함수 Fork()

{{{#!html

<span style="color: #333399; font-weight: bold">int</span> <span style="color: #0066BB; font-weight: bold">main</span>(<span style="color: #333399; font-weight: bold">void</span>)
{
	<span style="color: #333399; font-weight: bold">int</span> pid;
	pid<span style="color: #333333">=</span>fork();
	<span style="color: #008800; font-weight: bold">if</span>(pid<span style="color: #333333">==</span><span style="color: #0000DD; font-weight: bold">0</span>)
		ChildProcess();
	<span style="color: #008800; font-weight: bold">else</span>
		ParentProcess();
	<span style="color: #008800; font-weight: bold">return</span> <span style="color: #0000DD; font-weight: bold">0</span>;
}

}}}

프로세스의 생성을 위한 시스템 호출 함수중 하나로, 현재 수행중인 프로세스와 동일한 일을 수행하는 프로세스를 복제한다. 쓰레드랑 다르게 전역 변수를 공유하지 않는다. 단, shared memory같은 경우로 프로세스 간에 변수 공유도 가능하다. 복제 대상을 부모 프로세스, 그 결과물을 자식 프로세스라고 한다. 이때 fork()함수의 반환값에서 부모와 자식을 구별할 수 있는데, 자식은 0을 반환받고 부모는 자식의 PID(프로세스 ID)를 반환받는다. 만약 -1이 반환 되었다면 fork() 함수가 실패한 경우다.

다른 명령을 수행하기 위해서 exec같은 추가적인 코드가 수행되곤 한다. 한 프로세스에서 무한히 생성하다간 시스템에 프로세스의 정보를 저장하는 공간이 바닥나 시스템에 장애를 일으키므로~~암세포~~ 대개 OS차원에서 수를 제한한다. 이걸 악용한 공격방법이 있는데 fork bomb이라 한다.

윈도우에는 이 fork 함수가 없다. 유닉스, 리눅스 시스템용 코드를 윈도우로 옮길 때, 가장 애 먹는 부분중의 하나. CreateProcess 함수로 다 바꿔주어야 한다.


관련 문서