Go プロセスをフォークして結果のプロセスの ID を取得しようとしている開発者向け、exec または OS ライブラリなどの従来の方法のみ新しいプロセスを起動できるようになります。ただし、解決策は、syscall パッケージの syscall.ForkExec() を利用することにあります。
fork() の概念は、スレッドの使用が普及していないときに生まれたことに注意することが重要です。通常、プロセスは単一のスレッドで実行されます。対照的に、Go はゴルーチンのスケジューリングにスレッドを大きく活用します。 Linux の fork() 機能が変更されていないと、子プロセスがフォークを開始したスレッドのみを継承し、重要なランタイム スレッドが親プロセスから除外される可能性があります。
この制限は、子プロセスが Go コードを効果的に実行できないことを意味します。そのため、フォーク直後に exec(2) を呼び出すことが必須になります。 syscall.ForkExec() は、この組み合わせ操作をシームレスに促進するように設計されています。
Go での直接の fork() 呼び出しに関連する課題を考慮すると、次のような代替アプローチを評価する価値があります。ベストエフォート型の非同期プロセス状態のスナップショット。」ただし、即時 exec() 呼び出しが必要なシナリオでは、exec.Command() または同様のメソッドを利用する方が効率的であることが判明する可能性があります。
以上がsyscall.ForkExec() を使用して Go プロセスをフォークし、その ID を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。