Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

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

Posted on 2009-04-09
1
Medium Priority
?
375 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 2000 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

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

575 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