• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Linux中的fork與exec系列函數分析

    Linux中的fork與exec系列函數分析

    作者:嵌入式經驗分享 時間:2025-08-06 來源:今日頭條 收藏

    fork 和 exec 的使用體現了 UNIX 的精髓,它提供了一種非常簡單的方式來啟動新的任務。注意這里“任務”一詞的使用,我刻意避免使用“進程”或“程序”這兩個術語:

    進程是“執行引擎”,是操作系統中能夠運行程序的實體;

    程序是用于執行相同任務的特定代碼片段。

    你可以在不同的進程中運行同一個程序(例如交互式 shell)。

    fork()的功能

    考慮到這一點,fork 調用基本上會復制當前進程,幾乎在各個方面都完全相同。并非所有內容都會被復制(例如,某些實現中的資源限制),但其目的是創建盡可能接近的副本。

    fork將創建新進程(也叫子進程),子進程會獲得不同的進程 ID (PID),并將創建它的進程(父進程)的 PID 作為其父進程 PID (PPID)。雖然兩個進程運行的是同一個程序,但是它們可以通過 fork 的返回值來區分——子進程返回 0,而父進程返回子進程的 PID。當然,這一切都建立在 fork 調用成功的前提上——如果失敗,則不會創建子進程,父進程會返回錯誤碼。

    exec()的功能

    exec 調用本質上是用一個新程序替換進程中整個當前程序的方法。它會將新程序加載到當前進程空間,并從入口點運行。

    因此,fork 和 exec 通常按順序使用,以使新程序作為當前進程的子進程運行。每當你嘗試運行類似 find 的程序時,Shell 通常會執行此操作——Shell 會 fork,然后子進程將 find 程序加載到內存中,設置所有命令行參數、標準 I/O 等等。

    一些 UNIX 實現對 fork 進行了優化,使用了所謂的“寫時復制”機制。這是一種技巧,可以延遲 fork 過程中對進程空間的復制,直到程序嘗試更改該空間中的某些內容。這對于只使用 fork 而不使用 exec 的程序非常有用,因為它們不必復制整個進程空間。

    exec 調用有很多種(execl、execle、execve 等等),但此處上下文中的 exec 指的是其中任何一個。

    實例演示

    下圖演示了典型的 fork/exec 操作,其中使用 bash shell 的 ls 命令列出目錄:

    +--------+| pid=7  || ppid=4 || bash   |+--------+    |
       | calls fork
       V
    +--------+             +--------+| pid=7  |    forks    | pid=22 || ppid=4 | ----------> | ppid=7 || bash   |             | bash   |+--------+             +--------+    |                      |
       | waits for pid 22     | calls exec to run ls    |   to finish          V
       |                  +--------+    |                  | pid=22 |
       |                  | ppid=7 |
       |                  | ls     |
       V                  +--------+
    +--------+                 || pid=7  |                 | exits
    | ppid=4 | <---------------+
    | bash   |
    +--------+
       |
       | continues
       V



    關鍵詞: Linux

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 彭山县| 奉化市| 阿瓦提县| 霍州市| 凌源市| 金乡县| 南召县| 昭苏县| 青岛市| 闸北区| 宜章县| 福州市| 高平市| 江口县| 隆回县| 伊通| 舟山市| 日喀则市| 雷波县| 阿克| 横峰县| 喜德县| 尉犁县| 三河市| 玉环县| 中阳县| 遂宁市| 凤冈县| 安陆市| 涪陵区| 长乐市| 桃园市| 嘉黎县| 河津市| 金塔县| 茶陵县| 获嘉县| 石门县| 南溪县| 奇台县| 蒲城县|