我可以将进程的输出重定向到文件
./prog > a.txt
但是如果我删除了a.txt并且没有重新启动prog,那么没有更多的输出将进入a.txt。如果我使用append-redirect>>。
,情况也是如此有没有办法让我的重定向在prog的运行时被删除时重新创建文件?
重定向是我认为的操作系统的一部分,而不是编程。所以也许有一些工具或设置。
谢谢!
答案 0 :(得分:3)
在操作系统级别,文件由许多组件组成:
所有这些都是相关的,操作系统会保留预订。
如果您在另一个应用程序打开文件时删除该文件(重定向操作符>
将其保持打开状态直到./prog
完成),则只会从目录中删除该名称。拼图的其他部分仍然存在,并且它们一直工作,直到保持文件打开的最后一个应用程序关闭它。这是在存储介质上丢弃文件内容的时候。
如果删除文件,当./prog
继续运行并生成输出时,文件会增长并占用存储介质上的空间,但由于无法访问它,因此无法再次打开。只有删除它时已经打开的程序仍然可以访问该文件,直到它们关闭它为止。
即使您重新创建文件,它也是一个与删除文件同名的不同文件。 ./prog
不受影响,其输出将转到旧的已删除文件。
当重定向其输出时,除了重新启动./prog
之外,当删除a.txt
时,无法说服它将其输出存储在不同的文件中。
如果./prog
将自己写入a.txt
(它们都需要更改./prog
的代码),有几种方法可以实现这一点。
答案 1 :(得分:1)
删除原始文件后,您可以使用gdb
将程序的输出重定向到文件。
请参阅此post。
对于以后的参考,我给出了帖子的唯一摘录:
/proc/<pid>/fd
查找由进程打开的文件。gdb
。gdb
会话关闭已删除文件的文件描述符。gdb
调用将程序输出重定向到另一个文件。示例
假设程序的PID为19080,删除文件的文件描述符为2。
gdb attach 19080
ls -l /proc/19080/fd
gdb> p close(2)
$1 = 0
gdb> p fopen("/tmp/file", "w")
$2 = 20746416
(gdb) p fileno($2)
$3 = 7
gdb> quit
N.B。::如果需要已删除文件的数据,请在关闭文件句柄之前恢复已删除的文本文件:
cp -pv /proc/19080/fd/2 recovered_file.txt