如何在进程连续写入文件时清空文件

时间:2014-06-10 03:38:46

标签: c linux

我的方案如下:

名为a.out的程序在无限循环中不断编写“hello world”并将其输出重定向到文件名test.log。

我想清空(截断)test.log,而a.out一直在写test.log。

5 个答案:

答案 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)

我见过的成语是

> filename

还有其他一些选项here

答案 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。
  • 你说你将输出重定向到一个文件。这就是为什么我用1作为 ftruncatelseek来电
  • 中的文件说明者编号
  • 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