当尝试写入超过 2GB 的偏移量时,我似乎遇到了 OSX 10.6.8 上 pwrite()
的奇怪问题。我不断捕捉到 SIGXFSZ
信号,这意味着已超过文件大小限制。忽略信号没有帮助,因为 pwrite()
将简单地返回 EFBIG
。
OSX 似乎不支持显式的open64()
和pwrite64()
函数。 sizeof(off_t)
似乎也是一个合适的 8 字节大小,这意味着 pwrite()
应该采用 64 位偏移量。调用 open()
时是否缺少一个标志,或者我应该将我的文件描述符传递给 fcntl()
以启用大的一些特定于 OSX 的设置-文件支持?
最后,当我使用 RLIMIT_FSIZE
选项检查 getrlimit()
时,它表示当前和最大文件大小限制都是 9223372036854775807
字节。所以这似乎并没有阻止我通过 pwrite()
写入大文件。
有没有其他人在 64 位 OSX 下遇到过 pwrite()
的问题?
编辑: 根据请求,我正在添加调用 pwrite()
的代码...请注意,此代码位于写入线程中:
for (int i=0; i < data->iterations; i++)
{
unsigned char* ptr = data->buffer;
int temp_buff_size = data->buff_size;
int offset = i * data->buff_size;
while(temp_buff_size > 0)
{
int temp_bytes_written = pwrite(data->fd, ptr, temp_buff_size, offset);
if (temp_bytes_written >= 0)
{
temp_buff_size -= temp_bytes_written;
ptr += temp_bytes_written;
offset += temp_bytes_written;
}
else if (errno == EINTR)
{
continue;
}
else
{
perror("Write thread exiting");
write_thread_finished = 1;
return (void*)-1;
}
}
}
我在循环中调用它,因为据我所知,pwrite()
不能保证写入所有请求的数据,因此我需要确保我请求的数据是写入实际上是写入磁盘,如果写入的字节较少,那么我会适本地偏移到我正在写入的缓冲区中,以便将缓冲区的其余部分放到磁盘上。 data->iterations
的作用只是将有关将缓冲区写入磁盘的次数的信息传递给线程......这是带宽测试的一部分,所以我正在尝试编写一个大文件以查看将其写入磁盘的速度。唯一的问题是我无法将大于 2GB 的偏移量传递给 pwrite()
。
最佳答案
在 OSX 上,即使在 64 位系统上,int
仍然保持在 32 位。因此,当有符号整数翻转为负数时,您尝试以负偏移量写入。
编辑:根据手册,正确的类型是off_t
,无论底层操作系统是 32 位还是 64 位,它都应该具有正确的大小和符号。
关于c - OSX 10.6 上的 pwrite() 不支持 64 位偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8329719/