#include #include #include #define BUF_SIZE 1024 void *view; HANDLE hFileMapping; typedef struct usrInfo { int usrlen; unsigned char data[1]; } usrInfo; static void* create_file_map(); static void dump_file_map(); int main(int argc, char **argv) { void *shmp = create_file_map(); if (shmp == NULL) { fprintf(stderr, "shmp == NULL\n"); exit(1); } usrInfo *usr = (usrInfo*)shmp; usr->usrlen = strlen("test-string"); unsigned char *p = usr->data; memcpy(p, "test-string", usr->usrlen); p[usr->usrlen] = '\0'; printf("Dumping map in parent\n"); dump_file_map(); if (fork() == 0) { //const char *args[2]; //args[0] = "child_test"; //args[1] = NULL; //execvp("./child_test", (char **)args); //printf("execvp failed\n"); printf("Dumping map in child\n"); dump_file_map(); exit(1); } sleep(5); UnmapViewOfFile(view); CloseHandle(hFileMapping); return 0; } static void dump_file_map() { usrInfo *usr = (usrInfo*)view; if (usr != NULL) { printf(" --> length = %d\n", usr->usrlen); printf(" --> name = %s\n", usr->data); } } static void * create_file_map() { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, BUF_SIZE, "TEST-PAGE"); if (hFileMapping == 0) { fprintf(stderr, "CreateFileMapping failed\n"); return NULL; } view = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); return view; }