2016-04-10 8 views
4

私が立ち上げた私の子プロセスから、ある接頭辞でファイル名を傍受できるようにしたい。これは "pipe:// pipe_name"のような名前になります。私はopen()システムコールをラップすることは私のアプリケーションでこれを行う良い方法だろうと思っていますが、で実行したいのですが、別の共有ライブラリをコンパイルしてLD_PRELOADトリックでフックするforkを呼び出す前にシステム関数を無効にすることはできますか?

私は自分自身でプロセスをフォークしていますが、open()をフォークする前に私自身の関数にリダイレクトしてexec()の後で子プロセスを持続させる方法がありますか?

編集:これの背後にある考え方は、中間のプロセスtee()を使用して複数のリーダーパイプを実装し、あるパイプから他のすべてのパイプにデータを送りたいということです。私はのようにこれは私の子プロセスに透過的であるため、ファイル名とopen()を取ることができ、パイプの場合はファイル記述子を返します。ファイル、私はそれを通常のopen()関数に渡します。子プロセスに透過的にするこれを行う他の方法は、聞くのが面白いでしょう。あらかじめリンクされていなければならない別のライブラリをコンパイルする必要はありません。

+0

実行しているプロセスを制御できますか?意味はあなたのコードですか? – hek2mgl

+0

理論的にはそうですが、バイナリで使える解決策が欲しいです... –

+1

LD_PRELOADのトリックがなければ、それは可能ではないと思います。それを使用すると正常に動作するはずです。 – hek2mgl

答えて

0

ここの答えはいいえ、それは不可能だと私は信じています。

  1. LD_PRELOADトリック、FUSEファイルシステムを実装するシステムコール
  2. をオーバーライドして、クライアントにそれにパスを渡すためにプリロードされていますの.soをコンパイルします。私の知る限りでは、これを達成するための唯一の3つの方法がありますプログラム、インターセプトコール。
  3. PTRACEを使用してシステムコールを傍受し、必要に応じて修正します。彼らはすべてのI/O呼び出しをインターセプトし、それを処理するために戻ってユーザ空間へを交換する必要がありますよう

2と3は非常に遅くなります。おそらく通常よりも500%遅いでしょう。 1は、外部共有ライブラリをビルドしてリンクすることを必要とします。

私のアプリケーションでは、パイプへのパスを渡したいと思っていますが、自分のプロセスで両端を開くことができます/ proc // fdの読み込み先のパスを取得し、というパスでクライアントプログラムに渡すと、私には必要なものすべてが与えられます。

関連する問題