Go では、現在のプロセスを「フォーク」することで新しい子プロセスを作成できます。このプロセスにより、それぞれが独自のメモリ空間と実行スレッドを持つ 2 つの別個のプロセスが作成されます。他のプログラミング言語とは異なり、Go の標準ライブラリはプロセスをフォークする簡単な方法を提供しません。
Go プロセスをフォークするには、次のものが必要です。 syscall パッケージの syscall.ForkExec() 関数を使用します。この関数を使用すると、新しい子プロセスを作成し、その中で指定されたプログラムを実行できます。
fork() は、スレッドが普及する前に発明されたシステム コールであることに注意することが重要です。従来の意味では、fork() は親プロセスから継承した単一の実行スレッドを持つ子プロセスを作成します。ただし、Go では goroutine のスケジューリングにスレッドを使用するため、これには課題が生じます。Linux 上の
飾り気のない fork() は、fork() を呼び出したスレッドのみを親プロセスから子プロセスに転送し、他の重要なスレッドを除外します。 Go ランタイムによって使用されます。これは、通常、子プロセスが Go コードの実行を継続できないことを意味します。
Go のスレッド モデル内での fork() の制限を考慮すると、syscall を使用することをお勧めします。 .ForkExec() をすぐに実行して、子プロセスで新しいプログラムを実行します。このアプローチにより、子プロセスは親プロセスからの干渉を受けることなく独自のコードを実行できるようになります。
さらに、fork() の直接使用は、通常、子プロセスがコピーをキャプチャする非同期プロセス状態のスナップショットにのみ役立ちます。親の記憶データ。 fork() を含む他のほとんどのシナリオは、exec.Command() や os.StartProcess() などの関数によって処理される即時 exec() を暗示します。
以上がGo プロセスをフォークして PID を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。