プロセスのファイルI / O操作をメモリまたは他のファイルにリダイレクトするにはどうすればよいですか?

プロセスのファイルI / O操作をメモリまたは他のファイルにリダイレクトするにはどうすればよいですか?

次のようなファイルがあるとしましょう。ファイル.txtそして走る処理PID 12345ファイルを読み取る場合もあり、書き込む場合もあります。

  1. このプロセスを欺く方法はありますか?PID 12345読み書きしようとするたびに、他のプロセスによって割り当てられたメモリを読み書きします。ファイル.txt

  2. 他のファイルを読み書きするプロセスをだます方法はありますか(例:ファイル2.txt)?

Windowsにも同じ問題があります。

答え1

  1. 次の Unix ドメインソケットを作成できます。file.txt
  2. open()正しいファイルを開くために、ライブラリで LD_PRELOAD システムコールを実装できます。あるいは、Linuxではマウントネームスペースを使用でき、unshare場合によっては使用することもできます。mount --bind

read()どちらもLD_PRELOADを使用してライブラリを呼び出すことができますが、write()静的にリンクされた実行可能ファイルでは機能しません。ptraceこれを処理する必要がある場合はを使用する必要があります。

答え2

読んでいるファイルは簡単に変更できませんが、読んでいるファイルは簡単に変更できます。

> cat file1
123456

> cat file2
abcdef

!/bin/bash
exec 4<>file1
read -n 1 -u 4 input
echo $input
read -n 1 -u 4 input
echo $input
read -n 1 -u 4 input
echo $input
read -p "Press enter to continue" cont
read -n 1 -u 4 input
echo $input
read -n 1 -u 4 input
echo $input
read -n 1 -u 4 input
echo $input

./testscript.sh
1
2
3
Press enter to continue
d
e
f

cp file2 file1これは、スクリプトが入力を待っている間にこれを実行した結果です。必要なデータをファイルにコピーした後で名前を変更できますが、ファイルシステム内でのみ可能です。

実行中のプロセスはこのように一時停止されないため、一時停止してコピー(および名前変更)が完了した後に再起動する必要があります。

kill -STOP 12345
kill -CONT 12345

大きなファイルを小さなファイルにコピーできますが、小さいファイルを大きなファイルにコピーすると、ファイル内のファイル記述子の現在の場所によっては、不快な効果が発生する可能性があります。

関連情報