ELF 執行者

這是內建的執行元件,適用於所有元件。

使用 ELF Runner

如要使用 ELF 執行元件,元件的資訊清單必須包含 program 區塊,其中包含:

{
    program: {
        runner: "elf",
        binary: "bin/foo",
    }
}

  • 包含設為 elf 字串的 runner 欄位。
  • binary 欄位的值設為元件套件中的二進位輸出名稱。

欄位

此外,ELF 執行元件接受一組選用欄位,來設定 ELF 元件的執行階段環境。

引數

引數 (在大部分程式設計語言中為 argv) 可使用 args 欄位傳遞至元件的程序。這個欄位接受字串向量 (請參閱以下範例)。引數集的傳遞順序會與資訊清單中宣告的順序相同。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        args: ["--verbose", "--debug"]
    }
}

轉送 stdout 和 stderr 串流

ELF 元件的 stdout 和 stderr 串流可轉送至 LogSink 服務。根據預設,只有在元件可以使用 LogSink 時,ELF 執行元件才會轉寄這些串流。如果您的元件會輸出診斷訊息至其中一個串流,請將串流轉送至 LogSink 服務

如要啟用這項功能,請在資訊清單檔案中新增以下內容:

{
    include: [ "syslog/client.shard.cml" ],
}

加入這個資料分割後,所有傳送至 stdout 的寫入都會以 INFO 訊息的形式記錄,而對 stderr 的所有寫入作業都會記錄為 WARN 訊息。訊息會逐行分割,並以 UTF-8 字串解碼。無效的位元組序列會轉換為 U+FFFD 取代字元,格式為

無論是否包含系統記錄檔資料分割,您都可以使用明確標記停用這項功能:

    program: {
        runner: "elf",
        binary: "bin/foo",
        forward_stdout_to: "none",
        forward_stderr_to: "none",
    }

生命週期

元件具有lifecycle。如果您將 lifecycle 屬性新增至元件資訊清單,則 ELF 執行元件執行的元件可與生命週期整合。目前,stop 是生命週期通訊協定中的唯一方法。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        lifecycle: { stop_event: "notify" },
    }
}

程式應處理生命週期通道,並提供該管道上的生命週期通訊協定。系統應在接收及處理 stop 呼叫後關閉元件。

ELF Runner 會監控針對元件的程式二進位檔啟動的程序。如果這項程序結束,ELF 執行元件會終止元件的執行環境,包括元件的工作和所有子程序。

安全性

有多個特殊權限欄位受到許可清單管制。只有這個許可清單中的元件可以使用這些欄位。對於所有欄位,這項政策都會套用至元件中的第一個程序。第一個程序是由 ELF 執行元件針對 program 區塊中宣告的二進位檔建立。所有欄位都是布林值,預設為 false

主要處理程序

main_process_critical 欄位可用來將元件的第一個程序標示為 對元件管理員的工作至關重要,這會導致元件管理員 (及所有元件) 在程序結束時終止。這會強制系統觸發強制重新啟動。

環境 VMO 執行

ambient_mark_vmo_exec 欄位可用於允許元件的第一個程序,將 zx_vmo_replace_as_executableZX_HANDLE_INVALID 搭配使用做為第二個引數,而非使用以 ZX_RSRC_SYSTEM_VMEX_BASE 為底的有效 ZX_RSRC_KIND_SYSTEM

建立原始程序

job_policy_create_raw_processes 欄位可用於允許元件使用 zx_process_create 建立程序。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true"
    }
}

共用程序

is_shared_process 欄位可能會在呼叫 zx_process_create 時用於傳遞 ZX_PROCESS_SHARED 標記。只有在元件也將 job_policy_create_raw_processes 設為 true 時,才能使用此旗標。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true",
        is_shared_process: "true"
    }
}

具有可用例外狀況管道的工作

job_with_available_exception_channel 欄位可用來確保元件是在建立為工作的直接子系中建立,且該工作將提供例外狀況管道。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_with_available_exception_channel: "true"
    }
}

其他資訊

如要深入瞭解程序的建立方式,請參閱「Zircon 程式載入和動態連結」一文。

環境變數

您可以使用 environ 屬性為 ELF 元件設定環境變數。這個欄位必須是字串向量,其中每個字串都包含變數和值,並以等號分隔。舉例來說,下列程式碼範例會將 FAVORITE_ANIMALFAVORITE_COLOR 變數宣告為 catred

{
    program: {
        runner: "elf",
        binary: "bin/echo",
        environ: [
            "FAVORITE_ANIMAL=cat",
            "FAVORITE_COLOR=red",
        ]
    }
}