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

时间:2011-11-30 16:50:03

标签: c macos osx-snow-leopard posix

在尝试写入超过2GB的偏移时,我似乎在OSX 10.6.8上遇到pwrite()的奇怪问题。我一直在捕捉SIGXFSZ信号,这意味着已超出文件大小限制。忽略该信号无济于事,因为pwrite()将只返回EFBIG

似乎OSX不支持显式open64()pwrite64()函数。似乎sizeof(off_t)的大小恰当为8字节,这意味着pwrite()应该采用64位偏移量。调用open()时是否缺少一个标志,或者某些特定于OSX的设置我应该将我的文件描述符传递给fcntl()以启用大文件支持?

最后,当我使用getrlimit()选项检查RLIMIT_FSIZE时,它表示当前和最大文件大小限制都是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()

1 个答案:

答案 0 :(得分:8)

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

编辑:根据手册,正确的类型是off_t,无论基础操作系统是32位还是64位,都应该具有正确的大小和签名。