質問:
Go プロセスをフォークして新しい ID を取得する方法プロセスID?
答え:
Go プロセスをフォークして新しいプロセスの ID を取得するには、syscall.ForkExec() 関数を使用できます。システムコールパッケージ。
Go ライブラリの fork() 関数はニーズを満たすことができないことに注意してください。
fork() 関数が最初に発明されたとき、スレッドは使用されず、プロセスには常に 1 つの実行スレッドしかなかったので、フォークは安全でした。ただし、Go はゴルーチンのスケジューリングを駆動するためにオペレーティング システム レベルのスレッドを多用しているため、状況は根本的に変わります。
Linux 上の装飾されていない fork(2) は、子プロセスに親プロセスの fork(2) を呼び出す 1 つのスレッドのみを持たせるようになりましたが、Go ランタイムによって使用されるすべてのスレッド (一部の重要なスレッドを含む) はそうではなくなりました。その中で。基本的に、これは、子プロセスが Go コードの実行を継続することは期待できず、合理的に実行できる唯一のことは exec(2) をすぐに実行することであることを意味します。これが syscall.ForkExec() の使用目的であることに注意してください。
ここでさらに詳しく考えてみましょう。 fork(2) を直接呼び出すために現時点で役立つのは、Redis で使用されているような「ベスト エフォート型の非同期プロセス状態スナップショット」だけだと思います。この手法は、子プロセスが親プロセスのすべてのメモリ データ ページを継承するという事実に依存していますが、オペレーティング システムは実際にすべてのデータをコピーせずにコピー オン ライト手法を使用するため、子プロセスはそこで停止してすべてのデータを保存できます。親プロセスが独自のアドレス空間内のデータを変更している間に、構造体をディスクにコピーします。また、他の fork() の使用法は即時 exec() を意味します。これが exec.Command() のような関数の目的です。では、なぜ fork() を使用するのでしょうか?
以上がGo プロセスをフォークして PID を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。