C 当进程连续写入文件时,如何清空文件
我的设想如下: 一个名为A.out的程序正在无限循环中连续写入“hello world”,并将其输出重定向到文件名test.logC 当进程连续写入文件时,如何清空文件,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不断写入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
进程的PIDa.out
- 您说过您已将输出重定向到一个文件。这就是为什么我使用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