Файловый ввод-вывод Android 2.1: предварительный сбой с ошибкой 22 (EINVAL, недопустимый аргумент)

#android #android-ndk #errno #android-2.1-eclair

#Android #android-ndk #ошибка отсутствует #android-2.1-eclair

Вопрос:

Я выполняю простую операцию копирования файла, используя open (2), pread (2) и pwrite (2), как показано ниже (код немного упрощен). Моя проблема в том, что функции :: pread (2) завершаются с ошибкой, возвращающей значение -1 с [errno = 22]. Обратите внимание, что как исходные, так и целевые файлы размещены на SD-карте. Эта проблема возникает на Android 2.1 (уровень API <= 7, как для эмулятора, так и для реального устройства), без проблем при запуске на Android 2.3 (уровень API 9). Есть ли проблема в моем коде или это ошибка в kernel / stdlib?

 fileSource = ::open(pcSource, O_RDONLY);
fileDest = ::open(pcDest, O_RDWR|O_TRUNC|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO)

unsigned uiCopyLen = 0;
unsigned uiCopied = 0;
struct stat fileStatus;
fileStatus.st_size = 0;

::fstat(fileSource, amp;fileStatus);

char * cBuffer = new char[fileStatus.st_blksize];

// ... <in loop>
    ::pread(fileSource, cBuffer, fileStatus.st_blksize, uiCopied);  // errno 22, Invalid argument
    ::pwrite(fileDest, cBuffer, iLen, uiCopied);
// ... </in loop>
  

Также обратите внимание, что при использовании read (2), write (2) или переключении на streamed API (fread(3), fwrite (3)) все работает правильно. Странно.