Кажется, у меня странная проблема с 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()
.