6

Pypy でサンドボックス化されたサブプロセスが、限定されたプロトコルを使用して親プロセスと通信できるようにしようとしています。

pypy/pypy/translator/sandbox/sandlib.pyPypy に含まれている のソース コードを確認したところ、ソケットを開く呼び出しをVirtualizedSocketProc許可するがあるようです。os.openコードの一部の機能を変更しました (たとえば、限られたポートで TCP 接続を許可するなど)。ただし、ほとんど変更されていません。ただし、コードのインタープリターレベルの部分にあると思われるsocket存在しないモジュールが必要なため、Pypy のモジュールを実際にインポートすることはできません。_socket

私がやろうとしていることは実現可能ですか?もしそうなら、ソケットモジュールをインポートするにはどうすればよいですか? そうでない場合、他に何ができますか?

4

1 に答える 1

4

これをさらに調査したところ、これはかなり根本的な問題のようです。socketライブラリ レベル (ディレクトリ内) で実装されたモジュールは、基本lib的にライブラリの空のシェルであり_socket、ディレクトリで定義されたインタープリター レベルのモジュールですpypy/module。PyPy に慣れていない方のために説明すると、インポートできるモジュールには 2 つのタイプがあり、CPython の純粋な Python ライブラリと C ライブラリにほぼ対応しています。ライブラリ レベルで実装されたモジュールは、サンドボックスに簡単に含めることができ、実際には「既定の」pypy_interactサンドボックスに含まれています。ただし、インタープリター レベルで記述されたモジュールは、サンドボックス内では使用できません。

この決定的な違いのために、私のアプローチは資金面で欠陥があったようです。代わりに、同じ問題が発生した場合に考慮できる他のオプションがいくつかあります。

  1. os.openで始まるファイル名で直接使用しますtcp://。これは実際には非常にうまく機能し、私のお気に入りのアプローチです。
  2. socket独自のライブラリを実装します。これは確かに好ましくありませんが、ソケット機能をラップする上記のように、サンドボックス コントローラーと単純に通信する比較的空のソケット ライブラリを作成することは可能だと思います。これを実現するために、デフォルトのソケット ライブラリを変更することも可能です(たとえば、 を含めず_socketに)。
于 2011-07-14T21:48:28.807 に答える