我的方案如下:
名为a.out的程序在无限循环中不断编写“hello world”并将其输出重定向到文件名test.log。
我想清空(截断)test.log,而a.out一直在写test.log。
答案 0 :(得分:2)
您无法在不停止程序的情况下停止您描述的重新填充文件的程序。您可以kill -STOP $(pgrep yourprogram)
(稍后再kill -CONT
)或者直接将其吹走。
要截断文件,
$ truncate -ssize file
其中size
是合理接近其当前大小的任何内容。 HFS +显然不会做稀疏分配,但其他一切都是现代的。
(编辑2:使用dd
进行一些测试表示,如果您倾向于尝试,则指定-s0
可能会有效。
要查看实际用于存储文件的空间,du -h
file
。 ls
会报告其明显的大小。
(编辑:the Arch wiki entry让我理解创建稀疏文件的主题)
答案 1 :(得分:0)
答案 2 :(得分:0)
试试这个,它应该可行
#include <stdio.h>
int main()
{
FILE * pFile;
char buffer [100];
pFile = fopen ("myfile.txt" , "w");
if (pFile == NULL)
perror ("Error opening file");
else
fclose (pFile);
while(1) {
pFile = fopen ("myfile.txt" , "a");
fputs("Hello World\n", pFile);
fclose (pFile);
}
return 0;
}
要清除文件,您可以使用
$echo a > myfile.txt
答案 3 :(得分:0)
如果程序保持打开test.log
文件,则不容易实现。无论其他进程在做什么,该进程都有一个打开的文件描述符。
您可以尝试在其他程序中执行一些ftruncate(2)。
您应该考虑使用syslog(3)设施。
答案 4 :(得分:0)
这很容易。使用此命令清空test.log:
gdb -batch-silent -p `pidof a.out` -ex "call ftruncate(1,0)" -ex "call lseek(1,0,0)"
一些解释:
pidof a.out
会返回您a.out
进程的PID。ftruncate
和lseek
来电这是命令seq 1 1000000000 > seq.txt
的示例:
$ ls -l seq.txt && gdb -batch-silent -p `pidof seq` -ex "call (void)ftruncate(1,0)" -ex "call lseek(1,0,0)" && ls -l seq.txt
-rw-r--r-- 1 user unix_users 706019328 Jun 10 09:58 seq.txt
-rw-r--r-- 1 user unix_users 65536 Jun 10 09:58 seq.txt