MMAP读写文件

时间:2012-09-30 07:08:37

标签: c mmap

我试图使用mmap读取文件然后对其进行加密,然后将加密写入输出文件。我也试图用mmap做这个,但是当我运行代码时,它告诉我由于“无效的参数”而无法取消映射。

//Open files initialy and obtain a handle to the file.
inputFile = open(inFileName, O_RDONLY, S_IREAD);
outputFile = open(outFileName, O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, S_IWRITE);

//Allocate buffers for encrption.
from = (unsigned char*)malloc(blockSize);
to = (unsigned char*)malloc(blockSize);

mmapWriteBuff = (unsigned char*)malloc(blockSize);
mmapReadBuff = (unsigned char*)malloc(blockSize);

memset(to, 0, blockSize);
memset(from, 0, blockSize);
memset(mmapWriteBuff, 0, blockSize);
memset(mmapReadBuff, 0, blockSize);

//Make sure we have permission to read the file provided.
setFilePermissions(inFileName, PERMISSION_MODE);
setFilePermissions(outFileName, PERMISSION_MODE);

if(encriptParam)
{
    printf("*Encripting file: %s *\n", inFileName);

do//Go through the entire file.
{   
    if(memParam)
    {
            currAmt = lseek(inputFile, blockSize, SEEK_SET);
        mmapReadBuff = mmap(0, blockSize, PROT_READ, MAP_SHARED, inputFile, 0);

        /*
         *This is how you encrypt an input char* buffer "from", of length "len"
         *onto output buffer "to", using key "key".  Jyst pass "iv" and "&n" as
         *shown, and don't forget to actually tell the function to BF_ENCRYPT.
         */

        BF_cfb64_encrypt(mmapReadBuff, mmapWriteBuff, blockSize, &key, iv, &n, BF_ENCRYPT);

        if(currAmt < blockSize)
        {
            writeAmt = lseek(outputFile, currAmt, SEEK_SET);
            mmapWriteBuff = mmap(0, currAmt, PROT_WRITE,  MAP_SHARED, outputFile, 0);                   
            if(errno == EINVAL)
            {
                perror("MMAP failed to start write buffer: ");

                exit(MMAP_IO_ERROR);
            }
        }
        else
        {
            writeAmt = lseek(outputFile, blockSize, SEEK_SET);
            mmapWriteBuff = mmap(0, blockSize, PROT_WRITE, MAP_SHARED, outputFile, 0);                  
            if(errno == EINVAL)
            {
                perror("MMAP failed to start write buffer: ");

                exit(MMAP_IO_ERROR);
            }
        }

        mmapWriteBuff = to;
    }
    else
    {
        currAmt = read(inputFile, from, blockSize);

        /*
         *This is how you encrypt an input char* buffer "from", of length "len"              *onto output buffer "to", using key "key".  Jyst pass "iv" and "n" as
         *shown, and don't forget to actually tell the function to BF_ENCRYT.
        */

        BF_cfb64_encrypt(from, to, blockSize, &key, iv, &n, BF_ENCRYPT);

        if(currAmt < blockSize)
        {
            writeAmt = write(outputFile, to, currAmt);
        }
        else
        {
            writeAmt = write(outputFile, to, blockSize);
        }
    }

    if(memParam)
    {
        //if(currAmt < blockSize)
        //{
        //  if(munmap(mmapWriteBuff, currAmt) == -1)
        //  {
        //      perror("MMAP failed to unmap itself: ");
        //      
        //      exit(MMAP_IO_ERROR);
        //  }
        //  
        //  if(munmap(mmapReadBuff, currAmt) == -1)
        //  {
        //      perror("MMAP failed to unmap itself: ");
        //      
        //      exit(MMAP_IO_ERROR);
        //  }
        //}
        //else
        //{

            if(munmap(mmapReadBuff, blockSize) == -1)
            {
                perror("MMAP Read Buffer failed to unmap itself: ");

                exit(MMAP_IO_ERROR);
            }

            if(munmap(mmapWriteBuff, blockSize) == -1)
            {
                perror("MMAP Write Buffer failed to unmap itself: ");                       
                exit(MMAP_IO_ERROR);
            }


        //}

    }

    memset(to, 0, strlen((char *)to));
    memset(from, 0, strlen((char *)from));
    memset(mmapReadBuff, 0, strlen((char*)mmapReadBuff));
    memset(mmapWriteBuff, 0, strlen((char*)mmapWriteBuff));
    }
    while(currAmt > 0);

    printf("*Saving file: %s *\n", outFileName);

}

1 个答案:

答案 0 :(得分:0)

一般来说,您可能希望尝试设置outputFile文件描述符而不使用O_WRONLY标志。 <{1}}使用O_WRONLY标志是不够的。

因此,您可能需要更改此内容:

mmap()

到此:

outputFile = open(outFileName, O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, S_IWRITE);

我不是outputFile = open(outFileName, O_APPEND | O_CREAT | O_TRUNC | O_RDWR, S_IWRITE); 的专家,但我知道您可能希望在打开文件描述符时同时赋予它读写权限。

修改 您还想尝试将每个mmap()电话投射到 mmap() ,如下所示:

(int*)