仅仅因为您正在寻找文件的开头并不意味着文件被截断。可以对文件进行随机写入。
在完整的文件系统上写下一个块会导致问题。如果您想截断文件,请使用 truncate(2) 或 ftruncate 在 lseek 之前调用文件
试试:
if(errno == ENOSPC) {
ftruncate(gi4LogFd, 0);
lseek(gi4LogFd, 0, SEEK_SET);
break;
}
好的,因此具有日志支持的 ext3 文件系统不会在完整的 fs 上产生问题:
设置:
创建图像文件:
dd if=/dev/zero of=/tmp/img.dsk count=8192
在 4k 图像文件上创建了 ext3 文件系统:
mkfs.ext3 /tmp/img.dsk
sudo mount /tmp/img.dsk /mnt/internal
sudo chown masud.users /mnt/internal
touch /mnt/internal/file.bin
sudo dd if=/dev/urandom of=/mnt/internal/file.bin
这里 sudo 是 dd 所必需的,以确保超级用户的预留已填满。
现在:
df /mnt/internal/ 显示:
/dev/loop/0 3963 3963 0 100% /mnt/internal
使用以下代码:
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
char buf[8192];
int main(int argc, char *argv[])
{
int rv;
char *filename;
if ( argc < 2 ) {
fprintf(stderr, "provide the filename\n");
return -1;
}
filename = argv[1];
int rd = open("/dev/urandom", O_RDONLY);
read(rd, buf, sizeof(buf));
close(rd);
int fd = open(filename, O_SYNC|O_RDWR);
lseek(fd, -sizeof(buf), SEEK_END);
rv = write(fd, buf, sizeof(buf));
if ( rv < 0 ) {
perror(filename);
goto out;
}
lseek(fd, 0, SEEK_SET);
rv = write(fd, "foo", 3);
if ( rv < 0 ) {
perror(filename);
}
out:
close(fd);
return rv;
}
现在:
./foo /mnt/internal/file.bin
成功了。
所以问题是这与您的环境有何不同?