<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://wiki.taigi.ima.org.tw/w/index.php?action=history&amp;feed=atom&amp;title=Fork%28%E7%B3%BB%E7%B5%B1%E5%91%BC%E5%8F%AB%29</id>
	<title>Fork(系統呼叫) - 修訂紀錄</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.taigi.ima.org.tw/w/index.php?action=history&amp;feed=atom&amp;title=Fork%28%E7%B3%BB%E7%B5%B1%E5%91%BC%E5%8F%AB%29"/>
	<link rel="alternate" type="text/html" href="https://wiki.taigi.ima.org.tw/w/index.php?title=Fork(%E7%B3%BB%E7%B5%B1%E5%91%BC%E5%8F%AB)&amp;action=history"/>
	<updated>2026-04-09T14:23:23Z</updated>
	<subtitle>本 wiki 上此頁面的修訂紀錄</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.taigi.ima.org.tw/w/index.php?title=Fork(%E7%B3%BB%E7%B5%B1%E5%91%BC%E5%8F%AB)&amp;diff=443074&amp;oldid=prev</id>
		<title>TaiwanTonguesApiRobot：​從 JSON 檔案批量匯入</title>
		<link rel="alternate" type="text/html" href="https://wiki.taigi.ima.org.tw/w/index.php?title=Fork(%E7%B3%BB%E7%B5%B1%E5%91%BC%E5%8F%AB)&amp;diff=443074&amp;oldid=prev"/>
		<updated>2025-08-22T23:24:24Z</updated>

		<summary type="html">&lt;p&gt;從 JSON 檔案批量匯入&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;佇咧電腦領域內底，尤其是 Unix 佮類 Unix 系統作業系統當中，&amp;#039;&amp;#039;&amp;#039;fork&amp;#039;&amp;#039;&amp;#039;（行程複製）是一款的建立家己程副本的操作。伊通常是核心實現的一種系統呼叫。Fork 是類 Unix 作業系統上建立行程的一種主要方法，甚至歷史上是唯一方法。&lt;br /&gt;
