Solved

How can I tell when a second process has accessed shared memory?

Posted on 2009-04-09
1
346 Views
Last Modified: 2013-12-03
Hello all,

I have a simple c++ program running in windows that creates a file mapping object, etc. to share some memory with a second process. How can I tell when some process has accessed the shared memory? Please see my code.
#define BUF_SIZE	256	
 
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <windows.h>
#include <conio.h>
#include <tchar.h>
#include <memory.h>
 
char szName[] = "Global\\MyFileMappingObject";
char message[] = "This will be shared";
 
int main()
{
	HANDLE hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		BUF_SIZE,
		szName);
 
	LPCTSTR pBuf = (LPTSTR)MapViewOfFile(
		hMapFile,
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		BUF_SIZE);
 
	CopyMemory((PVOID)pBuf, message, (strlen(message) * sizeof(TCHAR)));
 
	getch();
 
	UnmapViewOfFile(pBuf);
	CloseHandle(hMapFile);
	return 0;
}

Open in new window

0
Comment
Question by:ehensens
1 Comment
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
ID: 24107788
You only can tell that for sure when both processes signal these events to each other. See also http://www.codeproject.com/KB/threads/sharedmemipc.aspx ("Interprocess Communication using Shared Memory"). E.g.
#include <sys/types.h>
#include <windows.h>
#include <conio.h>
#include <tchar.h>
#include <memory.h>
 
char szName[] = "Global\\MyFileMappingObject";
char message[] = "This will be shared";
 
 
HANDLE ConnectEvent ( LPCTSTR pszName)
{
 
   HANDLE hEvent   =   CreateEvent (   NULL,
                                       FALSE,
                                       FALSE,
                                       pszName
                                   );
 
   if  (   INVALID_HANDLE_VALUE    ==  hEvent)
       {
           if  (   ERROR_ALREADY_EXISTS    ==  GetLastError    ())
               {
                   hEvent  =   OpenEvent   (   SYNCHRONIZE,
                                               FALSE,
                                               pszName
                                           );
 
                   if  (   INVALID_HANDLE_VALUE    ==  hEvent)
                       {
 
                           return NULL;
                       }
               }
       }
 
   return hEvent;
}
 
int main()
{
        HANDLE hMapFile = CreateFileMapping(
                INVALID_HANDLE_VALUE,
                NULL,
                PAGE_READWRITE,
                0,
                BUF_SIZE,
                szName);
 
        LPCTSTR pBuf = (LPTSTR)MapViewOfFile(
                hMapFile,
                FILE_MAP_ALL_ACCESS,
                0,
                0,
                BUF_SIZE);
 
        HANDLE hEvent = ConnectEvent("Global\\MyFileMappingEvent");
 
        CopyMemory((PVOID)pBuf, message, (strlen(message) * sizeof(TCHAR)));
 
        // Signal to other process that data was set
        SetEvent(hEvent);
 
        getch();
 
        UnmapViewOfFile(pBuf);
        CloseHandle(hMapFile);
        return 0;
}
 
// other process
 
// ...
 
        HANDLE hEvent = ConnectEvent("Global\\MyFileMappingEvent");
 
        // Wait for other process to signal that data has been copied
        WaitForSingleObject(hEvent,INFINITE);
 
        // Process data
 
        // ...

Open in new window

0

Featured Post

Salesforce Made Easy to Use

On-screen guidance at the moment of need enables you & your employees to focus on the core, you can now boost your adoption rates swiftly and simply with one easy tool.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

A theme is a collection of property settings that allow you to define the look of pages and controls, and then apply the look consistently across pages in an application. Themes can be made up of a set of elements: skins, style sheets, images, and o…
Entering time in Microsoft Access can be difficult. An input mask often bothers users more than helping them and won't catch all typing errors. This article shows how to create a textbox for 24-hour time input with full validation politely catching …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question