pwrite () в OSX 10.6 не учитывает 64-битные смещения - PullRequest
3 голосов
/ 30 ноября 2011

Кажется, у меня странная проблема с pwrite() в OSX 10.6.8 при попытке записи со смещением свыше 2 ГБ.Я продолжаю ловить сигнал 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;
        }
    }
}

Я вызываю его внутрицикл, так как я понимаю, что pwrite() не гарантирует запись всех запрошенных данных, и поэтому мне нужно убедиться, что данные, которые я запрашиваю, будут записаны на диск, и если записано меньше байтов, то яправильно смещено в буфер, который я пишу, чтобы получить оставшуюся часть буфера на диск.Роль data->iterations состоит в том, чтобы просто передавать потоку информацию о том, сколько раз записывать буфер на диск ... это часть теста пропускной способности, поэтому я пытаюсь написать большой файл, чтобы увидеть, насколько быстро он можетзаписать на диск.Единственная проблема в том, что я не могу передать смещение больше 2 ГБ в pwrite().

1 Ответ

8 голосов
/ 30 ноября 2011

В OSX int по-прежнему поддерживается на 32 битах даже в 64-битных системах.Поэтому, когда целое число со знаком переходит на отрицательное, вы пытаетесь записать с отрицательным смещением.

Редактировать: Правильный тип, согласно руководству, off_t, который долженправильный размер и подпись, независимо от того, является ли базовая ОС 32 или 64 битами.

...