ホームページ >バックエンド開発 >Golang >## Go C 共有ライブラリがフォークされた子プロセスのネットワーク呼び出しでハングするのはなぜですか?

## Go C 共有ライブラリがフォークされた子プロセスのネットワーク呼び出しでハングするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 11:06:02536ブラウズ

## Why Does My Go C-Shared Library Hang on Network Calls in a Forked Child Process?

Go C 共有ライブラリの問題のデバッグ: ネットワーク呼び出しでハングする

問題

http.Post() を呼び出すときに Go プログラムでハングが発生するC 共有ライブラリとしてビルドされます (-buildmode=c-shared)。ただし、標準の実行可能バイナリ (GOOS=linux GOARCH=amd64 ./example) は正しい値を返します。

問題の原因

この問題は、C 言語の実行時に Go ランタイムがロードされるために発生します。共有ライブラリは親プロセスによってロードされます。ただし、フォークされた子プロセスでライブラリが使用されると、Go ランタイムが正しくロードされず、予期しない動作や呼び出しのハングが発生します。

デバッグ手順

  • 検査strace を使用したシステム コール: strace ツールは、プロセスによって実行されているシステム コールを明らかにできます。たとえば、strace -fp PID を実行すると、futex(0x7f618b2c1cd0, FUTEX_WAKE, 1) や Post() などの futex および Post オペレーションへの呼び出しが表示される場合があります。
  • HTTP サーバーにプロファイリングを追加します: ハングしたときのプログラムの状態に関する情報を収集するには、http.ListenAndServe("localhost:6060", nil) を使用して HTTP サーバーにプロファイリングを追加します。これにより、ポート 6060 でプロファイラが実行され、これを検査してハングの原因を特定できます。

解決策

この解決策には、子内の Go ランタイムの読み込みを制御することが含まれます。プロセス。これを行うには:

  • 子プロセスがフォークされた後、dlopen を使用して Go 共有ライブラリをロードします。
  • 子プロセス内の Go ライブラリからシンボルにアクセスするには、dlsym を使用します。

Go ランタイムを子プロセスに明示的にロードすることで、ランタイムが正しく初期化され、ネットワーク呼び出しが正常に行われることが保証されます。

以上が## Go C 共有ライブラリがフォークされた子プロセスのネットワーク呼び出しでハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。