我正在尝试使用pwrite将2GB写入文件,但下面的代码写的数量较少。 但是,如果我使用1GB的2次pwrite调用总共写入2GB,那就可以了。
预期文件大小:2147483648字节(2GB),观察:2147479552
编译为:gcc -Wall test.c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_XOPEN_SOURCE=600
gcc v 4.5.0 on 64 bit Opensuse
这是完整的程序。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
size_t size = 2147483648; //2GB
off_t offset = 0;
int fd;
char *buf = (char*) malloc (size * sizeof(char));
if(buf == NULL)
{
printf("malloc error \n");
exit(-1);
}
if(-1 == (fd = open("/tmp/test.out", O_RDWR|O_CREAT, 0644)))
{
fprintf(stderr, "Error opening file. Exiting..\n");
free(buf);
exit(-1);
}
if(-1 == (pwrite(fd, buf, size, offset)))
{
perror("pwrite error");
free(buf);
exit(-1);
}
free(buf);
return 0;
}
答案 0 :(得分:5)
来自pwrite手册页:
描述
pwrite()写入从buf开始的缓冲区计数字节 偏移量偏移处的文件描述符fd。文件偏移量不是 改变。
返回值
成功时,返回写入的字节数(零 表示没有写入任何内容),或者出错时为-1,在这种情况下为errno 设置为表示错误。
请注意,pwrite()不需要写入您要求它的字节数。它可以写得更少,这不是错误。通常,你在循环中调用pwrite() - 如果它没有写入所有数据,或者如果它以errno == EINTR失败,那么你再次调用它来写入其余的数据。
答案 1 :(得分:2)
我认为你不仅要检查pwrite
是否返回-1,还要检查实际写入的字节数是多少,如果写入的字节数少于你想写的字节数,则处理大小写。有关详细信息,请参阅the pwrite manpage。