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

标签 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() 时是否缺少一个标志,或者我应该将我的文件描述符传递给 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/

相关文章:

c - mkfifo() 未在 C 中创建文件

c - 使用 fgets() 和 strtok() 以逗号分隔符读取文件

macos - 在 OS X 上部署独立的 GUI Perl 应用程序

java - 如何在 Mac 上设置 Logback?

macos - 使用 cocoa 检测挂起的系统关闭

objective-c - Xcode 4.2 Snowleopard Master-Detail 应用程序故障排除

ruby-on-rails - 雪豹+ cucumber /webrat/rspec

c++ - 最简单的 QT TCP 客户端

c - 通过引用传递结构? [C]

objective-c - 如何移除或获取SpriteKit中某个节点的位置?