Jas*_*son 3 c macos posix osx-snow-leopard
pwrite()在尝试写入超过2GB的偏移时,我似乎在OSX 10.6.8上遇到了一个奇怪的问题.我一直在捕捉SIGXFSZ信号,这意味着已超出文件大小限制.忽略信号无济于事,因为它pwrite()会简单地返回EFBIG.
似乎OSX不支持显式open64()和pwrite64()函数.它似乎sizeof(off_t)也是一个适当的8字节大小,这意味着它pwrite()应该采用64位偏移量.是否有一个我在调用时缺少的标志open(),或者某些OSX特定的设置我应该传递给我的文件描述符fcntl()以启用大文件支持?
最后,当我检查时getrlimit(),使用该RLIMIT_FSIZE选项,它表示当前和最大文件大小限制都是9223372036854775807字节.所以这似乎并没有阻止我通过编写大文件pwrite().
有没有其他人pwrite()在64位OSX下遇到问题?
编辑:每个请求,我正在添加调用的代码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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在循环中调用它,因为我的理解pwrite()是不能保证写入所有请求的数据,因此我需要确保我请求写入的数据实际上写入磁盘,并且如果写入更少的字节,然后我正确地偏移到我写的缓冲区,以将其余的缓冲区放到磁盘上.角色data->iterations只是传递给线程信息有关将缓冲区写入磁盘的次数...这是带宽测试的一部分,所以我正在尝试编写一个大文件来查看它写入的速度有多快磁盘.唯一的问题是我无法传递大于2GB的偏移量pwrite().
在OSX int上,即使在64位系统上仍然保持32位.因此,当有符号整数翻转为负数时,您尝试以负偏移量写入.
编辑:根据手册,正确的类型off_t应该是正确的大小和签名,无论底层操作系统是32位还是64位.
| 归档时间: |
|
| 查看次数: |
379 次 |
| 最近记录: |