4

以下に示すように、open(2)、pread(2)、および pwrite(2) を使用して単純なファイル コピー操作を行っています (コードは少し簡略化されています)。私の問題は、::pread(2) 関数が [errno=22] で -1 を返さないことです。ソース ファイルと宛先ファイルの両方が SD カードに配置されることに注意してください。この問題は Android 2.1 (API レベル <=7、エミュレーターと実機の両方) で発生しますが、Android 2.3 (API レベル 9) で実行する場合は問題ありません。コードに問題がありますか、それともカーネル/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, &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) を使用するか、ストリーミング API (fread(3)、fwrite(3)) に切り替えると、正しく動作することに注意してください。変。

4

0 に答える 0