&lt;br /&gt;
==概述==&lt;br /&gt;
&lt;br /&gt;
佇咧加工作業系統內底，行程（執行的程式）需要一種方法來建立新行程，譬如講執行其他程式。Fork 佮其變種佇類 Unix 系統中通常是按呢做的唯一方式。若行程需要啟動另外一个程式的會當執行檔，伊需要先 Fork 來建立一个自身的副本。然後由著副本即「子行程」搧叫 exec 系統呼叫，用其他的程式崁佇家己：停止執行家己進前的程式並執行其他的程式。&lt;br /&gt;
&lt;br /&gt;
Fork 操作會做子行程建立一个單獨的定址空間。子行程有父行程所有記憶體段的精確副本。佇現代的 UNIX 變種內底，這遵循出自 SunOS 抹四配零的虛擬記持體模型，根據寫入時陣複製語意，實體記持體無需要予實際複製。取代之的是，兩个行程的虛擬記持體頁面可能指向實體記持體中的仝一个頁，直到𪜶寫入這个頁面，寫入去才會發生。咧用 fork 配合 exec 來執行新程式的情況下，此最佳化誠重要。通常來講，子行程佇停止程式執行進前會執行一小組有利用其他程式的操作，伊可能用著少量的其實行程的資料結構。&lt;br /&gt;
&lt;br /&gt;
做一个行程呼叫 fork 時，伊予人認為是父行程，新建立的行程是伊的囡仔（子行程）。 佇咧 fork 了後，兩个行程閣執行著仝款的程式，攏親像呼叫著該系統呼叫一般恢復執行。然後𪜶會當檢查呼叫的返回值確定其狀態：是父行程抑是子行程，猶閣有根據這个行事。&lt;br /&gt;
&lt;br /&gt;
fork 系統呼叫佇頭一个版本的 Unix 就已經存在矣，伊借用佇閣較早的 GENIE 分時系統。Fork 是標準化的 POSIX 的一部份。&lt;br /&gt;
&lt;br /&gt;
==通批==&lt;br /&gt;
&lt;br /&gt;
子行程對父行程的檔案描述子副本開始。對行程間通訊，父行程通常會建立一个抑是幾若个管道，佇咧 fork 行程了後，行程關起來𪜶無需要的管道捀。&lt;br /&gt;
&lt;br /&gt;
==反種==&lt;br /&gt;
&lt;br /&gt;
===Vfork===&lt;br /&gt;
&lt;br /&gt;
Vfork 是佮 fork 具有仝款呼呼的約定和誠濟仝款語意的一个變種，毋過干焦會當佇有限的情形下使用伊。伊是起佇咧 Unix 的三 BSD 版本，這是頭一个支援虛擬記憶體的 Unix 版本。伊已經揤 POSIX 標準化，這會使 vfork 人具有佮 fork 完全仝款的行為。但是這已經佇二空空四年的版本中被標為過時，並佇咧後續的版本內底予人 posix \ _ spawn ( ) 取代（其通常通過 vfork 實現）。&lt;br /&gt;
&lt;br /&gt;
咧發出一个 vfork 系統呼叫時，爸行程被暫停，行程完成執行抑是予新的會當執行影像取代（通過系統呼叫之「exec」家族內底的一項）。 子行程借用爸行程的 MMU 設定佮記持體頁面，佇爸行程佮子行程之間共享，無進行複製，尤其是無寫入時陣複製語意；所以，若是子行程在任何共享頁面中進行修改，袂建立新的頁面，並且修改的頁面對父行程平平可見。因為無頁面複製（消耗另外的記持體）， 此技術佇咧純複製環境使用 exec 時候比較一般 fork 閣較最佳化。佇咧 POSIX 中，除非講將隨呼叫 exec 家族（猶閣有其他幾若个操作）的函式，其他任何的目的會致使未定義行為。使用 vfork 時，子行程借用毋是複製資料結構，所以乎 vfork 猶原比使用寫時複製語意的 fork 較緊咧。&lt;br /&gt;
&lt;br /&gt;
System V 佇咧 System VR 四予人引入前不支援此系統函式，因為伊的記持體共享較會出來：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; _ Vfork _ does not copy page tables so it is faster than the System V _ fork _ implementation . But the child process executes in the same physical address space as the parent process ( until an _ exec _ or _ exit _ ) and can thus overwrite the parent&amp;#039;s data and stack . A dangerous situation could arise if a programmer uses _ vfork _ incorrectly , so the onus for calling _ vfork _ lies with the programmer . The difference between the System V approach and the BSD approach is philosophical : Should the kernel hide idiosyncrasies of its implementation from users , or should it allow sophisticated users the opportunity to take advantage of the implementation to do a logical function more efficiently ?&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
仝款，Linux 著 vfork 的手冊頁面強烈無鼓勵伊的使用：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; It is rather unfortunate that Linux revived this specter from the past . The BSD man page states : &amp;quot; This system call will be eliminated when proper system sharing mechanisms are implemented . Users should not depend on the memory sharing semantics of vfork ( ) as it will , in that case , be made synonymous to fork ( 二 ) . &amp;quot;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 vfork 的其他問題包括死結，伊可能發生佇多執行程式內底，因為佮動態連結互動。做為 vfork 介面的替代品，POSIX 引入來 posix \ _ spawn 函式家族，伊結合矣 fork 和 exec 的動作。遮的函式會當實現為 fork 的程式庫定式，就親像 Linux 彼款的，抑是為著閣較好的效能實現為 vfork，就親像 Solaris 彼款的。猶毋過，POSIX 規範中註明伊是「為核心操作設計」，尤其是用佇執行咧受限硬體佮即時系統上的作業系統。&lt;br /&gt;
&lt;br /&gt;
雖然四配四 BSD 的實現中排脫去矣 vfork 的實現，使 vfork 做甲佮 fork 仝款的行為，伊佇咧 NetBSD 作業系統當中有效能原因恢復。&lt;br /&gt;
&lt;br /&gt;
一寡躉入式的作業系統（比如講 uClinux）省略 fork 並且實現 vfork，因為𪜶需要佇欠缺記持體管理單元（MMU）無可能來實現寫時複製的裝置操作。&lt;br /&gt;
&lt;br /&gt;
===Rfork===&lt;br /&gt;
&lt;br /&gt;
Plan 九作業系統由 Unix 的設計者創造，包括講 fork，但是嘛有一个叫做「rfork」來變種，伊允准父行程佮子行程之間資源的幼粒仔度共享，包括定址空間（除了呼叫棧段，彼是每一个行程獨有的）、 環境變數和檔案系統號名空間；這就是使伊成做建立行程佮其中的執行緒的一个統一介面。佇咧 FreeBSD 和 IRIX 著採用矣來自 Plan 九的 rfork，後者共更號做「sproc」。&lt;br /&gt;
&lt;br /&gt;
===Clone===&lt;br /&gt;
&lt;br /&gt;
「 clone」（克隆）是 Linux 核心中的一个系統呼叫，伊建立一个會當佮其爸共享「執行上下文」的子行程。類似 FreeBSD 的 rfork 和 IRIX 的 sproc，Linux 的 clone 受著矣 Plan 九的 rfork 啟發，而且用佇實現執行緒（就算應用程式的程式設計師通常使用閣較進階的介面，比如講 pthreads，實現此時 clone 的頂層）。 出自 Plan 九和 IRIX 的「separate stacks」（單獨堆疊）特性已經予人省略，因為其實致使傷濟開銷（根據 Linus Torvalds）。&lt;br /&gt;
&lt;br /&gt;
==其他作業系統內面的 Fork==&lt;br /&gt;
&lt;br /&gt;
佇咧 VMS 作業系統（一九七七年）的原始設計中，新行程根據當前一寡特定位址進行複製來建立予人認為是有風險的。當前行程當中的錯誤狀態可能去予人複製予子行程。按呢佇遮使用矣行程「生卵」（spawning）之隱喻：新行程的每一个組件的記持體布局攏是重新建立的。spawn 後來予微軟的作業系統採用（一九九三年）。&lt;br /&gt;
&lt;br /&gt;
VM / CMS（OpenExtensions）的 POSIX 相容組件提供一个非常有限的 fork 實現，其中的爸行程佇子行程執行的時予暫停，並且子和父共享同一定址空間。這本質上是一个名 fork 的 vfork。（注意，這隻有合用著 CMS 客戶機作業系統，其他 VM 客戶機作業系統如 Linux 提供標準的 fork 功能。）&lt;br /&gt;
&lt;br /&gt;
==應用程式範例==&lt;br /&gt;
&lt;br /&gt;
下列 Hello World 程式的變種以 C 語言展示矣 fork 系統呼叫的機理。該程式 fork 為兩个行程，逐个攏因為 fork 系統呼叫的返回值決定𪜶執行啥物功能。平板代碼中的標頭檔等已經被省略。&lt;br /&gt;
&lt;br /&gt;
下跤是該該是的程式的解析：&lt;br /&gt;
&lt;br /&gt;
咻叫中的第一句是呼叫 fork 系統呼叫來分割執行為兩个行程。fork 的倒轉去值予人記錄佇類型做 pid \ _ t 的變數中間，其中是 POSIX 類型的行程識別碼（PID）。&lt;br /&gt;
&lt;br /&gt;
佇咧電腦領域，尤其是 Unix 佮類 Unix 系統作業系統當中，&amp;#039;&amp;#039;&amp;#039;fork&amp;#039;&amp;#039;&amp;#039;是一款的建立家己程副本的操作。伊通常是核心實現的一種系統呼叫。Fork 是咧類 Unix 作業系統上建立行程的一種主要方法，甚至歷史上捌是唯一方法。&lt;br /&gt;
&lt;br /&gt;
鋪一錯誤表示 fork 脫箠：無新的行程予人建立。因此愛印出一條錯誤訊息。&lt;br /&gt;
&lt;br /&gt;
若是 fork 成功，遮爾仔這馬有兩个行程。兩个攏對 fork 返回的時開始執行 main 函式。為著使行程執行無仝款的任務，程式著愛基於 fork 的返回值決定其做為子行程抑是父行程執行某一个分支。&lt;br /&gt;
&lt;br /&gt;
Fork 操作會做子行程建立一个單獨的定址空間。子行程有父行程所有記憶體段的精確副本。佇現代的 UNIX 變種內底，這遵循出自 SunOS 抹四配零的虛擬記持體模型，根據寫入時陣複製語意，實體記持體無需要予實際複製。取代之的是，兩个行程的虛擬記持體頁面可能指向實體記持體中的仝一个頁，直至𪜶寫入這个頁面，寫入去才會發生。咧用 fork 配合 exec 來執行新程式的情況下，此最佳化誠重要。通常，子行程佇停止程式執行進前會執行一小組有利用其他程式的操作，伊可能用著少量的其實行程的資料結構。&lt;br /&gt;
&lt;br /&gt;
其他的行程—— 即父行程，會收著 fork 傳來的子行程的行程識別碼，其實是一个正數。老爸的行程來共這个識別碼傳達予 waitpid 系統呼叫來暫停執行，到甲子行程登出。彼此情形發生了後，父行程繼續執行並按 return 語句的含義登出。&lt;br /&gt;
&lt;br /&gt;
==參見==&lt;br /&gt;
&lt;br /&gt;
* fork 炸彈&lt;br /&gt;
* Fork–exec&lt;br /&gt;
* Exit&lt;br /&gt;
* Wait&lt;br /&gt;
&lt;br /&gt;
==參考資料==&lt;br /&gt;
&lt;br /&gt;
[[分類: 待校正]]&lt;/div&gt;</summary>
		<author><name>TaiwanTonguesApiRobot</name></author>
	</entry>
</feed>