C ++ Mincore返回向量每个字节为1

时间:2018-12-14 07:47:23

标签: c++ mmap

我使用mincore通过在内存或磁盘中打开mmap来判断内存。但返回一个设定的向量。为什么?实际上,结果必须是一个完全清楚的向量,但是我已经全部设置好了。

这是我的代码。为什么总是跳过第28行(cout << "find" << endl;)?

/proc/pid/smap可以看到RSS为0,但是mincore返回内存中的总文件。

#include <iostream>
#include <unistd.h>
#include <sys/mman.h>
#include <bitset>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>

using namespace std;

int main()
{
    char* pData1 = NULL;
    int fd1 = open("test_large_file_1", O_RDWR);
    if (fd1 == -1)
    {
        cout << "file error ..." << endl;
        return -1;
    }
    off_t size1 = lseek(fd1, 0, SEEK_END);
    if (size1 == -1)
    {
        cout << "lseek error ..." << endl;
        return -1;
    }
    pData1 = (char *)mmap(NULL, size1, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd1, 0 );
    if (pData1 == MAP_FAILED)
    {
        cout << "mmap error ..." << endl;
        return -1;
    }
    unsigned char *pVec = new unsigned char[size1 / 1024 / 4];
    if (-1 == mincore(pData1, size1, pVec))
    {
        cout << "mincore error ..." << endl;
        return -1;
    }
    for (int i = 0; i < size1 / 1024/ 4; ++i)
    {
        if (i % 1000 == 0)
            cout << (int)pVec[i] << endl;
        if ((pVec[i] & 1) == 0)
        {
            cout << "find" << endl;
            break;
        }
    }
    close(fd1);
    munmap((void *)pData1, size1);
    return 0;
}

我想知道是否通过mmap在内存中打开一个地址,退伍军人有某种方法吗?/ 我需要帮助。

1 个答案:

答案 0 :(得分:0)

我得到一个旧文件(不会长时间打开),mincore返回一个正常向量(具有0和1),但是一个新文件(刚刚打开或正在读取...),mincore返回一个全部置位的位向量。 这种现象是由于页面缓存所致,它将最近保存的页面保存到缓存中,如果程序重复打开文件,文件的页面将进入内存。