CreateFileMapping/MapViewOfFile and fork
Sean Daley
spdaley@gmail.com
Wed Mar 7 03:14:00 GMT 2007
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.
######################
sdaley@sdaley2 ~
$ gcc -Wall parent_test.cpp -o parent_test
sdaley@sdaley2 ~
$ ./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)
sdaley@sdaley2 ~
$
######################
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;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cygcheck.out
Type: application/octet-stream
Size: 21561 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20070307/90da7f1b/attachment.obj>
-------------- next part --------------
--
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/
More information about the Cygwin
mailing list