我在尝试使用
看起来OSX不支持显式的
最后,当我使用
在64位的OSX下,还有其他人遇到过
编辑:根据要求,我添加了调用
pwrite()
写入超过2GB偏移量的内容时,在OSX 10.6.8上遇到了一个奇怪的问题。我一直捕获到一个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
的作用只是向线程传递有关要将缓冲区写入磁盘多少次的信息...这是带宽测试的一部分,因此我正在尝试写入一个大文件,以了解它能够被写入磁盘的速度有多快。唯一的问题是,我无法向 pwrite()
传递大于2GB的偏移量。
pwrite
的代码呢? - Gabeint
仍然保持在32位吗?所以当有符号整数溢出为负数时,你尝试在负偏移处写入? - Some programmer dudepwrite
的签名所示,您应该使用size_t
来表示大小,使用off_t
来表示偏移量。 - user7116