CreateFileMapping () – parámetros de tamaño
On febrero 10, 2021 by adminQuiero hacer un programa, que pondrá alguna oración en la memoria compartida para que otro programa reciba este mensaje. Hice eso, pero no entiendo los parámetros 4 y 5 de CreateFileMapping ().
En mi programa escribo 256 (quinto parámetro), pero cuando cambié esto a 1, el programa aún funcionaba. Pensé que debería fallar, porque supongo que dwMaximumSizeLow es el tamaño más bajo. Cuando pongo algún valor en el cuarto argumento, el programa se bloquea. Pensé que este valor debería ser mayor que el quinto, pero estaba equivocado.
Mi código:
#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; }
¿Podría explicar cómo el cuarto y el quinto parámetro de CreateFileMapping () funciona?
Comentarios
- ¿Nos estás pidiendo que busquemos Microsoft ' s documentación de esta función para usted? (esto es fácil para Google) ¿O una explicación de lo que significan ciertas partes de la documentación? (¿Podrías incluir citas de las partes exactas que no ' entender? Podría adivinar, pero ' probablemente adivinaría mal) Tampoco ' entienda cómo este fragmento de código es relevante para su pregunta si ' solo pregunta cómo funciona una única función.
- Estoy preguntando acerca de los parámetros cuarto y quinto de CreateFileMapping (), porque no ' no entiendo cómo funciona. De la documentación, pensé que dwMaximumSizeHigh es el tamaño más alto de datos en la memoria compartida y dwMaximumSizeLow es el tamaño más bajo de datos. Así que quería comprobar cómo funciona y cambié el valor en el quinto parámetro en 1 programa que todavía funcionaba. Y no ' no sé por qué, porque es el programa de menor tamaño que debería fallar.
Respuesta
La documentación explica muy bien los parámetros cuarto y quinto, dwMaximumSizeHigh
y dwMaximumSizeLow
. Sin embargo, no son el tamaño de datos más alto ni el más bajo posible, como expire. Son la parte de orden superior y la parte de orden inferior del mismo, cada una de las cuales es una parte de 32 bits del tamaño de 64 bits:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Entonces, si pones 256 en ambos valores, su memoria compartida será 256 * 4294967295 + 256 = 1 099 511 627 776 bytes. Serán 1099 GB. ¿Está seguro de que tiene la capacidad para eso?
¿Por qué no se bloquea si el tamaño de la memoria compartida es ¿demasiado pequeño?
Cuando reduce el tamaño a 1 y escribe más bytes en la memoria compartida, potencialmente daña la memoria. Podría pasar desapercibido.
No se bloquea, ciertamente porque los segfaults se detectan a través del sistema de paginación, y una página típica en Windows es de 4 KB. Su mensaje de ejemplo es demasiado pequeño para que el sistema de paginación note que la dirección solicitada va fuera de los límites.
Comentarios
- La documentación de Microsoft no es clara para mí, mientras que esta respuesta aclara qué son de orden superior y de orden inferior.
Deja una respuesta