As part of an application we're developing, we use CreateFileMapping/MapViewOfFile to be able to share information among processes. I noticed today that if I try to reference the map immediately after calling fork() but before calling exec, that my application will crash.
I should be able to resolve this in my app but I was just curious if this was unexpected behavior or not. I've attached my cygcheck.out and will include some test code at the end. ###################### [EMAIL PROTECTED] ~ $ gcc -Wall parent_test.cpp -o parent_test [EMAIL PROTECTED] ~ $ ./parent_test.exe Dumping map in parent --> length = 11 --> name = test-string Dumping map in child 17 [main] parent_test 2460 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack) [EMAIL PROTECTED] ~ $ ###################### Sean ############################## parent.cpp ############################## #include <stdio.h> #include <unistd.h> #include <windows.h> #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; }
cygcheck.out
Description: Binary data
-- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/