OSX 10.6上的pwrite()不支持64位偏移

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().

Som*_*ude 8

在OSX int上,即使在64位系统上仍然保持32位.因此,当有符号整数翻转为负数时,您尝试以负偏移量写入.

编辑:根据手册,正确的类型off_t应该是正确的大小和签名,无论底层操作系统是32位还是64位.

  • 顺便说一句,如果你提到变量`offset`应该有'off_t`类型,这个答案会更好. (3认同)