4

我正在使用 open(2)、pread(2) 和 pwrite(2) 进行简单的文件复制操作,如下所示(代码简化了一点)。我的问题是 ::pread(2) 函数无法返回 -1,返回 [errno=22]。请注意,源文件和目标文件都放在 SD 卡上。这个问题出现在Android 2.1(API level <=7,模拟器和真机)上,在Android 2.3(API level 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