1. ホーム
  2. go

[解決済み] Goプロセスをフォークする方法を教えてください。

2022-02-11 07:20:49

質問

go プロセスをフォークして、新しいプロセスの id を取得したいのですが。 exec または os ライブラリは、新しいプロセスを開始するためのものです。

どのように解決するのですか?

あなたは、おそらく syscall.ForkExec() から syscall パッケージを使用します。

なお fork() プロセスは常に1つのスレッドで実行され、それゆえフォークしても安全でした。Goでは、ゴルーチンのスケジューリングにOSレベルのスレッドを多用するため、状況は根本的に異なります。

さて、飾り気のない fork(2) Linux では、子プロセスは単一のスレッド、つまり fork(2) その中には、Go ランタイムが使用する重要なスレッドも含まれています。 基本的に、これは単に 子プロセスが Go コードの実行を継続できることは期待できません。 で、感覚的にできることは、どうにかしてすぐに exec(2) . それが syscall.ForkExec() が使われることになっている。

そして、さらにこの問題を考えてみましょう。 最近、直接呼び出されるのは fork(2) が有用なのは、例えば、quot;best-effort asynchronous process state snapshoting"といったようなものです。 レディス を使用します。 このテクニックは、子プロセスが親プロセスから全てのメモリデータページを継承することに依存していますが、OSはコピーオンライトテクニックで全てのデータを実際にコピーしないので、子プロセスはただそこに座って全てのデータ構造をディスクに保存し、親プロセスは自分のアドレス空間でそれを変更しながらチャグチャグに動いています。 その他、考えられるすべての fork() は即座に exec() であり、それが exec.Command() などは、そのためにあるのだから、それを使えばいいのでは?