如何将进程的文件 I/O 操作重定向到内存或不同的文件?

如何将进程的文件 I/O 操作重定向到内存或不同的文件?

假设我有一个名为文件.txt和一个跑步处理与PID 12345有时读取该文件,有时写入该文件。

  1. 有什么办法可以欺骗这个过程吗PID 12345每次尝试读取或写入时读取或写入内存(由另一个进程分配)文件.txt

  2. 有什么方法可以欺骗进程来读取和写入不同的文件(例如文件2.txt)?

Windows 也有同样的问题。

答案1

  1. 您可以创建一个名为的unix域套接字file.txt
  2. 您可以 LD_PRELOAD 实现系统调用的库,open()以便它将打开正确的文件,或者在 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

您可以将较大的文件复制到较小的文件中,但将较小的文件复制到较大的文件中可能会导致不愉快的效果,具体取决于文件描述符在文件中的当前位置。

相关内容