ELF 執行者

ELF 執行元件是負責啟動 元件 根據標準可執行檔 (ELF) 格式)。這是內建的執行程式,所有元件皆可使用。

使用 ELF Runner

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

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

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

欄位

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

引數

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

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

轉送 stdout 和 stderr 串流

ELF 元件的 stdout 和 stderr 串流可以轉送至 LogSink 服務。根據預設,ELF 執行程式只會在元件可使用 LogSink 時轉送這些串流。如果您的元件輸出 請將診斷訊息轉傳到上述任一串流,請將這些串流轉寄給對方 LogSink 服務

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

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

加入這個區塊後,所有寫入 stdout 的內容都會記錄為 INFO 訊息,而所有寫入 stderr 的內容都會記錄為 WARN 訊息。訊息會以換行符號分割,並解碼為 UTF-8 字串。轉換的位元組序列無效 給 U+FFFD 替換字元,通常看起來像是

無論是否包含 syslog 區塊,這項功能都可以透過明確的標記停用:

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

生命週期

元件有生命週期。如果您在元件資訊清單中加入 lifecycle 屬性,由 ELF 執行器執行的元件就能與生命週期整合。目前 stop 是生命週期通訊協定中唯一的方法。

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

程式應將控制代碼用於生命週期管道,並 該管道的生命週期通訊協定。元件應在收到並處理 stop 呼叫後退出。

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

安全性

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

重要的主要程序

main_process_critical 欄位可用於將元件的首個程序標示為「對元件管理員的工作至關重要」,如果程序以非零的程式碼退出,就會導致元件管理員 (以及所有元件) 終止。這會強制系統觸發強制重新啟動。

環境 VMO 執行人員

ambient_mark_vmo_exec 欄位可用於讓元件的第一次程序使用 zx_vmo_replace_as_executable,其中 ZX_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_SHARED 標記 呼叫 zx_process_create 時。只有在元件也將 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"
    }
}

環境變數

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

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

其他資訊

如需程序建立方式的詳細說明,請參閱 Zircon 程式載入和動態連結