[解決済み] Goプロセスをフォークする方法を教えてください。
質問
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()
などは、そのためにあるのだから、それを使えばいいのでは?
関連
-
[解決済み] Goで構造体のフィールドを反復処理する
-
[解決済み] goでローカルパッケージをインポートするには?
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Goでint値をstringに変換する方法は?
-
[解決済み】C言語の三項演算子に相当するGoの慣用句は何ですか?
-
[解決済み】go getでインストールしたパッケージの削除について
-
[解決済み】親プロセスが終了した後に子プロセスを終了させる方法は?
-
[解決済み】fork()、vfork()、exec()、clone()の違いについて)
-
[解決済み】チャンネルを開いたままにしておいてもいいのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み] Go パッケージは log.Fatal を使うべきですか、そしてそれはいつですか?
-
[解決済み] キューの実装はありますか?
-
[解決済み] SETNXでシングルインスタンスのRedisをロックする
-
[解決済み] go getコマンドとgo mod downloadコマンドの違いは何ですか?
-
[解決済み] Goでfloat64をintに変換する
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
eclipse+goclipseプラグイン+gdbによるgo言語開発デバッグ環境の構築 ---最終起動シーケンスでのエラー MIコマンドの実行に失敗しました。
-
[解決済み】go getでインストールしたパッケージの削除について
-
[解決済み】GoはREPLを提供しますか?