CreateFileMapping () - parametri di dimensioni

1

Voglio creare un programma, che metterà un po 'di frase nella memoria condivisa, così un altro programma riceverà questo massaggio. L'ho fatto, ma non capisco il 4 ° e il 5 ° parametro di CreateFileMapping ().

Nel mio programma scrivo 256 (5 ° parametro), ma quando ho cambiato questo in 1, il programma ha funzionato ancora. Ho pensato che dovesse andare in crash, perché presumo dwMaximumSizeLow è la dimensione più bassa. Quando inserisco qualche valore nel 4 ° argomento, il programma si blocca. Ho pensato che questo valore dovrebbe essere superiore al 5 °, ma ho sbagliato.

Il mio codice:

#include <iostream>
#include <Windows.h>

const char name[256] = "Map1";
const char massage[256] = "Welcome in the world without rules";


int main()
{
    using std::cout;
    using std::cin;
    using std::endl;

    HANDLE  hMap;

    hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, (LPCTSTR)name);

    if (!hMap)
    {
        cout << "create error" << endl;
        return 1;
    }

    char * data = (char*) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL,NULL);

    if (!data)
    {
        cout << "mapview error" << endl;
        return 1;
    }


    if (!(CopyMemory(data, massage, sizeof(char) * 256)) )
    {
        cout << "copy error" << endl;
    }

    cin.get();

    UnmapViewOfFile(hMap);
    CloseHandle(hMap);


    return 0;
}

Potresti spiegare come funzionano il 4 ° e il 5 ° parametro di CreateFileMapping ()?

    
posta diego9403 20.04.2016 - 22:29
fonte

1 risposta

2

La documentazione spiega molto bene il 4 ° e il 5 ° parametro, dwMaximumSizeHigh e dwMaximumSizeLow . Tuttavia, non sono la dimensione più alta e la dimensione più bassa possibile dei dati, come si è esposti. Sono l'ordine elevato e la parte di ordine basso della stessa, ognuno dei quali è una parte a 32 bit della dimensione a 64 bit:

+--------+--------+--------+--------+--------+--------+--------+--------+
!        dwMaximumSizeHigh          !            dwMaximumSizeLow       !
+--------+--------+--------+--------+--------+--------+--------+--------+

Quindi se inserisci 256 in entrambi questi valori, la tua memoria condivisa sarà 256 * 4294967295 + 256 = 1 099 511 627 776 byte! Saranno 1099 GB. Sei sicuro di avere la capacità per questo?

Perché non si blocca se la dimensione della memoria condivisa è troppo piccola?

Quando riduci la dimensione a 1 e scrivi più byte nella memoria condivisa, puoi potenzialmente danneggiare la memoria. Potrebbe rimanere inosservato.

Non si blocca, certamente perché i segfault sono rilevati tramite il sistema di paging e una pagina tipica su Windows è 4Kb. Il tuo messaggio di esempio è troppo piccolo per il sistema di paging per notare che l'indirizzo richiesto va oltre i limiti.

    
risposta data 20.04.2016 - 23:51
fonte

Leggi altre domande sui tag