Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当进程连续写入文件时,如何清空文件_C_Linux - Fatal编程技术网

C 当进程连续写入文件时,如何清空文件

C 当进程连续写入文件时,如何清空文件,c,linux,C,Linux,我的设想如下: 一个名为A.out的程序正在无限循环中连续写入“hello world”,并将其输出重定向到文件名test.log 我想在a.out不断写入test.log时清空(截断)test.log > filename 还有一些其他的选择。试试这个,它会有用的 #include <stdio.h> int main() { FILE * pFile; char buffer [100]; pFile = fopen ("myfile.txt" ,

我的设想如下:

一个名为A.out的程序正在无限循环中连续写入“hello world”,并将其输出重定向到文件名test.log


我想在a.out不断写入test.log时清空(截断)test.log

> filename

还有一些其他的选择。

试试这个,它会有用的

#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;
}

如果程序一直打开
test.log
文件,这是不容易做到的。无论其他进程在做什么,该进程都有一个开放的文件描述符

你可以尝试在其他程序中执行一些操作


你应该考虑使用设备。

< P>这是很容易的。使用此命令清空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作为
    ftruncate
    lseek
    调用中文件描述符的编号
  • ftruncate-将文件截断为指定长度
  • lseek-重新定位读/写文件偏移量
这是一个命令
seq 1 100000000>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

如果不停止程序,则无法停止您描述的重新填充文件的程序。您可以
kill-STOP$(pgrep yourprogram)
(以及
kill-CONT
稍后)或直接将其吹走

要截断文件

$truncate-ssizefile

其中,
size
是与当前大小相当接近的任何东西。HFS+显然不会进行稀疏分配,但其他一切都可以

(编辑2:如果您愿意尝试,使用
dd
进行一点测试,说明指定
-s0
可能很有效)

要查看实际用于存储文件的空间,
du-h
file
ls
将报告其外观大小


(编辑:就创建稀疏文件这一主题理清了我的思路)

echo”“>test.log
?我已经尝试过了,但是test.log的大小一直在增加。您是否在编写“Hello world”后关闭了文件描述符?我尝试了所有方法,但文件大小不断增加,与OP询问的结果不一样:您在循环中打开&
fclose
-ing。OP的另一个程序可能是
fopen
-ing一次。
$ 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